Spring Boot實戰系列-----------郵件發送

快速導航

添加maven依賴

Spring Boot項目的pom.xml文件中引入spring-boot-starter-email依賴html

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-email</artifactId> <scope>email</scope> </dependency> 複製代碼

模版郵件須要引入 spring-boot-starter-thymeleaf 插件java

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 複製代碼

配置文件增長郵箱相關配置

163郵箱配置,注意要替換本身的帳戶信息,password爲受權碼。git

application.ymlgithub

spring:  mail:  host: smtp.163.com  username: your163account@163.com  password: your163password  default-encoding: utf-8 複製代碼

QQ郵箱發送郵件配置,如下password爲受權碼web

spring:  mail:  host: smtp.qq.com  username: yourqqaccount@qq.com  password: yourQQpassword 複製代碼

項目構建

基於上節單元測試chapter5-1代碼示例基礎之上編寫spring

業務層代碼

service目錄下建立MailService.java文件,負責業務層郵件發送功能編寫數組

讓咱們利用Spring提供的JavaMailSender接口實現郵件發送,在項目中使用到地方用@Autowired注入郵件發送對象bash

MailService.javaapp

package com.angelo.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; @Service public class MailService { @Value("${spring.mail.username}") private String from; @Autowired // 項目啓動時將mailSender注入 private JavaMailSender javaMailSender; // ... 下面會一一介紹 ... } 複製代碼

單元測試層代碼

test測試目錄下建立MailServiceTest.java測試類,對業務層代碼進行單元測試maven

MailServiceTest.java

package com.angelo.service; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import javax.annotation.Resource; import javax.mail.MessagingException; import java.lang.reflect.Array; import static org.junit.Assert.*; @RunWith(SpringRunner.class) @SpringBootTest public class MailServiceTest { @Autowired private MailService mailService; @Resource TemplateEngine templateEngine; String to = "your163password@163.com"; // ... 下面爲一一介紹 ... } 複製代碼

五種郵件發送類型講解

文本郵件

SimpleMailMessage封裝了簡單郵件的發送、接收功能、監測異常模塊功能,這也是最簡單的一種郵件發送,建立一個郵件消息對象,設置郵件的發送者、發送對象、郵件主題、郵件內容。

  • 業務層MailService.java
/** * 發送文本郵件 * @param to * @param subject * @param content */ public void sendTextMail(String to, String subject, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); // 發送對象 message.setSubject(subject); // 郵件主題 message.setText(content); // 郵件內容 message.setFrom(from); // 郵件的發起者 javaMailSender.send(message); } 複製代碼

對以上業務代碼進行單元測試,查看下效果

  • 單元測試層MailServiceTest.java
@Test public void sendTextEmailTest() { mailService.sendTextMail(to, "發送文本郵件", "hello,這是Spring Boot發送的一封文本郵件!"); } 複製代碼
  • 測試結果

 

圖片描述

 

html郵件

基於MimeMessageHelper建立helper對象,設置setText第二個參數爲true,將會使用html格式打印郵件。

  • 業務層MailService.java
/** * 發送HTMl郵件 * @param to * @param subject * @param content * @throws MessagingException */ public void sendHtmlMail(String to, String subject, String content) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); javaMailSender.send(message); } 複製代碼
  • 單元測試層MailServiceTest.java
@Test public void sendHtmlEmailTest() throws MessagingException { String content = "<html>" + "<body>" + "<h1 style=\"" + "color:red;" + "\">hello,這是Spring Boot發送的一封HTML郵件</h1>" + "</body></html>"; mailService.sendHtmlMail(to, "發送HTML郵件", content); } 複製代碼
  • 測試結果

能夠看到郵件結果使用了例子中預先設置好的郵件格式

 

圖片描述

 

附件郵件

  • 業務層MailService.java
/** * 發送帶附件的郵件 * @param to * @param subject * @param content * @param filePathList * @throws MessagingException */ public void sendAttachmentMail(String to, String subject, String content, String[] filePathList) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); for (String filePath: filePathList) { System.out.println(filePath); FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath)); String fileName = fileSystemResource.getFilename(); helper.addAttachment(fileName, fileSystemResource); } javaMailSender.send(message); } 複製代碼

filePathList寫上你的附件文件路徑,數組格式。

  • 單元測試層MailServiceTest.java
@Test public void sendAttachmentEmailTest() throws MessagingException { String[] filePathList = new String[2]; filePathList[0] = "/SpringBoot-WebApi/chapter4.zip"; filePathList[1] = "/SpringBoot-WebApi/chapter5.zip"; mailService.sendAttachmentMail(to, "發送附件郵件", "hello,這是Spring Boot發送的一封附件郵件!", filePathList); } 複製代碼
  • 測試結果

 

圖片描述

 

html內嵌圖片郵件

也是基於html郵件發送,經過內嵌圖片等靜態資源,能夠直接看到圖片。

  • 業務層MailService.java
/** * 發送html內嵌圖片的郵件 * @param to * @param subject * @param content * @param srcPath * @param srcId * @throws MessagingException */ public void sendHtmlInlinePhotoMail(String to, String subject, String content, String srcPath, String srcId) throws MessagingException { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(content, true); FileSystemResource fileSystemResource = new FileSystemResource(new File(srcPath)); helper.addInline(srcId, fileSystemResource); javaMailSender.send(message); } 複製代碼

如下單元測試中srcPath爲您的本地圖片路徑,srcId要和上面業務層的helper.addInline(srcId, fileSystemResource)srcId保持一致。

  • 單元測試層MailServiceTest.java
@Test public void sendHtmlInlinePhotoMailTest() throws MessagingException { String srcPath = "/SpringBoot-WebApi/chapter6/img/pic18.jpg"; String srcId = "pic18"; String content = "<html>" + "<body>" + "<h2>hello,這是Spring Boot發送的一封HTML內嵌圖片的郵件</h2>" + "<img src=\'cid:"+ srcId +"\'></img>" + "</body></html>"; mailService.sendHtmlInlinePhotoMail(to, "發送圖片郵件", content, srcPath, srcId); } 複製代碼
  • 測試結果

 

圖片描述

 

模板郵件

郵件內容相對簡單的狀況下,咱們能夠選擇使用以上幾種簡單郵件發送方法,在複雜業務中須要用到html結構,且html裏的數據還須要動態修改,仍是選擇模版郵件,可使用Freemarkerthymeleaf等模板引擎,這裏主要介紹使用thymeleaf

  • 郵件模板編寫

resources/templates目錄下新建emailTemplate.html文件

<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>模板郵件</title> </head> <body> 您好,<span th:text="${username}"></span>,歡迎訪問個人我的博客: <a href="https://github.com/Q-Angelo/summarize">Github</a>、 <a th:href="@{https://www.imooc.com/u/{id}(id=${id})}" href="#">慕課網</a> </body> </html> 複製代碼

利用上面介紹的發送html郵件便可,在單元測試文件中增長一個方法進行測試。

  • 單元測試層MailServiceTest.java
@Test public void testTemplateEmailTest() throws MessagingException { Context context = new Context(); context.setVariable("username", "張三"); context.setVariable("id", "2667395"); String emailContent = templateEngine.process("emailTemplate", context); mailService.sendHtmlMail(to, "發送模板郵件", emailContent); } 複製代碼
  • 測試結果

 

圖片描述

 

常見問題

出現這個錯誤的緣由是網易將我發送的郵件當成了垃圾郵件,<<發送163文本郵件>>這是我填寫的郵件標題,後來發現網易是對標題裏面含了163致使的,你們遇到相似問題多檢查下。

com.sun.mail.smtp.SMTPSendFailedException: 554 DT:SPM 163 smtp10,DsCowADH1MxWegtcyxFjDw--.48939S2 1544256086
複製代碼

如遇到什麼問題可在下方評論區提問

Github查看本文完整示例 chapter6-1

做者:五月君
連接:www.imooc.com/article/267…
來源:慕課網
Github: Spring Boot實戰系列

做者:五月君連接:https://juejin.im/post/5c198ddff265da611801a465

相關文章
相關標籤/搜索