学科分类
目录
Spring Boot开发

发送模板邮件

前面两个案例中,分别针对纯文本邮件和带附件及图片的复杂邮件使用进行了讲解和实现,这已经可以完成开发中通用邮件的发送任务了。但是仔细思考可以发现,前面两种邮件的实现必须每次都手动定制邮件内容,这在一些特定邮件发送任务中是相当麻烦的,例如用户注册验证邮件等,这些邮件的主体内容基本一样,主要是一些动态的用户名、验证码、激活码等有所不同,所以,针对类似这种需求,完全可以定制一些通用邮件模板进行邮件发送。下面,使用Spring Boot框架实现这种模板邮件的发送任务。

(1)添加Thymeleaf模板引擎依赖启动器

既然提到了使用定制邮件模板的方式实现通用邮件的发送,少不了需要前端模板页面的支持,这里选择Thymeleaf模板引擎定制模板邮件内容。打开项目chapter09的pom.xml文件,在该依赖文件中添加Spring Boot整合支持的Thymeleaf模板引擎依赖启动器spring-boot-starter-thymeleaf,示例代码如下。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

(2)定制模板邮件

在项目的模板页面文件夹templates中添加发送用户注册验证码的模板页面,内容如文件1所示。

文件1 emailTemplate_vercode.html

 1    <!DOCTYPE html>
 2    <html lang="zh" xmlns:th="http://www.thymeleaf.org">
 3    <head>
 1        <meta charset="UTF-8"/>
 2        <title>用户验证码</title>
 3    </head>
 4    <body>
 5        <div><span th:text="${username}">XXX</span>&nbsp;先生/女士,您好:</div>
 6        <P style="text-indent: 2em">您的新用户验证码为<span th:text="${code}" 
 7                               style="color: cornflowerblue">123456</span>,请妥善保管。</P>
 8    </body>
 9    </html>

文件1中,主要模拟给注册用户发送一个动态验证码,从内容可以看出,该模板页面上包含两个变量,分别是用户名username和验证码code,这两个变量需要后续发送过程中动态填充。

(3)定制邮件发送服务

打开邮件发送任务的业务处理类SendEmailService,在该类中编写一个发送Html模板邮件的业务方法,示例代码如下。

public void sendTemplateEmail(String to, String subject, String content) {
    MimeMessage message = mailSender.createMimeMessage();
    try {
        // 使用MimeMessageHelper帮助类,并设置multipart多部件使用为true
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);
        // 发送邮件
        mailSender.send(message);
        System.out.println("模板邮件发送成功");
    } catch (MessagingException e) {
        System.out.println("模板邮件发送失败 "+e.getMessage());
        e.printStackTrace();
    }
}

上述代码中,sendTemplateEmail()方法主要用于处理Html内容(包括Thymeleaf邮件模板)的邮件发送,在定制Html模板邮件信息时,、使用了MimeMessageHelper类对邮件信息进行封装处理。

(4)模板邮件发送效果测试

在项目测试类Chapter09ApplicationTests中添加一个方法调用前面编写的Html模板邮件发送方法测试邮件发送效果,示例代码如下。

@Autowired
private TemplateEngine templateEngine;
@Test
public void sendTemplateEmailTest() {
    String to="2127269781@qq.com";
    String subject="【模板邮件】标题";
    // 使用模板邮件定制邮件正文内容
    Context context = new Context();
    context.setVariable("username", "石头");
    context.setVariable("code", "456123");
    // 使用TemplateEngine设置要处理的模板页面
    String emailContent = templateEngine.process("emailTemplate_vercode", context);
    // 发送模板邮件
    sendEmailService.sendTemplateEmail(to,subject,emailContent);
}

上述代码中,先使用@Autowired注解引入了Thymeleaf提供的模板引擎解析器TemplateEngine,然后定制了模板邮件发送所需的参数。其中,在定制模板邮件内容时,先使用Context对象对模板邮件中的涉及的变量username和code动态赋值;然后使用模板引擎解析器的process(String template, IContext context)方法模板解析,该方法的第一个参数是要解析的Thymeleaf模板页面,第二个参数为设置页面中的动态数据。

启动单元测试方法sendTemplateEmailTest()进行效果测试,控制台会出现“模板邮件发送成功“的提示消息。与此同时,打开设置的收件人邮箱核对发送的邮件,效果如图1所示。

图1 模板邮件发送效果

从图1可以看出,指定的收件人邮箱正确接收到了定制的模板邮件,并且该模板邮件中涉及到的两个变量username和code都被动态赋值,这说明了前面编写的模板邮件业务实现成功。另外,在前面几个案例邮件发送方法业务处理中,都只是演示了一个收件人的情况,如果要演示一次指定多个收件人时,将收件人地址转为字符串类型的数组即可,例如String[] tos=new String[]{"itshitou@sohu.com","2127269781@qq.com"};。

至此,关于Spring Boot对邮件发送任务的支持已经讲解完毕了。需要注意的是,在邮件发送过程中可能会出现各种问题,例如,邮件发送过于频繁或者是多次大批量邮件的发送,可能会被邮件服务器拦截并识别为垃圾邮件,甚至是被拉入黑名单,针对这种可能出现的极端问题,需要开发者结合实际开发情况和需求相应处理,这里不再详细说明了,有兴趣的读者可以自行查阅相关资料。

点击此处
隐藏目录