講解了日誌相關的知識點後。今天來點相對簡單的,通常上,咱們在開發一些註冊功能、發送驗證碼或者訂單服務時,都會經過短信或者郵件的方式通知消費者,註冊或者訂單的相關信息。並且基本上郵件的內容都是模版,一些差別化的可根據實際狀況來進行替換。好比12306購票成功後,會發送一封購票信息郵件;在京東下單成功後,也會收到一封包含訂單的郵件。因此,今天就來說講如何利用
Spring
提供的JavaMailSender
接口,實現郵件發送功能。html
講解前,咱們先來簡單瞭解下相關郵件知識。java
JavaMail介紹 JavaMail
是由Sun
定義的一套收發電子郵件的API
,不一樣的廠商能夠提供本身的實現類。但它並無包含在JDK中,而是做爲JavaEE
的一部分。而JavaMailSender
底層也是基於JavaMail
jar包的,官網介紹時就說了依賴關係: git
郵件通訊協議github
這三種協議都有對應SSL加密傳輸的協議,分別是SMTPS
,POP3S
和IMAPS
。除JavaMail
服務提供程序以外,JavaMail
還須要JAF(JavaBeans Activation Framework)
來處理不是純文本的郵件內容,這包括MIME(多用途互聯網郵件擴展)、URL頁面和文件附件等內容。web
JavaMail關鍵對象spring
這個不要混淆了,和web
中的session
不同的,簡單來講,它就是配置的集合。 Session的主要做用包括兩個方面:apache
Transport和Store:傳輸和存儲 郵件操做只有發送或接收兩種處理方式,JavaMail
將這兩種不一樣操做描述爲傳輸(javax.mail.Transport)
和存儲(javax.mail.Store)
,傳輸對應郵件的發送,而存儲對應郵件的接收。api
Message:消息對象 一旦得到Session
對象,就能夠繼續建立要發送的消息。Message
是個抽象類,經常使用的實現類爲:javax.mail.internet.MimeMessage
(下文中使用它來實現附件發送)。緩存
Address:地址 建立了Session
和Message
,並將內容填入消息後,就能夠用Address
肯定信件地址了。Address
也是個抽象類。對應經常使用實現類:javax.mail.internet.InternetAddress
。springboot
其餘相關信息,可點擊查看:https://blog.csdn.net/a2241076850/article/details/52856863講解的比較清楚。這裏就不闡述了(本人也是不甚瞭解,只是寫這篇文章時,有搜索了些相關資料) Spring
封裝後,使用起來基本上都不須要去關心這些對象值了,簡單瞭解下便可。固然了,有興趣,能夠搜索下相關資料。也能夠去官網查看:https://java.net/projects/javamail/pages/Home
SpringBoot
中,集成郵件發送功能,是很簡單的。只需引入spring-boot-starter-mail
便可,如下就簡單的介紹下如何發送不一樣格式的郵件,已知足不一樣的業務需求。
前提條件 0.加入pom
依賴
<!-- 加入mail pom --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
1.配置文件加入相關配置信息,如發送方郵箱信息等。
# 郵件相關 # SMTP服務器地址 spring.mail.host=smtp.qq.com # SMTP服務器端口號 # spring.mail.port=25 # 發送方賬號 spring.mail.username=郵箱 # 發送方密碼(受權碼) spring.mail.password=郵箱密碼 #javaMailProperties 配置 # 開啓用戶身份驗證 spring.mail.properties.mail.smtp.auth=true # STARTTLS:一種通訊協議,具體能夠搜索下 #spring.mail.properties.mail.smtp.starttls.enable=true #spring.mail.properties.mail.smtp.starttls.required=true
**這裏須要注意:**使用QQ郵箱
發送時,須要開通POP3/SMTP
服務,郵箱密碼是填寫受權碼
的,而不是郵箱密碼,這個須要注意下。具體網站說明:在設置
-->帳戶
-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務
有說明,你們可自行獲取受權碼。
關於JavaMailSender
使用文檔,能夠查看官網指南:https://docs.spring.io/spring/docs/4.3.18.RELEASE/spring-framework-reference/htmlsingle/#mail。
3.引入JavaMailSender
接口對象,已經自動注入了,只需引入便可。
@Autowired private JavaMailSender mailSender;
具體可查看spring-boot-autoconfigure
jar包下的org.springframework.boot.autoconfigure.mail
類,裏面已經引入了JavaMailSenderImpl
實現類了。
純文本格式,比較簡單,使用
SimpleMailMessage
便可。
/** * 純文本格式 * @return */ @GetMapping("/simple") public String simpleSend() { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom("499452441@qq.com"); message.setTo("499452441@qq.com"); message.setSubject("主題:來自oKong郵件"); message.setText("公衆號:一枚趔趄的猿(lqdevOps),做者:oKong"); mailSender.send(message); return "發送成功!"; }
啓動後,發送,一切正常狀況下,能夠看見郵件發送成功了。
上文有提到,建立附件時,可以使用
MimeMessage
消息對象。使用也很簡單,以下:
@GetMapping("/attach") public String attachSend() throws MessagingException { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom("499452441@qq.com"); helper.setTo("499452441@qq.com"); helper.setSubject("主題:來自oKong郵件(帶附件)"); helper.setText("(含附件)公衆號:一枚趔趄的猿(lqdevOps),做者:oKong"); //添加附件 File qrCode = new File("wxgzh8cm.jpg"); //建議文件帶上後綴,可支持在線預覽 helper.addAttachment("公衆號二維碼.jpg", qrCode); mailSender.send(mimeMessage); return "附件郵件發送成功!"; }
說明:主要就是利用addAttachment
方法進行附件添加,可添加多個。附件名稱建議帶上後綴。
運行後,便可看見郵件已發送成功:
以上的格式,基本都是純文本格式。咱們知道,在發送郵件時,通常上可使用
html
格式進行發送,可嵌入靜態資源,如圖片等等。而JavaMailSender
中使用也很簡單,主要就是利用MimeMessageHelper
類的setText(String text, boolean html)
方法。
/** * html格式 * @return * @throws MessagingException */ @GetMapping("/html") public String htmlSend() throws MessagingException { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom("499452441@qq.com"); helper.setTo("499452441@qq.com"); helper.setSubject("主題:來自oKong郵件(帶附件)"); helper.setText("<html><body><div>(含附件)公衆號:一枚趔趄的猿(lqdevOps),做者:oKong</div><div><img src='cid:winxinQr'></div></body></html>",true); //抄送人 // helper.setCc(""); //密送人 // helper.setBcc(""); //添加附件 File qrCode = new File("wxgzh8cm.jpg"); //建議文件帶上後綴,可支持在線預覽 helper.addAttachment("公衆號二維碼.jpg", qrCode); helper.addInline("winxinQr", qrCode); mailSender.send(mimeMessage); return "附件郵件發送成功!"; }
注意:這裏的cid(Content-ID)
是固定寫法,冒號後面的值即爲須要替換資源的contentId
值,就是對應addInline
的資源id。 並且注意官網的一句話:Be sure to first add the text and after that the resources. If you are doing it the other way around, it won’t work! 順序不能顛倒了,須要先設置text
,以後添加資源信息!
啓動後,一切正常便可看見郵件內容以下:
業務開發時,通常上發送的郵件格式都是固定的,而是替換部分參數便可,如用戶信息、訂單信息等。因此,咱們能夠利用以前講解過的
模版引擎
進行管理各種模版郵件,同時在發送時替換對應的參數值。如下以freemarker
模版引擎爲例子。
關於模版引擎的使用,可點擊查看文章:第十六章:web應用開發
0.引入pom依賴
<!-- 加入模版引擎 freemarker --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency>
1.加入配置信息,指定模版目錄、後綴名等:
# 緩存配置 開發階段應該配置爲false 由於常常會改 spring.freemarker.cache=false # 模版後綴名 默認爲ftl spring.freemarker.suffix=.ftl # 文件編碼 spring.freemarker.charset=UTF-8 # 模版加載的目錄 spring.freemarker.template-loader-path=classpath:/templates/
2.編寫模版文件(放在resources\templates
目錄下),主要就是替換userName
變量:
mail.ftl
<html> <body> <div> 尊敬的${userName}: </div> <div > 您好! </div> <div > 多謝關注公衆號:一枚趔趄的猿(ledevOps),分享程序猿平常,不按期發佈關於SpringBoot、SpringCloud、Java及其餘相關教程,記錄工做中碰到的問題。歡迎關注~ </div> <div > 一塊兒學習,共同進步! </div> <div > <img src="cid:winxinQr"> </div> </body> </html>
3.編寫具體實現類:
//自動注入 @Autowired freemarker.template.Configuration freemarkerConfig; @GetMapping("/template") public String template(String userName) throws Exception { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom("499452441@qq.com"); helper.setTo("499452441@qq.com"); helper.setSubject("主題:" + userName + ",你有一封來自oKong郵件(From模版)"); //設置替換的參數對象 Map<String, Object> model = new HashMap<String, Object>(); model.put("userName", StringUtils.isEmpty(userName) ? "oKong" : userName); String templateString = FreeMarkerTemplateUtils.processTemplateIntoString(freemarkerConfig.getTemplate("mail.ftl"), model); helper.setText(templateString,true); //抄送人 // helper.setCc(""); //密送人 // helper.setBcc(""); //添加附件 File qrCode = new File("wxgzh8cm.jpg"); //建議文件帶上後綴,可支持在線預覽 helper.addAttachment("公衆號二維碼.jpg", qrCode); helper.addInline("winxinQr", qrCode); mailSender.send(mimeMessage); return "模版文件發送成功!"; }
這裏說明下:
使用FreeMarker
模版時,可直接使用Spring
提供的工具類FreeMarkerTemplateUtils
的processTemplateIntoString
方法進行模版文件的替換。而freemarker.template.Template
類,熟悉FreeMarker
的同窗應該知道,能夠直接從配置類freemarker.template.Configuration
中獲取,此類直接注入便可,SpringBoot
在啓動時,已經注入這個bean
了。具體的自動配置可查看:org.springframework.boot.autoconfigure.freemarker
類。
關於一些Freemarker
的語法這裏就不說明了,你們可到官網查看下:https://freemarker.apache.org/docs/index.html或者,中文參考(可能版本不是最新):http://freemarker.foofun.cn/toc.html
啓動後,一切正常狀況下能夠看見以下:郵件內容已被替換了:
本註解主要簡單的講解了如何利用
JavaMailSender
發送各種格式的郵件。這裏只是演示了以JavaMailSender
發送郵件時,使用是很簡單的,只須要調用相應的api方法便可。想了解底層如何實現的同窗,建議搜索下相關JavaMail
的知識,加深印象。
目前互聯網上不少大佬都有
SpringBoot
系列教程,若有雷同,請多多包涵了。原創不易,碼字不易,還但願你們多多支持。若文中有所錯誤之處,還望提出,謝謝。
499452441
lqdevOps
我的博客:http://blog.lqdev.cn
完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-26
原文地址:http://blog.lqdev.cn/2018/08/29/springboot/chapter-twenty-six