基於Spring Boot快速實現發送郵件功能


郵件在項目中經常會被用到,比如用郵件發送通知。比如,通過郵件注冊、認證、找回密碼、系統報警通知、報表信息等。本篇文章帶大家通過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
spring.mail.username=admin@choupangxia.com
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郵箱,找“設置”,“賬戶”。

image

在下面找到“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務”,選擇第二項中的“IMAP/SMTP服務”,進行開啟。

image

開啟成功,會顯示如下頁面:

image

頁面中便包含了授權碼,也就是我們項目中的密碼。此時將該授權碼復制到password處即可。

發送文本郵件

完成了上面的配置,發送功能的實現便極其簡單了,直接在項目中注入JavaMailSender然后調用其send方法便可進行郵件的發送。

以單元測試的形式發送郵件如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MailTests {

	@Resource
	private JavaMailSender javaMailSender;

	@Test
	public void sendMail() {
		SimpleMailMessage msg = new SimpleMailMessage();
		msg.setFrom("123@qq.com");
		msg.setTo("123@qq.com");
		msg.setSubject("程序新視界");
		msg.setText("技術分享");
		javaMailSender.send(msg);
	}
}

程序很簡單,創建一個SimpleMailMessage對象,設置從哪個(from)賬號發送到(to)哪個賬號,郵件的標題(subject)和內容(text)分別是什么。

執行單元測試,稍等片刻,郵箱便收到了郵件。如果執行的過程中出現權限驗證相關的異常,則需要檢查一下相關的配置是否正確。

如果需要抄送其他人,通過如下格式新增一個或多個收件地址。

// 抄送郵箱
msg.setCc("abc@126.com","def@126.com");

發送富文本郵件

正常來說,我們的郵件會有不同的格式,使用上面的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("123@qq.com");
		helper.setTo("123@qq.com");
		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


程序新視界:精彩和成長都不容錯過

程序新視界-微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM