SpringBoot系列(十四)整合郵件傳送服務及郵件傳送的幾種方式
阿新 • • 發佈:2020-05-09
**往期推薦**
[SpringBoot系列(一)idea新建Springboot專案](https://www.cnblogs.com/swzx-1213/p/12345330.html)
[SpringBoot系列(二)入門知識](https://www.cnblogs.com/swzx-1213/p/12637645.html)
[springBoot系列(三)配置檔案詳解](https://www.cnblogs.com/swzx-1213/p/12641842.html)
[SpringBoot系列(四)web靜態資源配置詳解](https://www.cnblogs.com/swzx-1213/p/12686361.html)
[SpringBoot系列(五)Mybatis整合完整詳細版](https://www.cnblogs.com/swzx-1213/p/12698222.html)
[SpringBoot系列(六)整合thymeleaf詳解版](https://www.cnblogs.com/swzx-1213/p/12726432.html)
[Springboot系列(七) 整合介面文件swagger,使用,測試](https://www.cnblogs.com/swzx-1213/p/12736993.html)
[SpringBoot系列(八)分分鐘學會Springboot多種解決跨域方式](https://www.cnblogs.com/swzx-1213/p/12745086.html)
[SpringBoot系列(九)單,多檔案上傳的正確姿勢](https://www.cnblogs.com/swzx-1213/p/12756239.html)
[SpringBoot系列(十)優雅的處理統一異常處理與統一結果返回](https://www.cnblogs.com/swzx-1213/p/12781836.html)
[SpringBoot系列(十一)攔截器與攔截器鏈的配置與使用詳解,你知道多少?](https://www.cnblogs.com/swzx-1213/p/12788576.html)
[SpringBoot系列(十二)過濾器配置詳解](https://www.cnblogs.com/swzx-1213/p/12814734.html)
[SpringBoot系列(十三)統一日誌處理,logback+slf4j AOP+自定義註解,走起!](https://www.cnblogs.com/swzx-1213/p/12840923.html)
**目錄:**
- [一、SMTP協議簡介](#一smtp協議簡介)
- [二、開啟SMTP服務並獲取授權碼](#二開啟smtp服務並獲取授權碼)
- [三、依賴匯入與配置說明](#三依賴匯入與配置說明)
- [四、郵件傳送](#四郵件傳送)
- [1.簡單郵件傳送](#1簡單郵件傳送)
- [2. 帶附件內容和正文帶圖片的郵件傳送](#2-帶附件內容和正文帶圖片的郵件傳送)
- [3. thymeleaf模板作為郵件傳送](#3-thymeleaf模板作為郵件傳送)
- [五、總結](#五、總結)
## 一、SMTP協議簡介 ##
SMTP是一種提供可靠且有效的**電子郵件傳輸**的協議。SMTP是建立在**FTP**檔案傳輸服務上的一種郵件服務,主要用於系統之間的郵件資訊傳遞,並提供有關來信的通知。SMTP獨立於特定的傳輸子系統,且只需要可靠有序的資料流通道支援,SMTP的重要特性之一是其能**跨越網路傳輸郵件**,即“SMTP郵件中繼”。使用SMTP,可實現相同網路處理程序之間的郵件傳輸,也可通過中繼器或閘道器實現某處理程序與其他網路之間的郵件傳輸。
簡單來說:我們使用的這些郵件傳送功能,他們之間都有一個專門的電子郵件的伺服器,類似於郵局,你將郵件發給郵局,郵局又會根據你的郵寄地址傳送給相應的郵局,然後接收方去郵局取郵件。而郵件伺服器呢,就是網際網路之間的一個郵局,不同的網路之間也能實現電子郵件的傳送。
Spring框架在java郵件服務的基礎上進行了封裝,SpringBoot在Spring的基礎上對郵件服務進一步的封裝,讓SpringBoot傳送郵件更為便利,靈活。
## 二、開啟SMTP服務並獲取授權碼 ##
這裡我們以**QQ郵箱**為例,要想在SpringBoot傳送QQ郵件必須先開啟QQ郵箱的SMTP功能,預設是關閉的,具體操作如下。進入郵箱→設定→賬戶,然後找到下面這個:
![](https://img2020.cnblogs.com/blog/1728419/202005/1728419-20200509105628161-73577740.png)
將第一個開啟,這裡我已經開啟了,就不用再開啟了,至於那個POP3協議,這是一種從郵件伺服器上讀取郵件的協議,通過POP3協議,收信人不需要參與到與郵件伺服器之間的郵件讀取過程,簡化了使用者操作. 收信人可以“離線”地進行郵件處理,很方便地接收,閱讀郵件。
然後我們開啟之後還需要獲取一個授權碼,這個授權碼我們後面編寫郵件配置需要用到。獲取授權碼可能需要驗證身份什麼的。將授權碼儲存下來。
![](https://img2020.cnblogs.com/blog/1728419/202005/1728419-20200509105638182-1552632458.png)
## 三、依賴匯入與配置說明 ##
**依賴匯入**:
```xml
```
為了方便測試我們也需要將**starter-web**的依賴匯入進來。
**配置檔案**:
```properties
spring:
mail:
host: smtp.qq.com
username: [email protected]
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,或者是直接在測試模組新增測試就行
```java
@RestController
public class MailController {
@Autowired
JavaMailSenderImpl javaMailSender;
@RequestMapping("/mail")
public String sendMail(){
SimpleMailMessage message = new SimpleMailMessage();
//郵件設定
message.setSubject("郵件主題");
message.setText("郵件內容");
message.setTo("[email protected]","[email protected]");
message.setFrom("[email protected]");
javaMailSender.send(message);
return "簡單郵件傳送成功!"
}
}
```
**程式碼說明**:**JavaMailSenderImpl**就是一個SpringBoot中用來發送郵件的一個實現類,我們需要將它注入到bean中,以供使用。它裡面有一些方法,這裡只展示了簡單的幾個,其他的也很簡單,比如說傳送日期,抄送人等等。接受者可以設定多個,如上。
## 2. 帶附件內容和正文帶圖片的郵件傳送##
```java
@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("全棧學習筆記百度一下 ",true);
helper.setTo("[email protected]");
helper.setFrom("[email protected]");
//附件新增圖片
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()** 這個方法是用來新增附件的,附件和我們之前新增的圖片不一樣,附件作為一種未下載的檔案,而資原始檔則是直接顯示到正文中。利用我自己的郵箱進行測試的截圖:
![](https://img2020.cnblogs.com/blog/1728419/202005/1728419-20200509105658691-2123581429.png)
### 3. thymeleaf模板作為郵件傳送 ###
專案中需要引入thymeleaf依賴,並且要在新建的html檔案中加入:xmlns:th="http://www.thymeleaf.org" ,不會thymeleaf的請移步之前的文章。
```xml
```
這裡在templates下面建立了一個email的html5檔案。
```html
```
controller中再新增一個方法。
```java
@RequestMapping("/thyMail")
public String sendThymeleafMail() throws MessagingException {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
messageHelper.setSubject("這是一個thymeleaf模板郵件");
messageHelper.setTo("[email protected]");
messageHelper.setFrom("[email protected]");
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型別返回。
測試:
![](https://img2020.cnblogs.com/blog/1728419/202005/1728419-20200509105717979-609980105.png)
## 五、總結 ##
本文講了基礎的郵件傳送原理,SMTP協議以及提到的POP3協議的概要內容。然後一起引入依賴,新增專案屬性配置,最後講解了三大類傳送郵件的方式。原始碼獲取看下面!
![](https://img2020.cnblogs.com/blog/1728419/202005/1728419-20200509105728825-4388901