SpringBoot實現(xiàn)郵件發(fā)送功能的姿勢分享
前言
郵件發(fā)送,在實際的項目開發(fā)中,可能用的不是特別多,如果沒有特定的需求,相信也沒有多少小伙伴會特意的去關(guān)注,那么如果現(xiàn)在我們希望針對項目做一個異常的報警系統(tǒng),當(dāng)出現(xiàn)異常的時候,可以向指定的小伙伴發(fā)送郵件提醒,那么讓我們來實現(xiàn)這個功能,可以怎么辦呢?
這里介紹一下如何使用SpringBoot封裝好的MailSender來實現(xiàn)郵件發(fā)送
I. 項目環(huán)境
1. 項目依賴
本項目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA進行開發(fā)
開一個web服務(wù)用于測試
<dependencies> <!-- 郵件發(fā)送的核心依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <!-- 適用于html模板形式的郵件發(fā)送,借助freemarker來實現(xiàn)html模板渲染 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> </dependencies>
2. 配置
在開始之前,我們需要先準備一個用于發(fā)送郵件的賬號,比如我這里使用163的郵箱來發(fā)送郵件,需要先到郵箱提供商哪里獲取授權(quán)碼,具體如何獲取這個東西,不同的郵箱姿勢有些不同,各位小伙伴根據(jù)自己的實際情況,搜索一下,相信很快就能get到
這里簡單介紹下網(wǎng)易郵箱的獲取方式
接下來設(shè)置發(fā)送郵件相關(guān)的配置信息,配置文件application.yml
spring: #郵箱配置 mail: host: smtp.163.com from: xhhuiblog@163.com # 使用自己的發(fā)送方用戶名 + 授權(quán)碼填充 username: password: default-encoding: UTF-8 properties: mail: smtp: auth: true starttls: enable: true required: true
II. 郵件發(fā)送
接下來進入正題,我們將從簡單基礎(chǔ)的文本郵件發(fā)送開始,逐漸介紹如何添加附件,使用漂亮的html模板等
1. 簡單文本郵件發(fā)送
我們這里直接使用JavaMailSender來發(fā)送一個基礎(chǔ)的文本郵件
@Service public class MailDemo { @Autowired private JavaMailSender javaMailSender; @Value("${spring.mail.from:xhhuiblog@163.com}") private String from; private void basicSend() { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); //郵件發(fā)送人 simpleMailMessage.setFrom(from); //郵件接收人,可以是多個,參數(shù)為可變參數(shù) simpleMailMessage.setTo("bangzewu@126.com"); //郵件主題,也就是標題 simpleMailMessage.setSubject("SpringBoot測試郵件發(fā)送"); //郵件內(nèi)容 simpleMailMessage.setText("簡單的郵件正文"); javaMailSender.send(simpleMailMessage); } }
- JavaMailSender: 直接作為一個Spring 的bean對象使用
- SimpleMailMessage:簡單的郵件對象,里面有一些郵件發(fā)送時,關(guān)聯(lián)的基礎(chǔ)信息
- from: 發(fā)送方
- replyTo: 郵件回復(fù)的收件人
- to: 收件人
- cc: 抄送
- bcc: 密送
- subject: 主題,也就是郵件標題
- text: 郵件正文,文本格式
- date: 郵件發(fā)送時間
2. html發(fā)送
對于簡單的文本郵件發(fā)送,用上面的基本就夠了,如果我們希望郵件的內(nèi)容更美觀一點的話,可以借助HTML來實現(xiàn)排版
區(qū)別于上面的SimpleMailMessage, 這里使用的是MimeMessage,來實現(xiàn)html內(nèi)容發(fā)送
使用姿勢與上面相比差不多,無非就是正文變成了html文本罷了
/** * 發(fā)送html */ public void sendHtml() throws MessagingException { MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true); mimeMessageHelper.setFrom(from); mimeMessageHelper.setTo("bangzewu@126.com"); mimeMessageHelper.setSubject("SpringBoot測試郵件發(fā)送"); //郵件內(nèi)容 mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " + "<div> 歡迎點擊 <a href=\"https://blog.hhui.top\">一灰灰博文地址</a><br/>" + " <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" + "</div>", true); javaMailSender.send(mimeMailMessage); }
重點注意
注意上面的setText方法的第二個參數(shù),必須有,且為true,否則會當(dāng)成文本內(nèi)容發(fā)送
3. 添加附件
郵件中添加附件,我們自己寫郵件的時候可以直接選擇附件上傳,那么代碼的實現(xiàn)方式又有什么區(qū)別呢?
/** * 發(fā)送附件 */ public void sendWithFile() throws MessagingException, IOException { MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true); mimeMessageHelper.setFrom(from); mimeMessageHelper.setTo("bangzewu@126.com"); mimeMessageHelper.setSubject("SpringBoot測試郵件發(fā)送"); mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " + "<div> 歡迎點擊 <a href=\"https://blog.hhui.top\">一灰灰博文地址</a><br/>" + " <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" + "</div>"); String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg"; URL imgUrl = new URL(url); mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream); javaMailSender.send(mimeMailMessage); }
注意上面的實現(xiàn),與前面差別不大,關(guān)鍵點在于attachment附件,上面的實現(xiàn)是在附件中添加一個圖片,為了簡單起見,圖片是直接從網(wǎng)絡(luò)下載的,然后將Stream作為傳參
4. Freemaker模板
上面的html發(fā)送,會發(fā)現(xiàn)需要我們自己來組裝html正文,這個操作可能就不是很美好了,借助頁面渲染引擎來實現(xiàn)郵件模板支持,可以說是一個比較常見的方案了,這里簡單介紹下Freemaker的實現(xiàn)姿勢,至于themlaf, beef或者jsp啥的,都沒有太大的區(qū)別
首先寫一個郵件模板 resources/template/mail.ftl
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content="SpringBoot thymeleaf"/> <meta name="author" content="YiHui"/> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>郵件模板</title> </head> <style> .title { color: #c00; font-weight: normal; font-size: 2em; } .content { color: darkblue; font-size: 1.2em; } .sign { color: lightgray; font-size: 0.8em; font-style: italic; } </style> <body> <div> <div class="title">${title}</div> <div class="content">${content}</div> </div> </body> </html>
上面的模板中,定義了兩個變量,一個title,一個content,這個就是我們需要替換的值
接下來是郵件發(fā)送實例
import freemarker.template.Configuration; @Autowired private Configuration configuration; /** * freemarker 模板 */ public void freeMakerTemplate() throws MessagingException, IOException, TemplateException { MimeMessage mimeMailMessage = javaMailSender.createMimeMessage(); MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true); mimeMessageHelper.setFrom(from); mimeMessageHelper.setTo("bangzewu@126.com"); mimeMessageHelper.setSubject("SpringBoot測試郵件發(fā)送"); Map<String, Object> map = new HashMap<>(); map.put("title", "郵件標題"); map.put("content", "郵件正文"); String text = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), map); mimeMessageHelper.setText(text, true); String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg"; URL imgUrl = new URL(url); mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream); javaMailSender.send(mimeMailMessage); }
注意上面的實現(xiàn),關(guān)鍵點就利用FreeMarkerTemplateUtils來實現(xiàn)模板的渲染,輸出html正文,因此如果想使用其他的模板渲染引擎,就是改這里即可
5. 測試與小結(jié)
最后簡單的調(diào)用一下上面的實現(xiàn),看下郵件是否可以發(fā)送成功
本篇博文介紹了一下如何發(fā)送郵件,并針對簡單的文本郵件,html正文,附件等不同的給出了實例;整體看下來使用姿勢不難,不過郵件的幾個術(shù)語可以了解一下
- to: 接收人,就是郵件發(fā)送的目標群眾
- cc: 抄送,一般來講抄送的名單,只是讓他感知到有這封郵件,屬于周知對象
- bcc: 密送,與上面兩個不一樣,接收人和抄送人不知道密送給誰了,這就是最大的區(qū)別,說實話這個玩意我從沒用過
接下來一篇博文,將介紹一下如何將log日志與郵件發(fā)送關(guān)聯(lián)起來,當(dāng)出現(xiàn)異常的時候,郵件發(fā)送給開發(fā)者
III. 不能錯過的源碼和相關(guān)知識點
0. 項目
工程:github.com/liuyueyi/sp…
源碼:github.com/liuyueyi/sp…
總結(jié)
到此這篇關(guān)于SpringBoot實現(xiàn)郵件發(fā)送功能的文章就介紹到這了,更多相關(guān)SpringBoot郵件發(fā)送內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中構(gòu)造器內(nèi)部調(diào)用構(gòu)造器實例詳解
在本篇文章里小編給大家分享的是關(guān)于java中構(gòu)造器內(nèi)部調(diào)用構(gòu)造器實例內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-05-05MyBatis入門之增刪改查+數(shù)據(jù)庫字段和實體字段不一致問題處理方法
這篇文章主要介紹了MyBatis入門之增刪改查+數(shù)據(jù)庫字段和實體字段不一致問題處理方法,需要的朋友可以參考下2017-05-05關(guān)于json解析多層嵌套并轉(zhuǎn)為對應(yīng)類(List)
在進行JSON解析時,遇到多層嵌套結(jié)構(gòu)可通過遞歸或?qū)S脦靵韺崿F(xiàn),重要的是將嵌套的JSON對象準確轉(zhuǎn)化為對應(yīng)的Java類,通常需要依賴如Gson或Jackson等庫,將JSONObject轉(zhuǎn)為JavaBean時,關(guān)注字段匹配與數(shù)據(jù)類型轉(zhuǎn)換2024-10-10學(xué)習(xí)Java多線程之線程定義、狀態(tài)和屬性
這篇文章主要為大家詳細介紹了Java多線程之線程定義、狀態(tài)和屬性,感興趣的小伙伴們可以參考一下2016-02-02Jaxb2實現(xiàn)JavaBean與xml互轉(zhuǎn)的方法詳解
這篇文章主要介紹了Jaxb2實現(xiàn)JavaBean與xml互轉(zhuǎn)的方法,簡單介紹了JAXB的概念、功能及實現(xiàn)JavaBean與xml互轉(zhuǎn)的具體操作技巧,需要的朋友可以參考下2017-04-04