面記錄使用springboot發(fā)送四種郵件的方法:普通文本、html、附件、模板html
gradle:
compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'
maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>3.0.3</version>
</dependency>
spring-boot-starter-mail實現(xiàn)郵件發(fā)送
spring-boot-starter-thymeleaf實現(xiàn)模板的創(chuàng)建
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>這是一個測試的模板</title>
</head>
<body>
您的賬號存在異常,請點擊下面鏈接進行安全驗證<br/>
<a href="#" th:href="@{http://www.lalalala.com/{userid}(userid=${userid})}">安全驗證</a>
</body>
</html>
package com.iscas.biz.test.controller;
import com.iscas.templet.common.BaseController;
import com.iscas.templet.common.ResponseEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
/**
* 郵件發(fā)送測試
*
* @author zhuquanwen
* @vesion 1.0
* @date 2020/8/12 21:16
* @since jdk1.8
*/
@RestController
@RequestMapping("/send/email/test")
@Slf4j
public class SendEmailController extends BaseController {
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private TemplateEngine templateEngine;
/**
* 測試發(fā)送普通文本郵件
* */
@GetMapping("/text")
public ResponseEntity testText() {
SimpleMailMessage message = new SimpleMailMessage();
// 發(fā)件人地址
message.setFrom("461402005@qq.com");
// 收件人地址
message.setTo("76775081@qq.com");
// 郵件標題
message.setSubject("這是一個測試");
// 郵件正文
message.setText("這是測試正文");
javaMailSender.send(message);
log.debug("發(fā)送成功!");
return getResponse();
}
/**
* 測試發(fā)送HTML郵件
* */
@GetMapping("/html")
public ResponseEntity testHtml() throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
// 這里與發(fā)送文本郵件有所不同
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 發(fā)件人地址
helper.setFrom("461402005@qq.com");
// 收件人地址
helper.setTo("76775081@qq.com");
helper.setSubject("這是html測試");
// 發(fā)送HTML郵件
String html = "<html><body><h1>這是測試測試</h1></body></html>";
helper.setText(html, true);
javaMailSender.send(message);
log.debug("發(fā)送成功");
return getResponse();
}
/**
* 測試發(fā)送附件
* */
@GetMapping("/attachment")
public ResponseEntity testAttachment() throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
// 這里與發(fā)送文本郵件有所不同
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 發(fā)件人地址
helper.setFrom("461402005@qq.com");
// 收件人地址
helper.setTo("76775081@qq.com");
helper.setSubject("這是附件測試");
// 發(fā)送HTML
String html = "<html><body><h1>這是測試測試</h1></body></html>";
helper.setText(html, true);
//發(fā)送附件
FileSystemResource file = new FileSystemResource("E:\\test\\repo1\\a.txt");
// 發(fā)送文件名
String fileName = file.getFilename();
helper.addAttachment(fileName, file);
javaMailSender.send(message);
log.debug("發(fā)送成功");
return getResponse();
}
/**
* 測試發(fā)送thymeleaf模板郵件
* */
@GetMapping("/template")
public ResponseEntity testTemplate() throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
// 這里與發(fā)送文本郵件有所不同
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 發(fā)件人地址
helper.setFrom("461402005@qq.com");
// 收件人地址
helper.setTo("76775081@qq.com");
helper.setSubject("這是模板測試");
//獲取模板生成html
Context context = new Context();
// 這里的id與resources/templates下的模板文件中的${userid}必須對應
context.setVariable("userid", 1);
// 這里的"emailTemplate"與resources/templates下的模板文件一直
String html = templateEngine.process("emailTemplate", context);
helper.setText(html, true);
//發(fā)送附件
FileSystemResource file = new FileSystemResource("E:\\test\\repo1\\a.txt");
// 發(fā)送文件名
String fileName = file.getFilename();
helper.addAttachment(fileName, file);
javaMailSender.send(message);
log.debug("發(fā)送成功");
return getResponse();
}
}
package com.iscas.base.biz.service.common;
import cn.hutool.core.io.IoUtil;
import com.iscas.templet.common.ResponseEntity;
import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 發(fā)送郵件工具
*
* @author zhuquanwen
* @vesion 1.0
* @date 2020/8/12 21:52
* @since jdk1.8
*/
@Service
@Slf4j
public class SendEmailService {
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private TemplateEngine templateEngine;
/**
* 發(fā)送普通文本郵件
*
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發(fā)送郵件地址
* @param to 接收郵件地址
* @param title 郵件主題
* @param content 郵件正文文本
* */
public void sendText(String from, String to, String title, String content) {
SimpleMailMessage message = new SimpleMailMessage();
// 發(fā)件人地址
message.setFrom(from);
// 收件人地址
message.setTo(to);
// 郵件標題
message.setSubject(title);
// 郵件正文
message.setText(content);
javaMailSender.send(message);
log.debug("郵件發(fā)送成功!");
}
/**
* 發(fā)送HTML郵件
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發(fā)送郵件地址
* @param to 接收郵件地址
* @param title 郵件主題
* @param html 郵件正文html
* */
public void sendHtml(String from, String to, String title, String html) throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
// 這里與發(fā)送文本郵件有所不同
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 發(fā)件人地址
helper.setFrom(from);
// 收件人地址
helper.setTo(to);
helper.setSubject(title);
// 發(fā)送HTML郵件
helper.setText(html, true);
javaMailSender.send(message);
log.debug("郵件發(fā)送成功");
}
/**
* 發(fā)送附件
*
*
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發(fā)送郵件地址
* @param to 接收郵件地址
* @param title 郵件主題
* @param html 郵件正文html
* @param inputStream 附件輸入流
* @param fileName 文件名稱
*
* */
public void sendAttachment(String from, String to, String title, String html, InputStream inputStream, String fileName) throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
// 這里與發(fā)送文本郵件有所不同
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 發(fā)件人地址
helper.setFrom(from);
// 收件人地址
helper.setTo(to);
helper.setSubject(title);
// 發(fā)送HTML
helper.setText(html, true);
//發(fā)送附件
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IoUtil.copy(inputStream, baos);
ByteArrayResource byteArrayResource = new ByteArrayResource(baos.toByteArray());
// 發(fā)送文件名
helper.addAttachment(fileName, byteArrayResource);
javaMailSender.send(message);
log.debug("發(fā)送成功");
}
/**
* 測試發(fā)送thymeleaf模板郵件
* templateName必須在resources/templates下
*
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發(fā)送郵件地址
* @param to 接收郵件地址
* @param title 郵件主題
* @param templateName 模板名稱,templateName必須在resources/templates下
* @param context 構(gòu)建模板的上下文,構(gòu)建方式參見單元測試
* */
@GetMapping("/template")
public void sendTemplate(String from, String to, String title, String templateName, Context context) throws MessagingException {
MimeMessage message = javaMailSender.createMimeMessage();
// 這里與發(fā)送文本郵件有所不同
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// 發(fā)件人地址
helper.setFrom(from);
// 收件人地址
helper.setTo(to);
helper.setSubject(title);
//獲取模板生成html
String html = templateEngine.process(templateName, context);
helper.setText(html, true);
javaMailSender.send(message);
log.debug("郵件發(fā)送成功");
}
/**
* 測試發(fā)送thymeleaf模板郵件,并攜帶附件
* templateName必須在resources/templates下
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發(fā)送郵件地址
* @param to 接收郵件地址
* @param title 郵件主題
* @param templateName 模板名稱,templateName必須在resources/templates下
* @param context 構(gòu)建模板的上下文,構(gòu)建方式參見單元測試
* @param inputStream 附件輸入流
* @param fileName 文件名稱
* */
public void sendTemplateWithAttachment(String from, String to, String title, String templateName, Context context, InputStream inputStream, String fileName) throws MessagingException {
//獲取模板生成html
String html = templateEngine.process(templateName, context);
sendAttachment(from, to, title, html, inputStream, fileName);
}
}
電子郵件服務器類比于現(xiàn)實中的郵局。用戶發(fā)郵件時,會將郵件發(fā)送到郵件服務器,郵件服務器將郵件再發(fā)送到接收方的電子郵箱中。
郵件服務器又可以分為兩種類型:
“SMTP郵件服務器:替用戶發(fā)送郵件和接收外面發(fā)送給本地用戶的郵件。POP3/IMAP郵件服務器:幫助用戶讀取SMTP郵件服務器接收進來的郵件。”
郵件傳輸協(xié)議有如下幾種
以QQ郵箱為例
開啟后需要生成授權(quán)碼。
我們來看看純Java代碼發(fā)郵件。
send方法就如此之長,而SpringBoot將發(fā)送功能封裝好了。接下來你將看到用SpringBoot發(fā)送郵件是如何的簡單。
導入Maven jar包
<!--郵件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
這里的模板引擎后面需要,這里先導入進來。
application.properties文件配置
#郵件配置
spring.mail.host=smtp.qq.com
spring.mail.port=587
spring.mail.username=1587xx3453@qq.com
spring.mail.password=yurzjzmreurpgfdghalouke
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.socketFactoryClass=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.debug=true
如果是QQ郵箱發(fā)送,你只需要修改username和password。password為上面生成的授權(quán)碼,不是你郵箱的登錄密碼哦。
編寫郵件發(fā)送方法
發(fā)送結(jié)果
如果我們要發(fā)送附件
發(fā)送結(jié)果如下圖
如果需要在正文插入圖片
發(fā)送結(jié)果如下
當然我們也可以使用模板引擎
在resources/templates目錄下創(chuàng)建文件thymeleaf-mail.html文件。
thymeleaf-mail.html內(nèi)容如下
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>嗨!歡迎關(guān)注我的博客:Lvshen的技術(shù)小屋:</p>
<table border="1">
<tr>
<td>姓名</td>
<td th:text="${username}"></td>
</tr>
<tr>
<td>性別</td>
<td th:text="${sex}"></td>
</tr>
<tr>
<td>愛好</td>
<td th:text="${hobby}"></td>
</tr>
</table>
<div style="color: #ff1a0e">關(guān)注我獲取Java學習資料哦</div>
</body>
</html>
編寫發(fā)送代碼
測試結(jié)果如下
如果你沒有開發(fā)過郵件發(fā)送或正在開發(fā)郵件發(fā)送的功能,希望這篇文章可以幫到你。
、要使用JavaMailSender發(fā)送郵件,首先需要在pom.xml文件中引入spring-boot-starter-mail依賴:
spring-boot-starter-mail依賴
2、引入依賴包后需要在application.properties文件中配置屬性:
屬性配置
password為客戶端授權(quán)碼,而不是我們平常登錄郵箱的密碼,我這里使用的是163郵箱作為發(fā)送方(客戶端授權(quán)碼需要進入郵箱里面設(shè)置獲取,這里就不介紹了)。
3、引入依賴包,寫好配置文件后,接下來就是寫業(yè)務代碼了,代碼很簡單,想要深究原理就得去閱讀源碼了,這里只介紹如何實現(xiàn),廢話不多說,業(yè)務代碼如下:(截圖無法顯示,只能貼代碼了)
@Service
public class MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender sender;
//發(fā)送者
@Value("${spring.mail.username}")
private String from;
/**
* 發(fā)送純文本的簡單郵件
* @param sendTo 接收者
* @param Subject 郵件主題
* @param mailContent 郵件內(nèi)容
* @return
*/
public String sendSimpleMail(String sendTo, String Subject, String mailContent){
//建立郵件消息
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(sendTo);
message.setSubject(Subject);
message.setText(mailContent);
try {
sender.send(message);
logger.info("");
} catch (Exception e) {
logger.error("發(fā)送簡單郵件時發(fā)生異常!", e);
}
return "";
}
/**
* 發(fā)送HTML格式郵件
* @param sendTo
* @param Subject
* @param mailContent
*/
public void sendHtmlMail(String sendTo, String Subject, String mailContent){
MimeMessage message = sender.createMimeMessage();
try {
//true表示需要創(chuàng)建一個multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(sendTo);
helper.setSubject(Subject);
//HTML格式郵件需先進行Base64加密,取數(shù)據(jù)時再解碼
helper.setText(mailContent, true);
sender.send(message);
logger.info("HTML郵件已經(jīng)發(fā)送。");
} catch (MessagingException e) {
logger.error("發(fā)送HTML郵件時發(fā)生異常!", e);
}
}
/**
* 帶附件的郵件
* @param sendTo
* @param Subject
* @param mailContent
* @param filePath
*/
public void sendAttachmentsMail(String sendTo, String Subject, String mailContent, String filePath){
MimeMessage message = sender.createMimeMessage();
try {
//true表示需要創(chuàng)建一個multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(sendTo);
helper.setSubject(Subject);
helper.setText(mailContent, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
helper.addAttachment(fileName, file);
sender.send(message);
logger.info("帶附件的郵件已經(jīng)發(fā)送。");
} catch (MessagingException e) {
logger.error("發(fā)送帶附件的郵件時發(fā)生異常!", e);
}
}
/**
* 發(fā)送帶圖片(靜態(tài)資源)的郵件
* @param sendTo
* @param Subject
* @param mailContent 郵件內(nèi)容,需要包含一個靜態(tài)資源的id
* @param rscPath 靜態(tài)資源路徑和文件名
* @param rscId 靜態(tài)資源id
*/
public void sendInlineResourceMail(String sendTo, String Subject, String mailContent, String rscPath, String rscId){
MimeMessage message = sender.createMimeMessage();
try {
//true表示需要創(chuàng)建一個multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(sendTo);
helper.setSubject(Subject);
helper.setText(mailContent, true);
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
sender.send(message);
logger.info("帶圖片的郵件已經(jīng)發(fā)送。");
} catch (MessagingException e) {
logger.error("發(fā)送帶圖片的郵件時發(fā)生異常!", e);
}
}
}
4、寫完業(yè)務代碼就可以寫測試代碼進行測試了,我是寫了個controller進行調(diào)用,用Junit也可以,方式不限,測試代碼如下下
@RestController
@RequestMapping("/mail")
public class MailController {
@Autowired
private MailService mailService;
@RequestMapping("/sendmail")
public String sendMail(){
//接收者郵箱(隨意什么郵箱)
String to = "123456@qq.com";
return mailService.sendSimpleMail(to, "主題:測試發(fā)送郵件功能", "測試發(fā)送郵件功能");
}
}
到了這里,在瀏覽器地址欄輸入127.0.0.1:8080/mail/sendmail并回車,郵件便可以發(fā)送成功了。
*請認真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。