郵件服務已是基礎性服務了 ,是網站的必備功能之一,當註冊了某些網站的時候,郵箱裏一般會收到一封註冊成功通知郵件或者點擊激活帳號的郵件,博客園也是如此。本文使用Spring Boot,經過QQ郵箱來模仿博客園發送一封通知郵件。html
博客園發送的「歡迎您加入博客園」的主題郵件如圖所示。這種通知郵件,只有登陸用戶名在變化,其它郵件內容均不變,很適合用郵件模板來處理。java
模板能夠實現顯示與數據分離,將模板文件和數據經過模板引擎生成最終的HTML代碼。git
Thymeleaf是一個適用於Web和獨立環境的現代服務器端Java模板引擎,可以處理HTML,XML,JavaScript,CSS甚至純文本。Thymeleaf因爲使用了標籤屬性作爲語法,模版頁面直接用瀏覽器渲染,與其它模板引擎(好比Freemaker)相比,Thymeleaf最大的特色是可以直接在瀏覽器中打開並正確顯示模板頁面,而不須要啓動整個Web應用。github
Thymeleaf做爲Spring官方推薦的模板引擎,Spring boot對Thymeleaf支持比較友好,配置簡單,這裏使用Thymeleaf做爲模板引擎。spring
下面正式開始實現仿博客園發送通知郵件。瀏覽器
<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>
複製代碼
我使用的是QQ郵箱,須要得到QQ郵箱的受權碼。緩存
關於QQ郵箱生成受權碼:進入QQ郵箱 --> 郵箱設置 --> 帳戶 --> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務 --> 生成受權碼 --> 手機發送驗證短信 -->獲得受權碼springboot
spring.mail.host=smtp.qq.com
spring.mail.username=QQ郵箱
spring.mail.password=受權碼
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
#thymelea模板配置
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type:text/html
#熱部署文件,頁面不產生緩存,及時更新
spring.thymeleaf.cache=false
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
複製代碼
Service中有兩個方法:服務器
sendSimpleMail用於發送簡單的文本郵件,是一個比較基礎的案例。app
sendHtmlMail用於發送HTML郵件,發送通知郵件用的就是這個方法。其實模板郵件也就是HTML郵件中的一個子類。
MailService:
public interface MailService {
public void sendSimpleMail(String to, String subject, String content);
public void sendHtmlMail(String to, String subject, String content);
}
複製代碼
MailServiceImpl:
@Component
public class MailServiceImpl implements MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
@Override
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);//郵件接收者
message.setSubject(subject);//郵件主題
message.setText(content);//郵件內容
try {
mailSender.send(message);
logger.info("發送簡單郵件成功!");
} catch (Exception e) {
logger.error("發送簡單郵件時發生異常!", e);
}
}
@Override
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true表示須要建立一個multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
mailSender.send(message);
logger.info("發送HTML郵件成功!");
} catch (MessagingException e) {
logger.error("發送HTML郵件時發生異常!", e);
}
}
}
複製代碼
在resorces/templates下建立emailTemplate.html模板,與模板配置中的spring.thymeleaf.prefix=classpath:/templates/對應,否則會找不到模板。
關於Thymeleaf的使用這裏簡單介紹一下:
引入命名空間:。不一樣的約束文檔中,可能會出現不一樣含義的相同標記名稱,引入名稱空間能夠避免混淆和衝突。
訪問數據:#{user.name}
訪問變量:${today}
輸出URL: 博客園
更多詳情的說明和規則請參見:Thymeleaf官方文檔
emailTemplate.html:
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>歡迎您加入博客園</title>
</head>
<body>
<p>您好,您在博客園的賬戶激活成功,您的登陸用戶名是:<span th:text="${username}"></span>。</p>
<p>--</p>
<div>博客園(
<a th:href="@{https://www.cnblogs.com }">www.cnblogs.com</a>
) - 開發者的網上家園</div>
<p>代碼改變世界!</p>
</body>
</html>
複製代碼
使用Junit進行單元測試,pom.xml中已經默認配置好了,須要編寫測試類和測試方法。測試類以xxxTest.java命名,測試方法上面加@Test註解就可使用了。具體代碼以下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailTest {
@Autowired
private MailService mailService;
@Autowired
private TemplateEngine templateEngine;
@Test
public void testSendSimpleMail() throws Exception {
mailService.sendSimpleMail("xxx@qq.com", "測試發送簡單文本郵件", "測試發送簡單文本郵件");
}
@Test
public void testSendTemplateMail() {
Context context = new Context();
context.setVariable("username", "shangguanhao");
String emailContent = templateEngine.process("emailTemplate", context);
mailService.sendHtmlMail("xxx@qq.com", "歡迎您加入博客園", emailContent);
}
}
複製代碼
進行Junit測試,就能夠發送一個簡答的文本郵件和一個HTML的模板郵件,幾乎和博客園的如出一轍(以下圖所示):
完整代碼:GitHub地址