2团
Published on 2024-08-15 / 8 Visits
0
0

SpringBoot 3集成邮件通知功能

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。

image-ncgz.png

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);
        }
    });
}


Comment