目錄:
一、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協議的概要內容。然后一起引入依賴,添加項目屬性配置,最后講解了三大類發送郵件的方式。源碼獲取看下面!