爲了更容易更規範維護郵件內容,我們推薦使用模板引擎技術。常用的模板引擎有這幾種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 = "[email protected]";
private final static String TO_MAIL = "[email protected]";
@Autowired
MailService mailService;
@Autowired
TemplateEngine templateEngine;
@GetMapping("/sendTemplate")
public String sendTemplate(){
//渲染模版
Member member1 = new Member().setName("張飛").setSex("男").setEmail("[email protected]");
Member member2 = new Member().setName("孫尚香").setSex("女").setEmail("[email protected]");
Member member3 = new Member().setName("曹操").setSex("男").setEmail("[email protected]");
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 = "[email protected]";
private final static String TO_MAIL = "[email protected]";
@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("[email protected]");
Member member2 = new Member().setName("孫尚香").setSex("女").setEmail("[email protected]");
Member member3 = new Member().setName("曹操").setSex("男").setEmail("[email protected]");
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)驗證結果