人工智能
411
为了更容易更规范维护邮件内容,我们推荐使用模板引擎技术。常用的模板引擎有这几种Thymeleaf、FreeMarker、Velocity等。我们在这里就使用前面两种来实现发送邮件。
一、使用Thymeleaf模板技术发送邮件
Thymeleaf是SpringBoot推荐的官方模板引擎技术,使用非常的简单方便。
(1)添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
(2)编写实现代码
编写发送邮件接口。
import com.example.demo.entity.Member; import com.example.demo.service.MailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import java.util.Arrays; import java.util.List; @RestController public class MailController { private final static String FROM_MAIL = "2333@163.com"; private final static String TO_MAIL = "123@qq.com"; @Autowired MailService mailService; @Autowired TemplateEngine templateEngine; @GetMapping("/sendTemplate") public String sendTemplate(){ //渲染模版 Member member1 = new Member().setName("张飞").setSex("男").setEmail("123@qq.com"); Member member2 = new Member().setName("孙尚香").setSex("女").setEmail("222@qq.com"); Member member3 = new Member().setName("曹操").setSex("男").setEmail("666@qq.com"); List<Member> memberList = Arrays.asList(member1, member2, member3); //通过Context构造模版中变量需要的值 Context ctx = new Context(); ctx.setVariable("memberList", memberList); //使用TemplateEngine对模版进行渲染 String mail = templateEngine.process("mail.html", ctx); //发送邮箱 mailService.sendTemplate(FROM_MAIL, TO_MAIL, "邮件的标题", mail); return "发送成功"; } }
编写发送邮件服务
public interface MailService { void sendTemplate(String from, String to, String subject, String content); } import com.example.demo.service.MailService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; @Service @Slf4j public class MailServiceImpl implements MailService { @Autowired JavaMailSender javaMailSender; /** * 发送html模板邮件 * @param from 邮件发送者 * @param to 收件人 * @param subject 邮件主题 * @param content html格式的邮件内容 */ @Override public void sendTemplate(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("发送失败"); } } }
编写测试数据实体
import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) public class Member { private String name; private String sex; private String email; }
(3)创建邮件模板
Thymeleaf模版默认位置是resources/templates,我们在该目录下创建一个邮件模版 mail.html。
代码如下:
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>邮件模板</title> <style type="text/css"> ul li { list-style: none; height: 35px; line-height:35px; } </style> </head> <body> <div> <h3>会员信息</h3> <ul> <li th:each="member: ${memberList}"> 姓名:[[${member.name}]] 性别:[[${member.sex}]] 邮箱:[[${member.email}]] </li> </ul> </div> </body> </html>
(4)验证结果
访问接口:http://127.0.0.1:8082/sendTemplate
二、使用FreeMarker模板技术发送邮件
(1)添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
(2)编写实现代码
编写发送邮件接口。
import com.example.demo.TestApplication; import com.example.demo.entity.Member; import com.example.demo.service.MailService; import freemarker.template.Configuration; import freemarker.template.Template; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.io.StringWriter; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController public class MailController { private final static String FROM_MAIL = "2333@163.com"; private final static String TO_MAIL = "123@qq.com"; @Autowired MailService mailService; @GetMapping("/sendTemplate") public String sendTemplate(){ try { //配置FreeMarker模版位置 Configuration configuration = new Configuration(Configuration.VERSION_2_3_0); ClassLoader loader = TestApplication.class.getClassLoader(); configuration.setClassLoaderForTemplateLoading(loader,"ftl"); //配置模版文件 Template template = configuration.getTemplate("mail.ftl"); //渲染模版 StringWriter mail = new StringWriter(); Member member1 = new Member().setName("张飞").setSex("男").setEmail("123@qq.com"); Member member2 = new Member().setName("孙尚香").setSex("女").setEmail("222@qq.com"); Member member3 = new Member().setName("曹操").setSex("男").setEmail("666@qq.com"); List<Member> memberList = Arrays.asList(member1, member2, member3); Map<String, Object> map = new HashMap(); map.put("memberList", memberList); template.process(map, mail); //发送邮箱 mailService.sendTemplate(FROM_MAIL, TO_MAIL, "邮件的标题", mail.toString()); } catch (Exception e) { e.printStackTrace(); } return "发送成功"; }
邮件服务和上面的一样,我们这边就不过多描述了。
public interface MailService { void sendTemplate(String from, String to, String subject, String content); } import com.example.demo.service.MailService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; @Service @Slf4j public class MailServiceImpl implements MailService { @Autowired JavaMailSender javaMailSender; /** * 发送html模板邮件 * @param from 邮件发送者 * @param to 收件人 * @param subject 邮件主题 * @param content html格式的邮件内容 */ @Override public void sendTemplate(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("发送失败"); } } } import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) public class Member { private String name; private String sex; private String email; }
(3)创建邮件模板
这里我们resources目录下面创建了一个ftl的文件,在该目录创建了一个mail.ftl文件。
代码如下:
<style type="text/css"> ul li { list-style: none; height: 35px; line-height:35px; } </style> <div> <h3>会员信息</h3> <ul> <#list memberList as member> <li>姓名:${member.name} 性别:${member.sex} 邮箱:${member.email}</li> </#list> </ul> </div>
(4)验证结果