对于格式复杂的邮件,如果像前文一样采用字符串进行 HTML拼接,不但容易出错,而且不易维护,使用 HTML模版可以很好地解决这一问题。我们既可以使用 FreeMarker构建邮件模版,也可以使用 Thymeleaf构建邮件模版,下面通过样例进行演示。
五、使用 FreeMarker 构建邮件模版
1,添加依赖
编辑项目的pom.xml 文件,加入 FreeMarker依赖:
org.springframework.boot
spring-boot-starter-freemarker
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 作为邮件模版,内容如下:
用户名 | ${username} |
用户性别 | ${sex} |
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依赖:
org.springframework.boot
spring-boot-starter-thymeleaf
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,内容如下:
邮件用户名 | |
用户性别 |
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 地址发送一个邮件,可以发现目标邮箱可以成功收到邮件。