Spring Boot 整合邮件发送
Spring Boot整合邮件发送功能还是比较简单的,下边我们详细看整个实现过程。
一、基础配置
首先创建好Spring Boot项目,pom.xml
中需要添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
然后在application.properties
中添加如下配置:
spring.mail.host=smtp.qq.com
spring.mail.port=465
// 发件人的邮箱
spring.mail.username=544642279@qq.com
// QQ邮箱的授权码
spring.mail.password=xxxxxxxxxxx
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
// 打开调试
spring.mail.properties.mail.debug=true
这里使用QQ邮箱发送邮件,授权码需要在自己的QQ邮箱中获取,步骤网上很多。
二、发送简单的文本邮件
@Service
public class MailService {
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String from;
public void send() {
SimpleMailMessage smm = new SimpleMailMessage();
smm.setSubject("邮件主题");
smm.setText("邮件正文\nhello spring boot");
// 发送邮箱
smm.setFrom(from);
// 发送日期
smm.setSentDate(new Date());
// 要发给的邮箱
smm.setTo("shehuandev@163.com");
// 密送的邮箱
smm.setBcc("shehuan320@163.com");
// 抄送邮箱
smm.setCc("shehuan.dev@gmail.com");
javaMailSender.send(smm);
}
}
首先需要注入JavaMailSender
对象,Spring Boot已经帮我们创建好了,它是发送邮件的核心类。然后就是SimpleMailMessage
类,同它来完成邮件信息的配置。测试结果如下:
但是SimpleMailMessage
的功能相对弱一些,不能实现更加丰富的邮件内容,所以更多的时候可以考虑使用功能更强大的MimeMessage
。
三、发送html内容和带附件的邮件
发送html内容或者带附件的邮件,可以使用MimeMessage
类,通过它创建MimeMessageHelper
来完成对应的配置:
@Service
public class MailService {
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String from;
public void send2() {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mmh = new MimeMessageHelper(mimeMessage, true);
mmh.setSubject("邮件主题");
// 设置邮件内容
mmh.setText("<html><body>邮件正文\n<img src='cid:img1'/>\n<h1>hello spring boot</h1></body></html>", true);
// 配置图片资源
mmh.addInline("img1", new File("src/main/resources/static/favicon.ico"));
mmh.setFrom(from);
// 发送日期
mmh.setSentDate(new Date());
mmh.setTo("shehuandev@163.com");
// 添加附件
mmh.addAttachment("favicon.ico", new File("src/main/resources/static/favicon.ico"));
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
其中setText()
方法的第二个参数为true
,表示发送的是html格式的内容,第一个参数则是html格式的邮件内容,cid:img1
相当于图片的占位符,需要使用addInline()
方法替换成对应的图片。
addAttachment()
是用来添加附件的,第一个参数是附件名称,第二个是具体的附件内容。
测试的结果如下:
四、邮件模板
考虑一个问题,虽然可以使用MimeMessageHelper
来配置邮件的内容为html格式,但是这样并不好维护,更好的办法可以使用邮件模板,将html和发送邮件的java代码分离开。这里分别使用Thymeleaf
和FreeMarker
来实现邮件模板的功能。
1、Thymeleaf邮件模板
先添加Thymeleaf
的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
然后编写一个简单的Thymeleaf
邮件模板notice.html
,放到resources/templates
下:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>放假通知</title>
</head>
<body>
<div>各位小伙伴们:</div><br>
<div><span th:text="${festival}"></span>即将到来,在此祝大家节日快乐!</div>
<div>根据公司安排将于<span style="color: red" th:text="${date}"></span>放假,请知悉。</div>
</body>
</html>
其中festival
、date
是模板参数,需要发送邮件时传给模板。
最后就是发送邮件的代码了,这里需要注入Thymeleaf
的模板引擎TemplateEngine
来完成模板的渲染:
@Service
public class MailService {
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String from;
@Autowired
private TemplateEngine templateEngine;
public void send3() {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mmh = new MimeMessageHelper(mimeMessage, true);
mmh.setSubject("国庆放假通知");
// 开始配置Thymeleaf邮件模板
Context context = new Context();
// 准备邮件模板参数
Map<String, Object> params = new HashMap<>();
params.put("festival", "国庆节");
params.put("date", "2020年10月1日至2020年10月8日");
// 给模板传递参数
context.setVariables(params);
// 完成模板的渲染
String process = templateEngine.process("notice.html", context);
mmh.setText(process, true);
mmh.setFrom(from);
mmh.setSentDate(new Date());
mmh.setTo("shehuandev@163.com");
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
注意Context
是Thymeleaf
对应包下的类。测试的效果如下:
2、FreeMarker邮件模板
FreeMarker
邮件模板的用法也类似,先添加对应依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
对应的邮件模板如下notice.ftlh
,同样放到resources/templates
下:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>放假通知</title>
</head>
<body>
<div>各位小伙伴们:</div><br>
<div><span>${festival}</span>即将到来,在此祝大家节日快乐!</div>
<div>根据公司安排将于<span style="color: red">${date}</span>放假,请知悉。</div>
</body>
</html>
同样的festival
、date
是模板参数。
发送邮件的代码如下,但FreeMarker
邮件模板的配置相对复杂一些,需要我们自己构建模板渲染引擎,具体的代码如下:
@Service
public class MailService {
@Autowired
private JavaMailSender javaMailSender;
@Value("${spring.mail.username}")
private String from;
public void send4() {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mmh = new MimeMessageHelper(mimeMessage, true);
mmh.setSubject("国庆放假通知");
// 开始配置FreeMarker邮件模板
Configuration configuration = new Configuration(Configuration.VERSION_2_3_30);
configuration.setClassLoaderForTemplateLoading(this.getClass().getClassLoader(), "templates");
Template template = configuration.getTemplate("notice.ftlh");
// 准备邮件模板参数
Map<String, Object> params = new HashMap<>();
params.put("festival", "国庆节");
params.put("date", "2020年10月1日至2020年10月8日");
StringWriter out = new StringWriter();
// 渲染模板到输出流
template.process(params, out);
mmh.setText(out.toString(), true);
mmh.setFrom(from);
mmh.setSentDate(new Date());
mmh.setTo("shehuandev@163.com");
javaMailSender.send(mimeMessage);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Configuration
是FreeMarker
对应包下的类,Configuration.VERSION_2_3_30
是使用的FreeMarker
的版本号。测试的效果和Thymeleaf
的一致。