SpringBoot - 使用JavaMailSender发送邮件教程3(使用HTML邮件模版)
对于格式复杂的邮件,如果像前文一样采用字符串进行 HTML 拼接,不但容易出错,而且不易维护,使用 HTML 模版可以很好地解决这一问题。我们既可以使用 FreeMarker 构建邮件模版,也可以使用 Thymeleaf 构建邮件模版,下面通过样例进行演示。
(2)启动项目,访问 http://localhost:8080/hello 地址发送一个邮件,可以发现目标邮箱可以成功收到邮件。
(2)启动项目,访问 http://localhost:8080/hello 地址发送一个邮件,可以发现目标邮箱可以成功收到邮件。
五、使用 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 模版渲染出邮件正文内容:
注意:不同于 FreeMarker,Thymeleaf 提供了 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 地址发送一个邮件,可以发现目标邮箱可以成功收到邮件。
