SpringBoot系列之郵件發送姿式介紹html
郵件發送,在實際的項目開發中,可能用的不是特別多,若是沒有特定的需求,相信也沒有多少小夥伴會特地的去關注,那麼若是如今咱們但願針對項目作一個異常的報警系統,當出現異常的時候,能夠向指定的小夥伴發送郵件提醒,那麼讓咱們來實現這個功能,能夠怎麼辦呢?java
這裏介紹一下如何使用SpringBoot封裝好的MailSender來實現郵件發送git
本項目藉助SpringBoot 2.2.1.RELEASE
+ maven 3.5.3
+ IDEA
進行開發github
開一個web服務用於測試web
<dependencies> <!-- 郵件發送的核心依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <!-- 適用於html模板形式的郵件發送,藉助freemarker來實現html模板渲染 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> </dependencies>
在開始以前,咱們須要先準備一個用於發送郵件的帳號,好比我這裏使用163的郵箱來發送郵件,須要先到郵箱提供商哪裏獲取受權碼,具體如何獲取這個東西,不一樣的郵箱姿式有些不一樣,各位小夥伴根據本身的實際狀況,搜索一下,相信很快就能get到spring
這裏簡單介紹下網易郵箱的獲取方式網絡
接下來設置發送郵件相關的配置信息,配置文件application.yml
app
spring: #郵箱配置 mail: host: smtp.163.com from: xhhuiblog@163.com # 使用本身的發送方用戶名 + 受權碼填充 username: password: default-encoding: UTF-8 properties: mail: smtp: auth: true starttls: enable: true required: true
接下來進入正題,咱們將從簡單基礎的文本郵件發送開始,逐漸介紹如何添加附件,使用漂亮的html模板等jsp
咱們這裏直接使用JavaMailSender
來發送一個基礎的文本郵件maven
@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(); //郵件發送人 simpleMailMessage.setFrom(from); //郵件接收人,能夠是多個,參數爲可變參數 simpleMailMessage.setTo("bangzewu@126.com"); //郵件主題,也就是標題 simpleMailMessage.setSubject("SpringBoot測試郵件發送"); //郵件內容 simpleMailMessage.setText("簡單的郵件正文"); javaMailSender.send(simpleMailMessage); } }
對於簡單的文本郵件發送,用上面的基本就夠了,若是咱們但願郵件的內容更美觀一點的話,能夠藉助HTML來實現排版
區別於上面的SimpleMailMessage, 這裏使用的是MimeMessage,來實現html內容發送
使用姿式與上面相比差很少,無非就是正文變成了html文本罷了
/** * 發送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測試郵件發送"); //郵件內容 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
方法的第二個參數,必須有,且爲true,不然會當成文本內容發送郵件中添加附件,咱們本身寫郵件的時候能夠直接選擇附件上傳,那麼代碼的實現方式又有什麼區別呢?
/** * 發送附件 */ 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測試郵件發送"); 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); }
注意上面的實現,與前面差異不大,關鍵點在於attachment
附件,上面的實現是在附件中添加一個圖片,爲了簡單起見,圖片是直接從網絡下載的,而後將Stream做爲傳參
上面的html發送,會發現須要咱們本身來組裝html正文,這個操做可能就不是很美好了,藉助頁面渲染引擎來實現郵件模板支持,能夠說是一個比較常見的方案了,這裏簡單介紹下Freemaker的實現姿式,至於themlaf, beef或者jsp啥的,都沒有太大的區別
首先寫一個郵件模板 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
,這個就是咱們須要替換的值
接下來是郵件發送實例
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測試郵件發送"); 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); }
注意上面的實現,關鍵點就利用FreeMarkerTemplateUtils
來實現模板的渲染,輸出html正文,所以若是想使用其餘的模板渲染引擎,就是改這裏便可
最後簡單的調用一下上面的實現,看下郵件是否能夠發送成功
本篇博文介紹了一下如何發送郵件,並針對簡單的文本郵件,html正文,附件等不一樣的給出了實例;總體看下來使用姿式不難,不過郵件的幾個術語能夠了解一下
接下來一篇博文,將介紹一下如何將log日誌與郵件發送關聯起來,當出現異常的時候,郵件發送給開發者
盡信書則不如,以上內容,純屬一家之言,因我的能力有限,不免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
下面一灰灰的我的博客,記錄全部學習和工做中的博文,歡迎你們前去逛逛