郵件在項目中經常會被用到,比如用郵件發送通知。比如,通過郵件注冊、認證、找回密碼、系統報警通知、報表資訊等。本篇文章帶大家通過SpringBoot快速實作一個發送郵件的功能。
下面先簡單了解一下常見的郵件協定。常用的電子郵件協定有SMTP、POP3、IMAP4,它們都隸屬于TCP/IP協定簇,預設狀态下,分别通過TCP端口25、110和143建立連接配接。
SMTP的全稱是 “Simple Mail Transfer Protocol”,即簡單郵件傳輸協定。它是一組用于從源位址到目的位址傳輸郵件的規範,通過它來控制郵件的中轉方式。它的一個重要特點是它能夠在傳送中接力傳送郵件,即郵件可以通過不同網絡上的主機接力式傳送。
SMTP認證,簡單地說就是要求必須在提供了賬戶名和密碼之後才可以登入SMTP伺服器,這就使得那些垃圾郵件的散播者無可乘之機。增加SMTP認證的目的是為了使使用者避免受到垃圾郵件的侵擾。SMTP已是事實上的E-Mail傳輸的标準。
POP郵局協定負責從郵件伺服器中檢索電子郵件。它要求郵件伺服器完成下面幾種任務之一:從郵件伺服器中檢索郵件并從伺服器中删除這個郵件;從郵件伺服器中檢索郵件但不删除它;不檢索郵件,隻是詢問是否有新郵件到達。
POP協定支援多使用者網際網路郵件擴充,後者允許使用者在電子郵件上附帶二進制檔案,如文字處理檔案和電子表格檔案等,實際上這樣就可以傳輸任何格式的檔案了,包括圖檔和聲音檔案等。在使用者閱讀郵件時,POP指令所有的郵件資訊立即下載下傳到使用者的計算機上,不在伺服器上保留。
POP3(Post Office Protocol 3)即郵局協定的第3個版本,是網際網路電子郵件的第一個離線協定标準。
網際網路資訊通路協定(IMAP)是一種優于POP的新協定。和POP一樣,IMAP也能下載下傳郵件、從伺服器中删除郵件或詢問是否有新郵件,但IMAP克服了POP的一些缺點。例如,它可以決定客戶機請求郵件伺服器送出所收到郵件的方式,請求郵件伺服器隻下載下傳所選中的郵件而不是全部郵件。客戶機可先閱讀郵件資訊的标題和發送者的名字再決定是否下載下傳這個郵件。
通過使用者的客戶機電子郵件程式,IMAP可讓使用者在伺服器上建立并管理郵件檔案夾或郵箱、删除郵件、查詢某封信的一部分或全部内容,完成所有這些工作時都不需要把郵件從伺服器下載下傳到使用者的個人計算機上。
支援IMAP的常用郵件用戶端有:ThunderMail,Foxmail,Microsoft Outlook等。
如果未使用SpringBoot,需要自己去封裝消息體等資訊,實作起來還是比較複雜的。但基于Spring Boot進行郵件發送,幾乎可以說隻用引入spring-boot-starter-mail就可以輕松完成郵件的發送。
從本質上來說是由于Spring推出了關于Mail的JavaMailSender類,基于該類Spring Boot又進一步封裝,進而實作了輕松發送郵件的內建。而且JavaMailSender類提供了強大的郵件發送能力,支援各種類型的郵件發送。
內建步驟非常簡單,在項目中添加如下依賴:
在application.properties中添加郵箱配置,對應參數項已經内置好,根據具體情況進行配置即可。
其中第一個host(郵件伺服器位址)參數,不同的郵箱有所不同,上面是QQ郵箱的host。163郵箱為smtp.163.com、126郵箱為smtp.126.com。
username和password項為郵箱對應的使用者名和密碼,密碼并不是登入密碼,而是開啟POP3之後設定的用戶端授權密碼。
以QQ郵箱為例,進行密碼的配置和擷取。首先登入QQ郵箱,找“設定”,“賬戶”。

在下面找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務”,選擇第二項中的“IMAP/SMTP服務”,進行開啟。
開啟成功,會顯示如下頁面:
頁面中便包含了授權碼,也就是我們項目中的密碼。此時将該授權碼複制到password處即可。
完成了上面的配置,發送功能的實作便極其簡單了,直接在項目中注入JavaMailSender然後調用其send方法便可進行郵件的發送。
以單元測試的形式發送郵件如下:
程式很簡單,建立一個SimpleMailMessage對象,設定從哪個(from)賬号發送到(to)哪個賬号,郵件的标題(subject)和内容(text)分别是什麼。
執行單元測試,稍等片刻,郵箱便收到了郵件。如果執行的過程中出現權限驗證相關的異常,則需要檢查一下相關的配置是否正确。
如果需要抄送其他人,通過如下格式新增一個或多個收件位址。
正常來說,我們的郵件會有不同的格式,使用上面的SimpleMailMessage不能夠很好的豐富郵件内容,也不支援html的解析。
Spring Boot支援使用HTML發送郵件是通過MimeMessage來完成的。看具體的示例代碼:
此處使用了MimeMessageHelper來設定對應的參數資訊,但在調用MimeMessageHelper對應的setter方法時會抛出MessagingException異常,需要進行特殊處理。
上面的content的内容,如果使用SimpleMailMessage對象進行發送,郵件的内容是包含html标簽的内容,而不是直接呈現html标簽所需要展示的格式。
MimeMessageHelper支援發送複雜郵件模闆,支援文本、附件、HTML、圖檔等。比如需要發送附件,則在上面的代碼中通過調用helper的addAttachment(fileName, file)方法即可。
我們這裡就不再拓展其他功能,大家可自行進行嘗試。
上面隻是通過單元測試的形式展示了基于Spring Boot發送郵件,當然,在生産環境中的應用場景要比上面的複雜的多。比如,要考慮郵件模闆、對外接口、異常處理、成功率等問題。大家可在此基礎上進行拓展。