springboot集成邮箱功能
1. 寫在前面
我們都知道,如果系統出現預警,或者有一些監控需求,我們可以通過發送短信或者郵件來進行通知,本篇文章呢,我就打算來講解一下SpringBoot的郵件服務。我們都知道發送郵件應該是網站的必備功能之一,什么注冊驗證,忘記密碼或者是給用戶發送營銷信息。以前我們會使用 JavaMail 相關 api 來寫發送郵件的相關代碼,后來 Spring 推出了 JavaMailSender 更加簡化了郵件發送的過程,在之后 Spring Boot 對此進行了封裝就有了現在的 spring-boot-starter-mail,如果你看了我前面的文章的話,就會知道,SpringBoot把大部分的需求封裝成了一個個場景啟動器,而mail也就是相應的場景啟動器。
2. 了解郵件服務
經常出現和郵件相關的協議是SMTP、IMAP和POP3,所以在這里我們首先來認識了解這三個協議。
SMTP全稱為Simple Mail Transfer Protocol(簡單郵件傳輸協議),它是一組用于從源地址到目的地址傳輸郵件的規范,通過它來控制郵件的中轉方式。SMTP認證要求必須提供賬號和密碼才能登陸服務器,其設計目的在于避免用戶受到垃圾郵件的侵擾。
IMAP全稱為Internet Message Access Protocol(互聯網郵件訪問協議),IMAP允許從郵件服務器上獲取郵件的信息、下載郵件等。IMAP與POP類似,都是一種郵件獲取協議。
POP3全稱為Post Office Protocol 3(郵局協議),POP3支持客戶端遠程管理服務器端的郵件。POP3常用于“離線”郵件處理,即允許客戶端下載服務器郵件,然后服務器上的郵件將會被刪除。目前很多POP3的郵件服務器只提供下載郵件功能,服務器本身并不刪除郵件,這種屬于改進版的POP3協議。
那么問題來了,IMAP和POP3協議有什么不同呢?兩者最大的區別在于,IMAP允許雙向通信,即在客戶端的操作會反饋到服務器上,例如在客戶端收取郵件、標記已讀等操作,服務器會跟著同步這些操作。而對于POP協議雖然也允許客戶端下載服務器郵件,但是在客戶端的操作并不會同步到服務器上面的,例如在客戶端收取或標記已讀郵件,服務器不會同步這些操作。
3. SpringBoot相關類
SpringBoot中針對郵件服務的兩個工具類是,JavaMailSender和JavaMailSenderImpl,它們是Spring官方提供的集成郵件服務的接口和實現類,以簡單高效的設計著稱,目前是Java后端發送郵件和集成郵件服務的主流工具。那如何通過JavaMailSenderImpl發送郵件?非常簡單,直接在業務類注入JavaMailSenderImpl并調用send方法發送郵件。其中簡單郵件可以通過SimpleMailMessage來發送郵件,而復雜的郵件(例如添加附件)可以借助MimeMessageHelper來構建MimeMessage發送郵件。
我們不難理解,SpringBoot對于郵件服務能做到開箱即用,其實就是基于官方內置的自動配置,翻看源碼可知曉郵件自動配置類(MailSenderPropertiesConfiguration) 為上下文提供了郵件服務實例(JavaMailSenderImpl)。
4. 具體教程
4.1、pom配置
首先我們創建一個新的項目,只要包含最基本的web場景就可以了,然后我們在pom.xml中引入依賴就可以了,依賴如下:
<dependencies><dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency> </dependencies>接著,我們在application.properties主配置文件中對mail進行相關的配置,配置內容如下,我做了相關注釋
spring.mail.host=smtp.163.com spring.mail.username=amazing spring.mail.password=xxxxxx #這里填的不是賬號密碼,是的第三方登錄校驗碼 spring.mail.default-encoding=UTF-8 mail.fromMail.address=amazing@163.com上面的郵箱服務器的地址,我這里放出一下常用有限發郵箱服務器地址
QQ郵箱(mail.qq.com): POP3服務器地址:pop.qq.com(端口:110) SMTP服務器地址:smtp.qq.com(端口:25) SMTP服務器需要身份驗證。網易郵箱(163.com): POP3服務器地址:pop.163.com(端口:110) SMTP服務器地址:smtp.163.com(端口:25)谷歌郵箱(google.com): POP3服務器地址:pop.gmail.com(SSL啟用端口:995) SMTP服務器地址:smtp.gmail.com(SSL啟用端口:587)阿里云郵箱(mail.aliyun.com): POP3服務器地址:pop3.aliyun.com(SSL加密端口:995;非加密端口:110) SMTP服務器地址:smtp.aliyun.com(SSL加密端口:465;非加密端口:25) IMAP服務器地址:imap.aliyun.com(SSL加密端口:993;非加密端口:143)新浪郵箱(sina.com): POP3服務器地址:pop3.sina.com.cn(端口:110) SMTP服務器地址:smtp.sina.com.cn(端口:25)4.2、簡單使用
這樣就完成了我們SpringBoot使用郵件服務的基本配置,那么接下來我們簡單使用一下,首先編寫Service,目錄結構如下
編寫 test 類進行測試,至此一個簡單的文本發送就完成了。
4.3、豐富郵件內容
但是在正常使用的過程中,我們通常在郵件中加入圖片或者附件來豐富郵件的內容,下面講介紹如何使用 Spring Boot 來發送豐富的郵件。
發送 html 格式郵件
其它都不變在 MailService 添加 sendHtmlMail 方法
在測試類中構建 html 內容,測試發送
@Test public void testHtmlMail() throws Exception {String content="<html>\n" +"<body>\n" +" <h3>hello world ! 這是一封Html郵件!</h3>\n" +"</body>\n" +"</html>";MailService.sendHtmlMail("xxxxxx@163.com","test simple mail",content); }發送帶附件的郵件
還是老樣子,在 MailService 添加 sendAttachmentsMail 方法。
添加多個附件可以使用多條 helper.addAttachment(fileName, file),然后在測試類中添加測試方法
@Test public void sendAttachmentsMail() {String filePath="e:\\tmp\\application.log";mailService.sendAttachmentsMail("xxxxx@163.com", "主題:帶附件的郵件", "有附件,請查收!", filePath); }發送帶靜態資源的郵件
郵件中的靜態資源一般就是指圖片,在 MailService 添加 sendAttachmentsMail 方法。
在測試類中添加測試方法
@Test public void sendInlineResourceMail() {String rscId = "neo006";String content="<html><body>這是有圖片的郵件:<img src=\'cid:" + rscId + "\' ></body></html>";String imgPath = "C:\\Users\\summer\\Pictures\\favicon.png";mailService.sendInlineResourceMail("XXXXX@163.com", "主題:這是有圖片的郵件", content, imgPath, rscId); }添加多個圖片可以使用多條 <img src='cid:" + rscId + "' > 和 helper.addInline(rscId, res)來實現
4.5、總結步驟
參考文章
5.郵件系統
上面發送郵件的基礎服務就這些了,但是如果我們要做成一個郵件系統的話還需要考慮以下幾個問題,首先是郵件模板的問題,我們會經常收到類似這樣的郵件
其中只有 neo 這個用戶名在變化,其它郵件內容均不變,如果每次發送郵件都需要手動拼接的話會不夠優雅,并且每次模板的修改都需要改動代碼的話也很不方便,因此對于這類郵件需求,都建議做成郵件模板來處理。模板的本質很簡單,就是在模板中替換變化的參數,轉換為 html 字符串即可,這里以thymeleaf為例來演示,第一步當然是導入thymeleaf的包啦。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>然后在在 resorces/templates 下創建 emailTemplate.html
<!DOCTYPE html> <html lang="zh" xmlns:th="http://www.thymeleaf.org"><head><meta charset="UTF-8"/><title>Title</title></head><body>您好,這是驗證郵件,請點擊下面的鏈接完成驗證,<br/><a href="#" th:href="@{ http://www.xxx.com/neo/{id}(id=${id}) }">激活賬號</a></body> </html> @Test public void sendTemplateMail() {//創建郵件正文Context context = new Context();context.setVariable("id", "006");String emailContent = templateEngine.process("emailTemplate", context);mailService.sendHtmlMail("ityouknow@126.com","主題:這是模板郵件",emailContent); }當然啦,這里要強調一點的是,我們在實現郵箱服務的時候,因為各種原因,總會有郵件發送失敗的情況,比如:郵件發送過于頻繁、網絡異常等。在出現這種情況的時候,我們一般會考慮重新重試發送郵件,會分為以下幾個步驟來實現:
最后
很多時候郵件發送并不是我們主業務必須關注的結果,比如通知類、提醒類的業務可以允許延時或者失敗。這個時候可以采用異步的方式(線程)來發送郵件,加快主交易執行速度,在實際項目中可以采用MQ發送郵件相關參數,監聽到消息隊列之后啟動發送郵件。
文章轉自
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的springboot集成邮箱功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 链计算:构建信任网络,致力无边界协同
- 下一篇: 中国市场新财富与新人群趋势