为了更容易更规范维护邮件内容,我们推荐使用模板引擎技术。常用的模板引擎有这几种Thymeleaf、FreeMarker、Velocity等。我们在这里就使用前面两种来实现发送邮件。
一、使用Thymeleaf模板技术发送邮件
Thymeleaf是SpringBoot推荐的官方模板引擎技术,使用非常的简单方便。
(1)添加依赖
1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-mail</artifactId> 4</dependency> 5 6<dependency> 7 <groupId>org.springframework.boot</groupId> 8 <artifactId>spring-boot-starter-thymeleaf</artifactId> 9</dependency>
(2)编写实现代码
编写发送邮件接口。
1import com.example.demo.entity.Member; 2import com.example.demo.service.MailService; 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.web.bind.annotation.GetMapping; 5import org.springframework.web.bind.annotation.RestController; 6import org.thymeleaf.TemplateEngine; 7import org.thymeleaf.context.Context; 8 9import java.util.Arrays; 10import java.util.List; 11 12@RestController 13public class MailController { 14 15 private final static String FROM_MAIL = "2333@163.com"; 16 private final static String TO_MAIL = "123@qq.com"; 17 18 @Autowired 19 MailService mailService; 20 21 @Autowired 22 TemplateEngine templateEngine; 23 24 @GetMapping("/sendTemplate") 25 public String sendTemplate(){ 26 //渲染模版 27 Member member1 = new Member().setName("张飞").setSex("男").setEmail("123@qq.com"); 28 Member member2 = new Member().setName("孙尚香").setSex("女").setEmail("222@qq.com"); 29 Member member3 = new Member().setName("曹操").setSex("男").setEmail("666@qq.com"); 30 List<Member> memberList = Arrays.asList(member1, member2, member3); 31 32 //通过Context构造模版中变量需要的值 33 Context ctx = new Context(); 34 ctx.setVariable("memberList", memberList); 35 //使用TemplateEngine对模版进行渲染 36 String mail = templateEngine.process("mail.html", ctx); 37 //发送邮箱 38 mailService.sendTemplate(FROM_MAIL, TO_MAIL, "邮件的标题", mail); 39 40 return "发送成功"; 41 } 42 43}
编写发送邮件服务
1public interface MailService { 2 3 void sendTemplate(String from, String to, String subject, String content); 4 5} 6 7import com.example.demo.service.MailService; 8import lombok.extern.slf4j.Slf4j; 9import org.springframework.beans.factory.annotation.Autowired; 10import org.springframework.mail.javamail.JavaMailSender; 11import org.springframework.mail.javamail.MimeMessageHelper; 12import org.springframework.stereotype.Service; 13 14import javax.mail.MessagingException; 15import javax.mail.internet.MimeMessage; 16 17@Service 18@Slf4j 19public class MailServiceImpl implements MailService { 20 21 @Autowired 22 JavaMailSender javaMailSender; 23 24 /** 25 * 发送html模板邮件 26 * @param from 邮件发送者 27 * @param to 收件人 28 * @param subject 邮件主题 29 * @param content html格式的邮件内容 30 */ 31 @Override 32 public void sendTemplate(String from, String to, String subject, String content) { 33 try { 34 MimeMessage message = javaMailSender.createMimeMessage(); 35 MimeMessageHelper helper = new MimeMessageHelper(message, true); 36 helper.setTo(to); 37 helper.setFrom(from); 38 helper.setSubject(subject); 39 helper.setText(content, true); 40 javaMailSender.send(message); 41 } catch (MessagingException e) { 42 System.out.println("发送失败"); 43 } 44 } 45}
编写测试数据实体
1import lombok.Data; 2import lombok.experimental.Accessors; 3 4@Data 5@Accessors(chain = true) 6public class Member { 7 8 private String name; 9 10 private String sex; 11 12 private String email; 13 14}
(3)创建邮件模板
Thymeleaf模版默认位置是resources/templates,我们在该目录下创建一个邮件模版 mail.html。

代码如下:
1<!DOCTYPE html> 2<html lang="en" xmlns:th="http://www.thymeleaf.org"> 3<head> 4 <meta charset="UTF-8"> 5 <title>邮件模板</title> 6 <style type="text/css"> 7 ul li { 8 list-style: none; 9 height: 35px; 10 line-height:35px; 11 } 12 </style> 13</head> 14<body> 15 <div> 16 <h3>会员信息</h3> 17 <ul> 18 <li th:each="member: ${memberList}"> 19 姓名:[[${member.name}]] 20 性别:[[${member.sex}]] 21 邮箱:[[${member.email}]] 22 </li> 23 </ul> 24 </div> 25</body> 26</html>
(4)验证结果
访问接口:http://127.0.0.1:8082/sendTemplate

二、使用FreeMarker模板技术发送邮件
(1)添加依赖
1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-mail</artifactId> 4</dependency> 5 6<dependency> 7 <groupId>org.springframework.boot</groupId> 8 <artifactId>spring-boot-starter-freemarker</artifactId> 9</dependency>
(2)编写实现代码
编写发送邮件接口。
1import com.example.demo.TestApplication; 2import com.example.demo.entity.Member; 3import com.example.demo.service.MailService; 4import freemarker.template.Configuration; 5import freemarker.template.Template; 6import org.springframework.beans.factory.annotation.Autowired; 7import org.springframework.web.bind.annotation.GetMapping; 8import org.springframework.web.bind.annotation.RestController; 9 10import java.io.StringWriter; 11import java.util.Arrays; 12import java.util.HashMap; 13import java.util.List; 14import java.util.Map; 15 16@RestController 17public class MailController { 18 19 private final static String FROM_MAIL = "2333@163.com"; 20 private final static String TO_MAIL = "123@qq.com"; 21 22 @Autowired 23 MailService mailService; 24 25 @GetMapping("/sendTemplate") 26 public String sendTemplate(){ 27 try { 28 //配置FreeMarker模版位置 29 Configuration configuration = new Configuration(Configuration.VERSION_2_3_0); 30 ClassLoader loader = TestApplication.class.getClassLoader(); 31 configuration.setClassLoaderForTemplateLoading(loader,"ftl"); 32 //配置模版文件 33 Template template = configuration.getTemplate("mail.ftl"); 34 35 //渲染模版 36 StringWriter mail = new StringWriter(); 37 Member member1 = new Member().setName("张飞").setSex("男").setEmail("123@qq.com"); 38 Member member2 = new Member().setName("孙尚香").setSex("女").setEmail("222@qq.com"); 39 Member member3 = new Member().setName("曹操").setSex("男").setEmail("666@qq.com"); 40 List<Member> memberList = Arrays.asList(member1, member2, member3); 41 Map<String, Object> map = new HashMap(); 42 map.put("memberList", memberList); 43 template.process(map, mail); 44 45 //发送邮箱 46 mailService.sendTemplate(FROM_MAIL, TO_MAIL, "邮件的标题", mail.toString()); 47 } catch (Exception e) { 48 e.printStackTrace(); 49 } 50 51 return "发送成功"; 52 }
邮件服务和上面的一样,我们这边就不过多描述了。
1public interface MailService { 2 3 void sendTemplate(String from, String to, String subject, String content); 4 5} 6 7import com.example.demo.service.MailService; 8import lombok.extern.slf4j.Slf4j; 9import org.springframework.beans.factory.annotation.Autowired; 10import org.springframework.mail.javamail.JavaMailSender; 11import org.springframework.mail.javamail.MimeMessageHelper; 12import org.springframework.stereotype.Service; 13 14import javax.mail.MessagingException; 15import javax.mail.internet.MimeMessage; 16 17@Service 18@Slf4j 19public class MailServiceImpl implements MailService { 20 21 @Autowired 22 JavaMailSender javaMailSender; 23 24 /** 25 * 发送html模板邮件 26 * @param from 邮件发送者 27 * @param to 收件人 28 * @param subject 邮件主题 29 * @param content html格式的邮件内容 30 */ 31 @Override 32 public void sendTemplate(String from, String to, String subject, String content) { 33 try { 34 MimeMessage message = javaMailSender.createMimeMessage(); 35 MimeMessageHelper helper = new MimeMessageHelper(message, true); 36 helper.setTo(to); 37 helper.setFrom(from); 38 helper.setSubject(subject); 39 helper.setText(content, true); 40 javaMailSender.send(message); 41 } catch (MessagingException e) { 42 System.out.println("发送失败"); 43 } 44 } 45} 46 47import lombok.Data; 48import lombok.experimental.Accessors; 49 50@Data 51@Accessors(chain = true) 52public class Member { 53 54 private String name; 55 56 private String sex; 57 58 private String email; 59 60}
(3)创建邮件模板
这里我们resources目录下面创建了一个ftl的文件,在该目录创建了一个mail.ftl文件。

代码如下:
1<style type="text/css"> 2 ul li { 3 list-style: none; 4 height: 35px; 5 line-height:35px; 6 } 7</style> 8<div> 9 <h3>会员信息</h3> 10 <ul> 11 <#list memberList as member> 12 <li>姓名:${member.name} 性别:${member.sex} 邮箱:${member.email}</li> 13 </#list> 14 </ul> 15</div>
(4)验证结果
访问接口:http://127.0.0.1:8082/sendTemplate
