SpringBoot 使用 spring-boot-starter-mail 实现邮件发送
邮件发送是一个非常常见的功能,注册时的身份认证、重要通知发送等都会用到邮件发送。Sun公司提供了JavaMail用来实现邮件发送,但是配置烦琐,Spring 中提供了JavaMailSender 用来简化邮件配置,Spring Boot则提供了MailSenderAutoConfiguration 对邮件的发送做了进一步简化。
一、准备工作
以QQ邮箱为例,使用QQ邮箱发送邮件,首先要申请开通POP3/SMTP服务或者IMAP/SMTP服务。SMTP全称为Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件与SMTP服务器之间,以及SMTP服务器与SMTP服务器之间的通信规则。也就是说,aaa@qq.com 用户先将邮件投递到腾讯的SMTP服务器,这个过程就使用了SMTP协议,然后腾讯的SMTP服务器将邮件投递到网易的SMTP服务器,这个过程依然使用了SMTP协议,SMTP服务器就是用来接收邮件的。而POP3全称为Post Office Protocol3,译作邮局协议,它定义了邮件客户端与POP3服务器之间的通信规则。该协议在什么场景下会用到呢?当邮件到达网易的SMTP服务器之后,111@163.com 用户需要登录服务器查看邮件,这个时候就用上该协议了:邮件服务商会为每一个用户提供专门的邮件存储空间,SMTP服务器收到邮件之后,将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的POP3邮件服务器来完成。至于IMAP协议,则是对POP3协议的扩展,功能更强,作用类似。
二、发送邮件
1、环境搭建
使用Spring Boot发送邮件,环境搭建非常容易,首先在创建项目时添加邮件依赖,代码如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
项目创建成功后,在 application.properties 中完成邮件基本信息配置,代码如下:
# 配置邮件服务器的地址
spring.mail.host=smtp.qq.com
# 配置邮件服务器的端口(465或587)
spring.mail.port=465
# 配置用户的账号
spring.mail.username=123@qq.com
# 配置用户的密码(即上面我们申请到的授权码)
spring.mail.password=qgczjydhuqytabcd
# 配置默认编码
spring.mail.default-encoding=UTF-8
# SSL 连接配置
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
# 开启 debug,这样方便开发者查看邮件发送日志
spring.mail.properties.mail.debug=true
这里配置了邮件服务器的地址、端口(可以是465或者587)、用户的账号和密码以及默认编码、SSL连接配置等,最后开启debug,这样方便开发者查看邮件发送日志。
完成这些配置之后,基本的邮件发送环境就搭建成功了,接下来就可以发送邮件了。邮件从简单到复杂有多种类型,下面分别予以介绍。
2、发送简单邮件
创建一个MailService用来封装邮件的发送,代码如下:
@Component
public class MailService {
// JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
@Autowired
JavaMailSender javaMailSender;
//方法5个参数分别表示:邮件发送者、收件人、抄送人、邮件主题以及邮件内容
public void sendSimpleMail(String from, String to, String cc, String subject, String content) {
// 简单邮件直接构建一个 SimpleMailMessage 对象进行配置并发送即可
SimpleMailMessage simpMsg = new SimpleMailMessage();
simpMsg.setFrom(from);
simpMsg.setTo(to);
simpMsg.setCc(cc);
simpMsg.setSubject(subject);
simpMsg.setText(content);
javaMailSender.send(simpMsg);
}
}
代码解释:
JavaMailSender 是Spring Boot在MailSenderPropertiesConfiguration 类中配置好的,该类在Mail自动配置类MailSenderAutoConfiguration中导入,因此这里注入JavaMailSender就可以使用了。
sendSimpleMail方法的5个参数分别表示邮件发送者、收件人、抄送人、邮件主题以及邮件内容。
简单邮件可以直接构建一个SimpleMailMessage 对象进行配置,配置完成后,通过JavaMailSender将邮件发送出去。
接着我们创建一个 Controller 调用这个 Service 方法进行测试:
@RestController
public class HelloController {
@Autowired
MailService mailService;
@GetMapping("/hello")
public void hello() {
mailService.sendSimpleMail("123@QQ.com",
"1421548723@qq.com",
"123456@qq.com",
"我是邮件的标题",
"我是邮件的内容");
}
}
这里使用MimeMessageHelper简化了邮件配置,它的构造方法的第二个参数true表示构造个multipart message类型的邮件,multipart message类型的邮件包含多个正文、附件以及内嵌资源,邮件的表现形式更加丰富。最后通过addAttachment方法添加附件。
执行该方法,即可看到邮件发送成功。如图所示。
3、发送带附件的邮件
要发送一个带附件的邮件也非常容易,通过调用Attachment 方法即可添加附件,该方法调用多次即可添加多个附件。在MailService中添加如下方法:
这里使用 MimeMessageHelper 简化邮件配置,通过 MimeMessageHelper 构造一个 multipart message 类型邮件来发送,multipart message 类型邮件可以包含多个正文、附件以及内嵌资源。
@Component
public class MailService {
// JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
@Autowired
JavaMailSender javaMailSender;
// 发送带附件的邮件
// 方法5个参数分别表示:邮件发送者、收件人、邮件主题、邮件内容、以及附件
public void sendAttachFileMail(String from, String to,
String subject, String content, File file) {
try {
MimeMessage message = javaMailSender.createMimeMessage();
// 这里使用 MimeMessageHelper 简化了邮件配置
// 第二个参数true表示构造一个 multipart message 类型邮件
// multipart message类型邮件包含多个正文、附件以及内嵌资源,邮件表现形式更加丰富
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
// 最后通过 addAttachment 方法添加附件
helper.addAttachment(file.getName(), file);
javaMailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
接着我们创建一个 Controller 调用这个 Service 方法进行测试:
@RestController
public class HelloController {
@Autowired
MailService mailService;
@GetMapping("/hello")
public void hello() {
mailService.sendAttachFileMail("123@QQ.com",
"1421548723@qq.com",
"我是邮件的标题",
"我是邮件的内容",
new File("C:/Users/Administrator/Pictures/Saved Pictures/fthsrethstrywegwerrg5.jpg"));
}
}
执行该方法,即可看到邮件发送成功,如图所示。