当前位置: > > > SpringBoot - 使用JavaMailSender发送邮件教程3(使用HTML邮件模版)

SpringBoot - 使用JavaMailSender发送邮件教程3(使用HTML邮件模版)

    对于格式复杂的邮件,如果像前文一样采用字符串进行 HTML 拼接,不但容易出错,而且不易维护,使用 HTML 模版可以很好地解决这一问题。我们既可以使用 FreeMarker 构建邮件模版,也可以使用 Thymeleaf 构建邮件模版,下面通过样例进行演示。

五、使用 FreeMarker 构建邮件模版

1,添加依赖

编辑项目的 pom.xml 文件,加入 FreeMarker 依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

2,改造 MailService

这里对前文封装的邮件发送类 MailService 做个改造,增加一个可以发送 html 内容的方法:
@Component
public class MailService {

    // JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
    @Autowired
    JavaMailSender javaMailSender;

    // 发送带HTML内容的邮件
    // 方法4个参数分别表示:邮件发送者、收件人、邮件主题、html格式的邮件内容
    public void sendHtmlMail(String from, String to, String subject, String content){
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setTo(to);
            helper.setFrom(from);
            helper.setSubject(subject);
            helper.setText(content, true);
            javaMailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("发送失败");
        }
    }
}

3,创建邮件模版

在项目 resources 目录下创建 ftl 目录作为模版存放位置,在该目录下创建 mailtemplate.ftl 作为邮件模版,内容如下:
<div>邮箱激活</div>
<div>您的注册信息是:
    <table border="1">
        <tr>
            <td>用户名</td>
            <td>${username}</td>
        </tr>
        <tr>
            <td>用户性别</td>
            <td>${sex}</td>
        </tr>
    </table>
</div>
<div>
    <a href="http://www.hangge.com">核对无误请点击本链接激活邮箱</a>
</div>

4,创建实体类

接着创建一个简单的 User 实体类,后面会将这个实体类对象内容填充到模版中,并通过邮件发送。
@NoArgsConstructor
@Setter
@Getter
public class User  {
    private String username;
    private String sex;
}

5,开始测试

(1)首先我们创建一个 Controller 来发送邮件,这次我们通过 FreeMarker 模版渲染出邮件正文内容:
@RestController
public class HelloController {

    @Autowired
    MailService mailService;

    //
    @GetMapping("/hello")
    public void hello() {
        try {
            // 首先配置 FreeMarker 模版位置
            Configuration configuration =
                    new Configuration(Configuration.VERSION_2_3_0);
            ClassLoader loader = DemoApplication.class.getClassLoader();
            configuration
            .setClassLoaderForTemplateLoading(loader,"ftl");

            // 配置模版文件
            Template template = configuration.getTemplate("mailtemplate.ftl");

            // 结合 User 对象渲染模版
            StringWriter mail = new StringWriter();
            User user = new User();
            user.setUsername("hangge");
            user.setSex("男");
            template.process(user, mail);

            // 将渲染结果发送出去
            mailService.sendHtmlMail("123@qq.com",
                    "service@hangge.com",
                    "这个是邮件的标题",
                    mail.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(2)启动项目,访问 http://localhost:8080/hello 地址发送一个邮件,可以发现目标邮箱可以成功收到邮件。

六、使用 Thymeleaf 构建邮件模版

1,添加依赖

编辑项目的 pom.xml 文件,加入 Thymeleaf 依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2,封装邮件发送类 MailService

MailService 里的代码同上面一样,就是提供一个可以发送 html 内容的方法:
@Component
public class MailService {

    // JavaMailSender 在Mail 自动配置类 MailSenderAutoConfiguration 中已经导入,这里直接注入使用即可
    @Autowired
    JavaMailSender javaMailSender;

    // 发送带HTML内容的邮件
    // 方法4个参数分别表示:邮件发送者、收件人、邮件主题、html格式的邮件内容
    public void sendHtmlMail(String from, String to, String subject, String content){
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setTo(to);
            helper.setFrom(from);
            helper.setSubject(subject);
            helper.setText(content, true);
            javaMailSender.send(message);
        } catch (MessagingException e) {
            System.out.println("发送失败");
        }
    }
}

3,创建邮件模版

Thymeleaf 模版默认位置是 resources/templates,我们在该目录下创建一个邮件模版 mailtemplate.html,内容如下:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>邮件</title>
</head>
<body>
<div>邮箱激活</div>
<div>您的注册信息是:
    <table border="1">
        <tr>
            <td>用户名</td>
            <td th:text="${username}"></td>
        </tr>
        <tr>
            <td>用户性别</td>
            <td th:text="${sex}"></td>
        </tr>
    </table>
</div>
<div>
    <a href="http://www.hangge.com">核对无误请点击本链接激活邮箱</a>
</div>
</body>
</html>

4,开始测试 

(1)首先我们创建一个 Controller 来发送邮件,这次我们通过 Thymeleaf 模版渲染出邮件正文内容:
注意:不同于 FreeMarkerThymeleaf 提供了 TemplateEngine 来对模版进行渲染,通过 Context 构造模版中变量需要的值,这种方式比 FreeMarker 构建邮件模版更加方便。
@RestController
public class HelloController {

    @Autowired
    MailService mailService;

    @Autowired
    TemplateEngine templateEngine;
    
    @GetMapping("/hello")
    public void hello() {
        // 通过 Context 构造模版中变量需要的值
        Context ctx = new Context();
        ctx.setVariable("username", "hangge");
        ctx.setVariable("sex", "男");

        // 使用TemplateEngine 对模版进行渲染
        String mail = templateEngine.process("mailtemplate.html", ctx);

        // 将渲染结果通过邮件发出
        mailService.sendHtmlMail("380552225@qq.com",
                "yuhang0385@163.com",
                "这个是邮件的标题",
                mail);
    }
}

(2)启动项目,访问 http://localhost:8080/hello 地址发送一个邮件,可以发现目标邮箱可以成功收到邮件。
评论0