郵件發送這一功能在實際的項目中使用的是很是廣泛的,用戶忘記帳戶忘記密碼等不少操做都是經過郵件的方式來交互,所以郵件發送在web
開發中是必不可少一個功能模塊,本文就主要介紹如何在spring boot
中發送不一樣類型的郵件。html
文章首發於我的博客:【www.xiongfrblog.cn】java
Spring
自己提供了很好用的org.springframework.mail.javamail.JavaMailSender
接口來實現郵件發送功能,Spring boot
中也爲此提供了自動化配置,因此咱們使用起來很是方便。web
首先在pom.xml
文件中添加以下依賴:spring
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
複製代碼
添加依賴以後就須要在項目配置文件application.properties
中配置發送郵件相關的參數,具體以下:promise
spring.mail.host=smtp.163.com
spring.mail.username=xxx
spring.mail.password=xxx
spring.mail.default-encoding=UTF-8
複製代碼
重要的參數就這些,其它的使用默認的便可,如下爲解釋:springboot
spring.mail.host
:郵箱服務器地址,這個根據本身使用什麼郵箱有區別,好比:
smtp.163.com
:163郵箱smtp.126.com
:126郵箱smtp.qq.com
:qq郵箱spring.mail.username
:郵箱登錄用戶名。spring.mail.password
:第三方登錄受權碼(下面會具體介紹該受權碼的獲取方式)。spring.mail.default-encoding
:編碼方式POP3/SMTP
服務上面提到了受權碼的概念,首先要明確一個概念就是受權碼跟咱們直接登錄郵箱的密碼不是同樣的,受權碼能夠理解爲第三方客戶端登錄郵箱的密碼,要想獲取受權碼須要咱們去本身所用郵箱的官網設置開啓POP3/SMTP
以及IMAP/SMTP
服務,我這裏就以本身使用的163
帳號爲例介紹打開該服務以及獲取受權碼的步驟,如圖:bash
登錄163
郵箱官網,按照圖示步驟進行操做,在選擇了服務以後會給你發送驗證碼,輸入驗證碼以後就會讓你本身設置受權碼,這裏的受權碼就是上邊配置文件中spring.mail.password
須要填寫的值。服務器
對郵件的操做最好是封裝一個類以便代碼重用以及維護,我這裏封裝成一個service
層。app
定義接口IMailService.interface
:框架
package com.web.springbootmail.service;
/** * @author Promise * @createTime 2019年3月30日 下午3:14:14 * @description */
public interface IMailService {
/** * 簡單文本郵件 * @param toUser 郵件接收者 */
void simpleMil(String toUser)throws Exception;
/** * html郵件 * @param toUser 郵件接收者 */
void htmlMail(String toUser) throws Exception;
/** * 帶附件郵件 * @param toUser 郵件接收者 */
void attachmentMail(String toUser)throws Exception;
/** * 帶圖片郵件 * @param toUser 郵件接收者 */
void imgMail(String toUser)throws Exception;
/** * 模板郵件 * @param toUser 郵件接收者 */
void TemplateMail(String toUser)throws Exception;
}
複製代碼
實現類MailServiceimpl.java
:
package com.web.springbootmail.service.impl;
import java.io.File;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
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 org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import com.web.springbootmail.service.IMailService;
/** * @author Promise * @createTime 2019年3月30日 下午3:14:37 * @description 郵件發送服務類 */
@Service("mailService")
public class MailServiceImpl implements IMailService{
@Autowired
private JavaMailSender jms;
@Autowired
private TemplateEngine templateEngine;
@Value("${spring.mail.username}")
private String from;
@Override
public void simpleMil(String toUser) {
}
@Override
public void htmlMail(String toUser) {
// TODO Auto-generated method stub
}
@Override
public void attachmentMail(String toUser) {
// TODO Auto-generated method stub
}
@Override
public void imgMail(String toUser) {
// TODO Auto-generated method stub
}
@Override
public void TemplateMail(String toUser) {
// TODO Auto-generated method stub
}
}
複製代碼
這裏只給出了框架,具體實現下面依次介紹,上面還注入了三個變量:
jms
:郵件發送接口templateEngine
:發送模板郵件時解析模板from
:讀取配置文件中配置的郵件發送者的帳號下面介紹每一種郵件的具體實現
這一類郵件最簡單,使用SimpleMailMessage
對象,代碼以下:
@Override
public void simpleMil(String toUser) {
// TODO Auto-generated method stub
//初始化簡單郵件對象
SimpleMailMessage message = new SimpleMailMessage();
//郵件發送者
message.setFrom(from);
//郵件接收者
message.setTo(toUser);
//郵件標題
message.setSubject("簡單郵件");
//郵件內容
message.setText("簡單內容");
//發送郵件
jms.send(message);
}
複製代碼
這一類郵件使用的是MimeMessage
對象,可豐富頁面樣式,代碼以下:
@Override
public void htmlMail(String toUser) throws MessagingException {
// TODO Auto-generated method stub
MimeMessage message = jms.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(toUser);
helper.setSubject("html格式郵件");
//內容爲html格式
String content = "<p style='color:yellow;'>這是一封html格式的文件</p><h1>這是一封html格式的文件</h1>";
//true表示以html格式發送郵件
helper.setText(content, true);
jms.send(message);
}
複製代碼
這一類郵件多了添加附件的過程,也使用MimeMessage
,代碼以下:
@Override
public void attachmentMail(String toUser) throws MessagingException {
// TODO Auto-generated method stub
MimeMessage message = jms.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(toUser);
helper.setSubject("帶附件郵件");
//加載絕對路徑資源
FileSystemResource fs = new FileSystemResource(new File("D:\\DownLoad\\file\\阿里巴巴Java開發手冊v1.2.0.pdf"));
helper.setText("這是一封帶附件的郵件!");
//添加附件資源
helper.addAttachment("阿里巴巴Java開發手冊v1.2.0.pdf", fs);
jms.send(message);
}
複製代碼
這裏的文件路徑本地文件的絕對路勁。
代碼以下:
@Override
public void imgMail(String toUser) throws MessagingException {
// TODO Auto-generated method stub
MimeMessage message = jms.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(toUser);
helper.setSubject("帶圖片郵件");
//設置資源的cid
String content = "<html><body>博客頭像<img src='cid:img'/></body></html>";
helper.setText(content, true);
FileSystemResource fs = new FileSystemResource(new File("D:\\DownLoad\\img\\20171123181522_c48800.jpg"));
//和上邊的cid要對應
helper.addInline("img", fs);
jms.send(message);
}
複製代碼
其實這種方式也是html郵件,只是多了靜態資源,好比咱們這裏就在頁面上添加了一張圖片,步驟跟添加附件有點相似,可是須要注意的是靜態資源須要給靜態資源設置cid,以便存在多個靜態資源區分。
模板郵件指的是郵件的主體內容都是同樣的,只是有一部分不同,這樣咱們就能夠定義一個郵件的模板,發送郵件的時候咱們直接傳入參數就能夠了,是一種很好的封裝。
這裏我使用的模板解析框架爲thymeleaf
,因此須要先在項目pom.xml
文件中添加依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
複製代碼
接下來在src/main/resources/templates
目錄下新建MailTemplate.html
文件,內容以下:
<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>您好,<span th:text="${username}"></span>:這是來自測試的郵件模板!</h2>
</body>
</html>
複製代碼
使用具體代碼以下:
@Override
public void TemplateMail(String toUser) throws MessagingException {
// TODO Auto-generated method stub
MimeMessage message = jms.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(toUser);
helper.setSubject("模板郵件");
Context context = new Context();
//給模板傳入參數,username要與模板中變量名一致,promise爲測試數據
context.setVariable("username", "promise");
//thymeleaf模板默認會從src/main/resources/tempaltes目錄下尋找文件,填入咱們定義的模板名,不須要寫後綴。
String template = templateEngine.process("MailTemplate", context);
helper.setText(template, true);
jms.send(message);
}
複製代碼
封裝好了發送郵件的工具類以後,咱們直接在controller
調用便可,代碼以下:
package com.web.springbootmail.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.web.springbootmail.service.IMailService;
/** * @author Promise * @createTime 2019年4月1日 下午9:30:38 * @description 郵件發送 */
@RequestMapping("/mail")
@RestController
public class EmailController {
@Autowired
private IMailService mailService;
@GetMapping("/simple")
public Map<String, Object> sendSimpleMail() {
Map<String, Object> map =new HashMap<>();
try {
//參數就是接收郵件的郵箱,根據本身實際填寫
mailService.simpleMil("*****@qq.com");
map.put("res", "success");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
map.put("res", "error");
}
return map;
}
@GetMapping("/htmlMail")
public Map<String, Object> htmlMail(){
Map<String, Object> map =new HashMap<>();
try {
mailService.htmlMail("*****@qq.com");
map.put("res", "success");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
map.put("res", "error");
}
return map;
}
@GetMapping("/attachmentsMail")
public Map<String, Object> attachmentsMail(){
Map<String, Object> map =new HashMap<>();
try {
mailService.attachmentMail("*****@qq.com");
map.put("res", "success");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
map.put("res", "error");
}
return map;
}
@GetMapping("/imgMail")
public Map<String, Object> imgMail(){
Map<String, Object> map =new HashMap<>();
try {
mailService.imgMail("*****@qq.com");
map.put("res", "success");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
map.put("res", "error");
}
return map;
}
@GetMapping("/templateMail")
public Map<String, Object> templateMail(){
Map<String, Object> map =new HashMap<>();
try {
mailService.TemplateMail("*****@qq.com");
map.put("res", "success");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
map.put("res", "error");
}
return map;
}
}
複製代碼
啓動項目,訪問localhost:8080/mail/simple
,此時個人收件箱收到以下郵件:
訪問localhost:8080/mail/htmlMail
,效果以下:
訪問localhost:8080/mail/attachmentsMail
,效果以下:
訪問localhost:8080/mail/imgMail
,效果以下:
訪問localhost:8080/mail/templateMail
,效果以下:
好了,關於spring boot
配置郵件發送功能就到這裏了,感謝閱讀,bye~