Spring Boot 2.x (十八):郵件服務一文打盡
前景介紹
在日常的工作中,我們經常會用到郵件服務,比如傳送驗證碼,找回密碼確認,註冊時郵件驗證等,所以今天在這裡進行郵件服務的一些操作。
大致思路
我們要做的其實就是把Java程式作為一個客戶端,然後通過配置SMTP協議去連線我們所使用的傳送郵箱(from)對應的SMTP伺服器,然後通過SMTP協議,將郵件轉投到目標郵箱(to)對應的SMTP伺服器,最後將該郵件分發到目標郵箱
Spring Boot給我們集成了郵件的相關服務,並給出了對應的starter,這裡我們來實戰學習一下郵件服務是怎麼玩的。
引入POM
萬年不變的第一步:引入所需要的starter依賴,這裡我採用的是和我的Spring Boot對應的版本2.1.4,其餘版本的話應該是相差不大,可以同樣作為借鑑
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
配置檔案
這裡由於國內有幾大郵箱運營商,所以分為四種不同的情況來說明
QQ郵箱
QQ郵箱是比較麻煩的一種,需要登入到郵箱中找到對應的配置,並驗證密碼後開啟STMP服務
點選這裡可以去獲取對應的授權碼,後面的配置中我們會用到~
個人QQ郵箱的SMTP伺服器的host是:smtp.qq.com
163郵箱
對應的授權碼就是我們郵箱的密碼~
SMTP伺服器的host是:smtp.163.com
騰訊企業郵箱
對應的授權碼也是我們郵箱的密碼
企業的和個人的host略有不同:smtp.exmail.qq.com
阿里企業郵箱
對應的授權碼也是我們郵箱的密碼
阿里的企業郵箱host是: smtp.mxhichina.com
得到對應的資訊之後,我們就可以去完善我們的配置資訊了 ~
# 這裡的host對應是上面的幾大運營商的STMP伺服器的host spring.mail.host=smtp.163.com spring.mail.username=****@163.com # 這裡的password對應的就是上面的授權碼 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 spring.mail.default-encoding=UTF-8
編寫郵件的實體類
/**
* 郵件實體類
* @author vi
* @since 2019/07/17
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Mail {
/**
* 郵件傳送人
*/
private String from;
/**
* 郵件接收人
*/
private String to;
/**
* 郵件主題
*/
private String subject;
/**
* 郵件內容
*/
private String content;
/**
* 郵件主題
*/
private String type;
/**
* 傳送郵件模板時的模板檔名
*/
private String templateName;
/**
* 模板引數
*/
private Map<String,Object> variables;
/**
* 附件地址
*/
private String attachPath;
}
編寫傳送郵件的方法
在這裡,我將傳送郵件分為了兩種情況:
- 傳送普通郵件
/**
* 傳送普通郵件
* @param email 郵件物件
*/
private static void sendSimpleMail(Mail email) {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
// 郵件傳送人
simpleMailMessage.setFrom(email.getFrom());
// 郵件接收人
simpleMailMessage.setTo(email.getTo());
// 郵件主題
simpleMailMessage.setSubject(email.getSubject());
// 郵件內容
simpleMailMessage.setText(email.getContent());
// 傳送郵件
javaMailSender.send(simpleMailMessage);
}
- 傳送MIME型別郵件(比如模板,附件,HTML都屬於該型別的郵件)
/**
* 傳送MIME型別的郵件
* @param email 郵件物件
*/
private static void sendMimeMail(Mail email) {
// 生成郵件字串
String content = email.getContent();
if (email.getVariables() != null) {
content = generate(email);
}
// 基於這個物件可以傳送HTML,或者攜帶附件的二進位制郵件
MimeMessage message= javaMailSender.createMimeMessage();
try {
// 構建傳送模板郵件的物件
MimeMessageHelper helper = new MimeMessageHelper(message,true);
// 設定傳送郵箱
helper.setFrom(email.getFrom());
// 設定接收郵箱
helper.setTo(email.getTo());
// 設定郵件名(主題)
helper.setSubject(email.getSubject());
// 設定郵件內容
helper.setText(content,true);
// 這裡可以傳送帶有附件的郵件,如果沒有附件可以省略,就不在多做描述
if (!StringUtils.isNullOrEmpty(email.getAttachPath())) {
FileSystemResource file = new FileSystemResource(new File(email.getAttachPath()));
helper.addAttachment(file.getFilename(), file);
}
// 傳送郵件
javaMailSender.send(message);
} catch (MessagingException e) {
}
}
/**
* 生成模板字串
* @param email 郵件物件
* @return
*/
private static String generate(Mail email) {
Context context = new Context();
// 設定模板引數
context.setVariables(email.getVariables());
// 載入模板後的內容字串
return templateEngine.process(email.getTemplateName(), context);
}
最後可以把這兩個方法統一介面,通過Mail類中的型別來判斷呼叫哪一個方法即可~
/**
* 對外開放的統一發送郵件方法
* @param mail
*/
public static void sendEmail(Mail mail) {
String type = mail.getType();
switch (type) {
case "1":
sendSimpleMail(mail);
case "2":
sendMimeMail(mail);
}
}
關於模板的一些補充
如果我們需要傳送模板郵件的話,需要使用到模板引擎freemaker或thymeleaf,這裡我拿thymeleaf來說一下~
第一步,可以引入pom檔案
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
第二步,需要在配置檔案中進行配置
spring.thymeleaf.check-template-location=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
第三步,通過我們獲取到的模板引數對Mail類進行set方法
mail.setVariables(email.getVariables());
第四步,我們需要在模板中去使用引數
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3 style="color: red;" th:text="${username}"></h3>
</body>
</html>
注意,這裡的thymeleaf的用法,使用標籤th:text
來賦值,更多的模板用法,可以去
查閱thymeleaf的用法~
後記
郵件在這裡就告一段落了,下篇預告:JVM系列(一):JVM簡介,敬請期待,謝謝大家一直以來的支援!
公眾號
原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知!