1. 准备工作
最近项目需要集成邮件通知功能(使用邮件模板),因此产生了本文的探索。
首先项目需要集成以下依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<-- 使用邮件模板,需要集成此依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
其次,配置文件中添加如下配置:
spring:
thymeleaf:
cache: false
prefix: classpath:/templates/
encoding: UTF-8
suffix: .html
mode: HTML
mail:
host: smtp.qq.com
port: 587
username: 替换为自己的邮箱
password: 替换为自己邮箱的授权码
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
此处需要注意,当前项目部署于阿里云服务器,阿里云服务器默认会关停25端口,具体如下图,因此当前项目更换端口至587。
2. 邮件模板
根据上文thymeleaf配置项,于src/main/resources/templates
文件夹下添加模板文件(testTemplate.html),参考如下:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p>您好:<br><br>
您有一个新的任务需要处理,请登录<a href="http://xxxxx:443/login" target="_blank">平台</a>关注处理。<br>
任务编号:<span th:text="${taskId}"></span>。<br><br>
祝好<br>
<span th:text="${signature}"></span>
</p>
</body>
</html>
此处示例为一个简单的模板,例如"${signature}"
元素可在应用中替换为实际内容。
3. 邮件服务
3.1 依赖类说明
邮件服务类依赖于以下Bean:
EmailConfig:邮箱配置类;
JavaMailSender:邮件发送类;
SpringTemplateEngine:邮件模板解析类;
ThreadPoolTaskExecutor:应用线程池,用于提交邮件发送业务(项目并发较低,因此未自定义业务线程池)。
其中EmailConfig需自行创建,代码如下:
@Data
@Configuration
public class EmailConfig {
@Value("${spring.mail.username}")
private String emailFrom;
}
3.2 邮件模板解析
解析邮件模板,示例如下:
/**
* @param to 接收方邮箱
*/
public void sendQaAssignedEmail(String to, Integer taskId) {
Context context = new Context();
context.setVariable("taskId", taskId);
context.setVariable("signature", "业务平台");
var content = springTemplateEngine.process("testTemplate", context);
sendEmail(to, "待办事项", content);
}
此段代码,解析章节2列举的testTemplate.html
模板,并根据实际业务替换模板中的taskId
以及signature
元素。
3.3 发送邮件
因为发送邮件是比较消耗时间的业务,因此将发送任务提交至线程池中执行,具体代码如下所示:
/**
* @param to 接受方邮箱
* @param subject 邮件主题
* @param htmlContent 邮件内容模板
*/
public void sendEmail(String to, String subject, String htmlContent) {
threadPoolTaskExecutor.execute(() -> {
log.info("Send email to: {}, subject: {}, text: {}", to, subject, htmlContent);
try {
// 如果邮件是模板邮件,此处需要设置MimeMessageHelper
var message = javaMailSender.createMimeMessage();
var helper = new MimeMessageHelper(message, false, UTF_8.toString());
// 设置邮件发送方信息
helper.setFrom(emailConfig.getEmailFrom());
helper.setTo(to);
helper.setSubject(subject);
helper.setText(htmlContent, true);
// 执行发送操作
javaMailSender.send(message);
} catch (Exception e) {
log.error("发送邮件失败,主题:{}, 收件人:{}", subject, to, e);
}
});
}