往期推薦
SpringBoot系列(一)idea新建Springboot項目
Springboot系列(七) 集成接口文檔swagger,使用,測試
SpringBoot系列(八)分分鍾學會Springboot多種解決跨域方式
SpringBoot系列(十)優雅的處理統一異常處理與統一結果返回
SpringBoot系列(十一)攔截器與攔截器鏈的配置與使用詳解,你知道多少?
SpringBoot系列(十三)統一日志處理,logback+slf4j AOP+自定義注解,走起!
目錄:
一、SMTP協議簡介
SMTP是一種提供可靠且有效的電子郵件傳輸的協議。SMTP是建立在FTP文件傳輸服務上的一種郵件服務,主要用於系統之間的郵件信息傳遞,並提供有關來信的通知。SMTP獨立於特定的傳輸子系統,且只需要可靠有序的數據流信道支持,SMTP的重要特性之一是其能跨越網絡傳輸郵件,即“SMTP郵件中繼”。使用SMTP,可實現相同網絡處理進程之間的郵件傳輸,也可通過中繼器或網關實現某處理進程與其他網絡之間的郵件傳輸。
簡單來說:我們使用的這些郵件發送功能,他們之間都有一個專門的電子郵件的服務器,類似於郵局,你將郵件發給郵局,郵局又會根據你的郵寄地址發送給相應的郵局,然后接收方去郵局取郵件。而郵件服務器呢,就是互聯網之間的一個郵局,不同的網絡之間也能實現電子郵件的發送。
Spring框架在java郵件服務的基礎上進行了封裝,SpringBoot在Spring的基礎上對郵件服務進一步的封裝,讓SpringBoot發送郵件更為便利,靈活。
二、開啟SMTP服務並獲取授權碼
這里我們以QQ郵箱為例,要想在SpringBoot發送QQ郵件必須先打開QQ郵箱的SMTP功能,默認是關閉的,具體操作如下。進入郵箱→設置→賬戶,然后找到下面這個:
將第一個開啟,這里我已經開啟了,就不用再開啟了,至於那個POP3協議,這是一種從郵件服務器上讀取郵件的協議,通過POP3協議,收信人不需要參與到與郵件服務器之間的郵件讀取過程,簡化了用戶操作. 收信人可以“離線”地進行郵件處理,很方便地接收,閱讀郵件。
然后我們開啟之后還需要獲取一個授權碼,這個授權碼我們后面編寫郵件配置需要用到。獲取授權碼可能需要驗證身份什么的。將授權碼保存下來。
三、依賴導入與配置說明
依賴導入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
為了方便測試我們也需要將starter-web的依賴導入進來。
配置文件:
spring:
mail:
host: smtp.qq.com
username: qzstudynote@qq.com
password: zxcvbnmkj
properties:
mail:
smtp:
socketFactory:
class: javax.net.ssl.SSLSocketFactory
## ssl:
## enable :true
default-encoding: utf-8
配置說明:
- host就是你的郵件服務器地址,
- username就是你的郵箱賬號,帶上后綴
- password就是你剛剛復制的授權碼,我這里是亂寫的;
- default-encoding 設置郵件的編碼為utf-8;
- properties:額外的配置,這里我寫了兩個,只用其中一個就行了,開啟ssl加密,保證安全連接。
四、郵件發送
1.簡單郵件發送
編寫controller,或者是直接在測試模塊添加測試就行
@RestController
public class MailController {
@Autowired
JavaMailSenderImpl javaMailSender;
@RequestMapping("/mail")
public String sendMail(){
SimpleMailMessage message = new SimpleMailMessage();
//郵件設置
message.setSubject("郵件主題");
message.setText("郵件內容");
message.setTo("xxxxxxx@139.com","111111111@qq.com");
message.setFrom("qzstudynote@qq.com");
javaMailSender.send(message);
return "簡單郵件發送成功!"
}
}
代碼說明:JavaMailSenderImpl就是一個SpringBoot中用來發送郵件的一個實現類,我們需要將它注入到bean中,以供使用。它里面有一些方法,這里只展示了簡單的幾個,其他的也很簡單,比如說發送日期,抄送人等等。接受者可以設置多個,如上。
2. 帶附件內容和正文帶圖片的郵件發送##
@RequestMapping("/mineMail")
public String sendMineMail() throws MessagingException {
//1、創建一個復雜的郵件
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//郵件主題
helper.setSubject("這是一個郵件啊");
//文本中添加圖片
helper.addInline("image1",new FileSystemResource("D:\\images\\spring\\1.jpg"));
//郵件內容
helper.setText("全棧學習筆記<a href='https://www.cnblogs.com/swzx-1213/'>百度一下</a> <img src='cid:image1'></img>",true);
helper.setTo("xxxxx@139.com");
helper.setFrom("qzstudynote@qq.com");
//附件添加圖片
helper.addAttachment("1.jpg",new File("D:\\images\\spring\\1.jpg"));
//附件添加word文檔
helper.addAttachment("哈哈哈.docx",new File("D:\\images\\spring\\哈哈哈.docx"));
javaMailSender.send(mimeMessage);
return "復雜郵件發送!";
}
代碼說明:
- 創建一個MimeMessage 郵件,但是我們也需要創建一個工具類MimeMessageHelper,相當於代理類吧,郵件的屬性配置就由這個工具類來實現。
- addInline(),第一個參數是一個contentId,String類型的,相當於是一個key,第二個參數是一個Resource對象,資源對象,這里我們傳了一個本地的圖片就用的FileSystemResource對象。當然這里是說的我們用的這個addInline方法的參數是這樣,還有其他的參數類型,所謂重載。
- setText(),這里用到的第一個參數就是文本字符串,第二個就是是否解析文本中的html語法。
- addAttachment() 這個方法是用來添加附件的,附件和我們之前添加的圖片不一樣,附件作為一種未下載的文件,而資源文件則是直接顯示到正文中。利用我自己的郵箱進行測試的截圖:
3. thymeleaf模板作為郵件發送
項目中需要引入thymeleaf依賴,並且要在新建的html文件中加入:xmlns:th="http://www.thymeleaf.org" ,不會thymeleaf的請移步之前的文章。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
這里在templates下面創建了一個email的html5文件。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<p th:text="${name}"></p>
<a th:text="這是一個鏈接" th:href="${link}"></a>
<img th:src="${image1}">
</body>
</html>
controller中再添加一個方法。
@RequestMapping("/thyMail")
public String sendThymeleafMail() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
messageHelper.setSubject("這是一個thymeleaf模板郵件");
messageHelper.setTo("xxxxxxxx@139.com");
messageHelper.setFrom("qzstudynote@qq.com");
Context context = new Context();
context.setVariable("name","這是一個新建的thymeleaf模板");
context.setVariable("link","https://www.cnblogs.com/swzx-1213/");
context.setVariable("image1","https://s1.ax1x.com/2020/04/14/JShDYt.th.jpg");
String value = templateEngine.process("email.html",context);
messageHelper.setText(value,true);
javaMailSender.send(mimeMessage);
return "模板郵件發送成功";
}
代碼說明:
- Context 屬於org.thymeleaf.context這個包。
- context.setVariable(),第一個參數是String,第二個是Object類型。第一個參數就對應thymeleaf模板上面相同名字的參數。
- templateEngine.process()將指定路徑的html文件轉換成String類型返回。
測試:
五、總結
本文講了基礎的郵件發送原理,SMTP協議以及提到的POP3協議的概要內容。然后一起引入依賴,添加項目屬性配置,最后講解了三大類發送郵件的方式。源碼獲取看下面!