面記錄使用springboot發送四種郵件的方法:普通文本、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實現郵件發送
spring-boot-starter-thymeleaf實現模板的創建
<!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;
/**
* 郵件發送測試
*
* @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;
/**
* 測試發送普通文本郵件
* */
@GetMapping("/text")
public ResponseEntity testText() {
SimpleMailMessage message=new SimpleMailMessage();
// 發件人地址
message.setFrom("461402005@qq.com");
// 收件人地址
message.setTo("76775081@qq.com");
// 郵件標題
message.setSubject("這是一個測試");
// 郵件正文
message.setText("這是測試正文");
javaMailSender.send(message);
log.debug("發送成功!");
return getResponse();
}
/**
* 測試發送HTML郵件
* */
@GetMapping("/html")
public ResponseEntity testHtml() throws MessagingException {
MimeMessage message=javaMailSender.createMimeMessage();
// 這里與發送文本郵件有所不同
MimeMessageHelper helper=new MimeMessageHelper(message, true);
// 發件人地址
helper.setFrom("461402005@qq.com");
// 收件人地址
helper.setTo("76775081@qq.com");
helper.setSubject("這是html測試");
// 發送HTML郵件
String html="<html><body><h1>這是測試測試</h1></body></html>";
helper.setText(html, true);
javaMailSender.send(message);
log.debug("發送成功");
return getResponse();
}
/**
* 測試發送附件
* */
@GetMapping("/attachment")
public ResponseEntity testAttachment() throws MessagingException {
MimeMessage message=javaMailSender.createMimeMessage();
// 這里與發送文本郵件有所不同
MimeMessageHelper helper=new MimeMessageHelper(message, true);
// 發件人地址
helper.setFrom("461402005@qq.com");
// 收件人地址
helper.setTo("76775081@qq.com");
helper.setSubject("這是附件測試");
// 發送HTML
String html="<html><body><h1>這是測試測試</h1></body></html>";
helper.setText(html, true);
//發送附件
FileSystemResource file=new FileSystemResource("E:\\test\\repo1\\a.txt");
// 發送文件名
String fileName=file.getFilename();
helper.addAttachment(fileName, file);
javaMailSender.send(message);
log.debug("發送成功");
return getResponse();
}
/**
* 測試發送thymeleaf模板郵件
* */
@GetMapping("/template")
public ResponseEntity testTemplate() throws MessagingException {
MimeMessage message=javaMailSender.createMimeMessage();
// 這里與發送文本郵件有所不同
MimeMessageHelper helper=new MimeMessageHelper(message, true);
// 發件人地址
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);
//發送附件
FileSystemResource file=new FileSystemResource("E:\\test\\repo1\\a.txt");
// 發送文件名
String fileName=file.getFilename();
helper.addAttachment(fileName, file);
javaMailSender.send(message);
log.debug("發送成功");
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;
/**
* 發送郵件工具
*
* @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;
/**
* 發送普通文本郵件
*
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發送郵件地址
* @param to 接收郵件地址
* @param title 郵件主題
* @param content 郵件正文文本
* */
public void sendText(String from, String to, String title, String content) {
SimpleMailMessage message=new SimpleMailMessage();
// 發件人地址
message.setFrom(from);
// 收件人地址
message.setTo(to);
// 郵件標題
message.setSubject(title);
// 郵件正文
message.setText(content);
javaMailSender.send(message);
log.debug("郵件發送成功!");
}
/**
* 發送HTML郵件
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發送郵件地址
* @param to 接收郵件地址
* @param title 郵件主題
* @param html 郵件正文html
* */
public void sendHtml(String from, String to, String title, String html) throws MessagingException {
MimeMessage message=javaMailSender.createMimeMessage();
// 這里與發送文本郵件有所不同
MimeMessageHelper helper=new MimeMessageHelper(message, true);
// 發件人地址
helper.setFrom(from);
// 收件人地址
helper.setTo(to);
helper.setSubject(title);
// 發送HTML郵件
helper.setText(html, true);
javaMailSender.send(message);
log.debug("郵件發送成功");
}
/**
* 發送附件
*
*
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發送郵件地址
* @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();
// 這里與發送文本郵件有所不同
MimeMessageHelper helper=new MimeMessageHelper(message, true);
// 發件人地址
helper.setFrom(from);
// 收件人地址
helper.setTo(to);
helper.setSubject(title);
// 發送HTML
helper.setText(html, true);
//發送附件
ByteArrayOutputStream baos=new ByteArrayOutputStream();
IoUtil.copy(inputStream, baos);
ByteArrayResource byteArrayResource=new ByteArrayResource(baos.toByteArray());
// 發送文件名
helper.addAttachment(fileName, byteArrayResource);
javaMailSender.send(message);
log.debug("發送成功");
}
/**
* 測試發送thymeleaf模板郵件
* templateName必須在resources/templates下
*
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發送郵件地址
* @param to 接收郵件地址
* @param title 郵件主題
* @param templateName 模板名稱,templateName必須在resources/templates下
* @param context 構建模板的上下文,構建方式參見單元測試
* */
@GetMapping("/template")
public void sendTemplate(String from, String to, String title, String templateName, Context context) throws MessagingException {
MimeMessage message=javaMailSender.createMimeMessage();
// 這里與發送文本郵件有所不同
MimeMessageHelper helper=new MimeMessageHelper(message, true);
// 發件人地址
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("郵件發送成功");
}
/**
* 測試發送thymeleaf模板郵件,并攜帶附件
* templateName必須在resources/templates下
* @version 1.0
* @since jdk1.8
* @date 2020/8/12
* @param from 發送郵件地址
* @param to 接收郵件地址
* @param title 郵件主題
* @param templateName 模板名稱,templateName必須在resources/templates下
* @param context 構建模板的上下文,構建方式參見單元測試
* @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);
}
}
在Spring Boot中發送郵件,需要使用Spring提供的org.springframework.mail.javamail.JavaMailSender,它提供了許多簡易的用法,可以發送簡單郵件,HTML格式郵件,帶附件的郵件及模板郵件。
創建Spring Boot工程
添加依賴: spring-boot-starter-mail
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 復制代碼
在application.yml配置文件中添加郵件相關配置(以163郵箱為例)
spring:
## 郵件配置
mail:
host: smtp.163.com
username: 郵箱
password: 郵箱授權密碼
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
復制代碼
使用Spring Boot發送簡單郵件
@Service(value="jmsService")
public class JmsService {
@Autowired
private JavaMailSender jms;
public void sendSimpleMail(String sender, String receiver, String subject, String text) {
try {
SimpleMailMessage message=new SimpleMailMessage();
message.setFrom(sender); // 發送者
message.setTo(receiver); // 接受者
message.setSubject(subject); // 郵件主題
message.setText(text); // 郵件正文
jms.send(message);
} catch (Exception exception) {
// TODO 異常處理
}
}
}
復制代碼
使用Spring Boot發送HTML格式郵件
@Service(value="jmsService")
public class JmsService {
@Autowired
private JavaMailSender jms;
public void sendHtmlMail(String sender, String receiver, String subject, String htmlText) {
MimeMessage message=null;
try {
message=jms.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(message, true);
helper.setFrom(sender); // 發送者
helper.setTo(receiver); // 接受者
helper.setSubject(subject); // 郵件主題
if (StringUtil.isNotEmpty(htmlText)) {
StringBuffer sb=new StringBuffer(htmlText);
helper.setText(sb.toString(), true); // HTML
}
jms.send(message);
} catch (Exception exception) {
// TODO 異常處理
}
}
}
復制代碼
使用Spring Boot發送帶附件的郵件
@Service(value="jmsService")
public class JmsService {
@Autowired
private JavaMailSender jms;
public void sendSimpleMailWithAttachment(String sender, String receiver, String subject, String filePath) {
MimeMessage message=null;
try {
message=jms.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(message, true);
helper.setFrom(sender); // 發送者
helper.setTo(receiver); // 接受者
helper.setSubject(subject); // 郵件主題
helper.setText("詳情參見附件內容!"); // 郵件正文
File file=new File(filePath);
FileSystemResource fileResource=new FileSystemResource(file);
helper.addAttachment(file.getName(), fileResource); // 附件
jms.send(message);
} catch (Exception exception) {
// TODO 異常處理
}
}
}
復制代碼
使用Spring Boot發送模板郵件,以thymeleaf為例
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 復制代碼
spring:
## thymelea模板配置
thymeleaf:
#thymeleaf 所在路徑
prefix: classpath:/templates/
#thymeleaf 后綴
suffix: .html
#thymeleaf 采用的標準
mode: HTML5
#thymeleaf 編碼格式
encoding: UTF-8
復制代碼
在項目resources/templates目錄下新建郵件模板template.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>注冊碼</title>
</head>
<body>
您好,您的注冊碼為<span th:text="${code}"></span>,請在5分鐘內使用完成操作。
</body>
</html>
復制代碼
@Service(value="jmsService")
public class JmsService {
@Autowired
private JavaMailSender jms;
@Autowired
private TemplateEngine templateEngine;
public void sendTemplateEmail(String sender, String receiver, String subject, String code) {
MimeMessage message=null;
try {
message=jms.createMimeMessage();
MimeMessageHelper helper=new MimeMessageHelper(message, true);
helper.setFrom(sender); // 發送者
helper.setTo(receiver); // 接受者
helper.setSubject(subject); // 郵件主題
Context context=new Context();
context.setVariable("code", code); // 模板郵件參數
String template=templateEngine.process("template", context);
helper.setText(template, true);
jms.send(message);
} catch (Exception exception) {
// TODO 異常處理
}
}
}
鏈接:https://juejin.im/post/6876818580286603278
來源:掘金
pring 對 Java Mail 有很好的支持。因此,Spring Boot 也提供了自動配置的支持。
Spring Boot 集成 Java Mail
Spring Boot 中使用 Java Mail 非常簡單方便。修改 pom 文件,添加依賴。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
在 src/main/resources/application.properties 中配置郵件信息
#email spring.mail.host=smtp.163.com spring.mail.username=請輸入用戶名 spring.mail.password=請輸入密碼 spring.mail.port=25 spring.mail.protocol=smtp spring.mail.default-encoding=UTF-8
我們通過編寫單元測試用例,測試 Java Mail 是否正常工作。值得注意的是,郵件包括幾種類型:簡單文本的郵件、 HTML 文本的郵件、 內嵌圖片的郵件、 包含附件的郵件。
發送包含HTML文本的郵件
發送包含內嵌圖片的郵件
發送包含附件的郵件
喜歡的小伙伴,點個關注吧!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。