郵件在專案中經常會被用到,比如用郵件發送通知,比如,通過郵件注冊、認證、找回密碼、系統報警通知、報表資訊等,本篇文章帶大家通過SpringBoot快速實作一個發送郵件的功能,
郵件協議
下面先簡單了解一下常見的郵件協議,常用的電子郵件協議有SMTP、POP3、IMAP4,它們都隸屬于TCP/IP協議簇,默認狀態下,分別通過TCP埠25、110和143建立連接,
SMTP協議
SMTP的全稱是 “Simple Mail Transfer Protocol”,即簡單郵件傳輸協議,它是一組用于從源地址到目的地址傳輸郵件的規范,通過它來控制郵件的中轉方式,它的一個重要特點是它能夠在傳送中接力傳送郵件,即郵件可以通過不同網路上的主機接力式傳送,
SMTP認證,簡單地說就是要求必須在提供了賬戶名和密碼之后才可以登錄SMTP服務器,這就使得那些垃圾郵件的散播者無可乘之機,增加SMTP認證的目的是為了使用戶避免受到垃圾郵件的侵擾,SMTP已是事實上的E-Mail傳輸的標準,
POP協議
POP郵局協議負責從郵件服務器中檢索電子郵件,它要求郵件服務器完成下面幾種任務之一:從郵件服務器中檢索郵件并從服務器中洗掉這個郵件;從郵件服務器中檢索郵件但不洗掉它;不檢索郵件,只是詢問是否有新郵件到達,
POP協議支持多用戶互聯網郵件擴展,后者允許用戶在電子郵件上附帶二進制檔案,如文字處理檔案和電子表格檔案等,實際上這樣就可以傳輸任何格式的檔案了,包括圖片和聲音檔案等,在用戶閱讀郵件時,POP命令所有的郵件資訊立即下載到用戶的計算機上,不在服務器上保留,
POP3(Post Office Protocol 3)即郵局協議的第3個版本,是因特網電子郵件的第一個離線協議標準,
IMAP協議
互聯網資訊訪問協議(IMAP)是一種優于POP的新協議,和POP一樣,IMAP也能下載郵件、從服務器中洗掉郵件或詢問是否有新郵件,但IMAP克服了POP的一些缺點,例如,它可以決定客戶機請求郵件服務器提交所收到郵件的方式,請求郵件服務器只下載所選中的郵件而不是全部郵件,客戶機可先閱讀郵件資訊的標題和發送者的名字再決定是否下載這個郵件,
通過用戶的客戶機電子郵件程式,IMAP可讓用戶在服務器上創建并管理郵件檔案夾或郵箱、洗掉郵件、查詢某封信的一部分或全部內容,完成所有這些作業時都不需要把郵件從服務器下載到用戶的個人計算機上,
支持IMAP的常用郵件客戶端有:ThunderMail,Foxmail,Microsoft Outlook等,
SpringBoot集成Mail功能
如果未使用SpringBoot,需要自己去封裝訊息體等資訊,實作起來還是比較復雜的,但基于Spring Boot進行郵件發送,幾乎可以說只用引入spring-boot-starter-mail就可以輕松完成郵件的發送,
從本質上來說是由于Spring推出了關于Mail的JavaMailSender類,基于該類Spring Boot又進一步封裝,從而實作了輕松發送郵件的集成,而且JavaMailSender類提供了強大的郵件發送能力,支持各種型別的郵件發送,
依賴配置
集成步驟非常簡單,在專案中添加如下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
組態檔
在application.properties中添加郵箱配置,對應引數項已經內置好,根據具體情況進行配置即可,
# 郵箱服務器地址
spring.mail.host=smtp.qq.com
[email protected]
spring.mail.password=123456
spring.mail.default-encoding=UTF-8
其中第一個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方法便可進行郵件的發送,
以單元測驗的形式發送郵件如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MailTests {
@Resource
private JavaMailSender javaMailSender;
@Test
public void sendMail() {
SimpleMailMessage msg = new SimpleMailMessage();
msg.setFrom("[email protected]");
msg.setTo("[email protected]");
msg.setSubject("程式新視界");
msg.setText("技術分享");
javaMailSender.send(msg);
}
}
程式很簡單,創建一個SimpleMailMessage物件,設定從哪個(from)賬號發送到(to)哪個賬號,郵件的標題(subject)和內容(text)分別是什么,
執行單元測驗,稍等片刻,郵箱便收到了郵件,如果執行的程序中出現權限驗證相關的例外,則需要檢查一下相關的配置是否正確,
如果需要抄送其他人,通過如下格式新增一個或多個收件地址,
// 抄送郵箱
msg.setCc("[email protected]","[email protected]");
發送富文本郵件
正常來說,我們的郵件會有不同的格式,使用上面的SimpleMailMessage不能夠很好的豐富郵件內容,也不支持html的決議,
Spring Boot支持使用HTML發送郵件是通過MimeMessage來完成的,看具體的示例代碼:
@Test
public void sendHtmlMail() {
String content="<html>\n" +
"<body>\n" +
" <h3>hello world ! 這是一封html郵件!</h3>\n" +
"</body>\n" +
"</html>";
MimeMessage message = javaMailSender.createMimeMessage();
try {
// 第二個引數true表示需要創建一個multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("[email protected]");
helper.setTo("[email protected]");
helper.setSubject("程式新視界");
helper.setText(content, true);
javaMailSender.send(message);
} catch (MessagingException e){
System.out.println("發送郵件例外");
}
}
此處使用了MimeMessageHelper來設定對應的引數資訊,但在呼叫MimeMessageHelper對應的setter方法時會拋出MessagingException例外,需要進行特殊處理,
上面的content的內容,如果使用SimpleMailMessage物件進行發送,郵件的內容是包含html標簽的內容,而不是直接呈現html標簽所需要展示的格式,
MimeMessageHelper支持發送復雜郵件模板,支持文本、附件、HTML、圖片等,比如需要發送附件,則在上面的代碼中通過呼叫helper的addAttachment(fileName, file)方法即可,
我們這里就不再拓展其他功能,大家可自行進行嘗試,
其他擴展
上面只是通過單元測驗的形式展示了基于Spring Boot發送郵件,當然,在生產環境中的應用場景要比上面的復雜的多,比如,要考慮郵件模板、對外介面、例外處理、成功率等問題,大家可在此基礎上進行拓展,
原始碼地址:https://github.com/secbr/springboot-learn/tree/master/springboot-mail

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67420.html
標籤:Java
上一篇:實戰開發,使用 Spring Session 與 Spring security 完成網站登錄改造!!
下一篇:一個程式員的水平能差到什么程度?
