十分钟实现发送邮件服务

发送邮件应该是网站的必备拓展功能之一,注册验证、忘记密码或者是给用户发送营销信息。

一、邮件协议

在收发邮件的过程中,需要遵守相关的协议,其中主要有:

发送电子邮件的协议:SMTP;

接收电子邮件的协议:POP3和IMAP。

1.1 什么是SMTP?

SMTP全称为Simple Mail Transfer Protocol(简单邮件传输协议),它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP认证要求必须提供账号和密码才能登陆服务器,其设计目的在于避免用户受到垃圾邮件的侵扰。

1.2 什么是IMAP?

IMAP全称为Internet Message Access Protocol(互联网邮件访问协议),IMAP允许从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似,都是一种邮件获取协议。

1.3 什么是POP3?

POP3全称为Post Office Protocol 3(邮局协议),POP3支持客户端远程管理服务器端的邮件。POP3常用于离线邮件处理,即允许客户端下载服务器邮件,然后服务器上的邮件将会被删除。目前很多POP3的邮件服务器只提供下载邮件功能,服务器本身并不删除邮件,这种属于改进版的POP3协议。

1.4 IMAP和POP3协议有什么不同呢?

两者最大的区别在于,IMAP允许双向通信,即在客户端的操作会反馈到服务器上,例如在客户端收取邮件、标记已读等操作,服务器会跟着同步这些操作。而对于POP协议虽然也允许客户端下载服务器邮件,但是在客户端的操作并不会同步到服务器上面的,例如在客户端收取或标记已读邮件,服务器不会同步这些操作。

二、初始化配置 2.1 开启邮件服务

本文仅以QQ邮箱和163邮箱为例。

QQ邮箱 开启邮件服务文档

163邮箱 开启邮件服务文档

2.2 pom.xml

正常我们会用JavaMail相关api来写发送邮件的相关代码,但现在Spring Boot提供了一套更简易使用的封装。

spring-boot-starter-mail:Spring Boot 邮件服务;

spring-boot-starter-thymeleaf:使用 Thymeleaf制作邮件模版。

<!-- test 包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--mail --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <!--使用 Thymeleaf 制作邮件模板 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>1.8.4</scope> </dependency> 2.3 application.yml

spring-boot-starter-mail 的配置由 MailProperties 配置类提供。

针对不同的邮箱的配置略有不同,以下是QQ邮箱和163邮箱的配置。

server: port: 8081 #spring: # mail: # # QQ 邮箱 https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28 # host: smtp.qq.com # # 邮箱账号 # username: van93@qq.com # # 邮箱授权码(不是密码) # password: password # default-encoding: UTF-8 # properties: # mail: # smtp: # auth: true # starttls: # enable: true # required: true spring: mail: # 163 邮箱 ?code=d7a5dc8471cd0c0e8b4b8f4f8e49998b374173cfe9171305fa1ce630d7f67ac2cda80145a1742516 host: smtp.163.com # 邮箱账号 username: 17098705205@163.com # 邮箱授权码(不是密码) password: password default-encoding: UTF-8 properties: mail: smtp: auth: true starttls: enable: true required: true 2.4 邮件信息类

来保存发送邮件时的邮件主题、邮件内容等信息

@Data public class Mail { /** * 邮件id */ private String id; /** * 邮件发送人 */ private String sender; /** * 邮件接收人 (多个邮箱则用逗号","隔开) */ private String receiver; /** * 邮件主题 */ private String subject; /** * 邮件内容 */ private String text; /** * 附件/文件地址 */ private String filePath; /** * 附件/文件名称 */ private String fileName; /** * 是否有附件(默认没有) */ private Boolean isTemplate = false; /** * 模版名称 */ private String emailTemplateName; /** * 模版内容 */ private Context emailTemplateContext; } 三、发送邮件的实现 3.1 检查输入的邮件配置

校验邮件收信人、邮件主题和邮件内容这些必填项

private void checkMail(Mail mail) { if (StringUtils.isEmpty(mail.getReceiver())) { throw new RuntimeException("邮件收信人不能为空"); } if (StringUtils.isEmpty(mail.getSubject())) { throw new RuntimeException("邮件主题不能为空"); } if (StringUtils.isEmpty(mail.getText()) && null == mail.getEmailTemplateContext()) { throw new RuntimeException("邮件内容不能为空"); } } 3.2 将邮件保存到数据库

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygpyj.html