1. QQ邮箱开启SMTP服务
2. 引入依赖
<!-- 配置thymeleaf模板依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 支持发送邮件依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
3. 引入配置
spring
mail:
default-encoding: UTF-8
host: smtp.qq.com
username: 你的邮箱地址
password: 你的授权码
port: 22
protocol: smtp
properties:
mail:
smtp:
ssl:
enable: true
socketFactory:
port: 465
class: javax.net.ssl.SSLSocketFactory
4. 编写发送邮件类
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.thymeleaf.context.Context;
import java.util.List;
@Data
@Builder
@AllArgsConstructor
@RequiredArgsConstructor
public class EmailBean {
/**
* 填充内容
*/
private Context context;
/**
* 使用模板,和text互斥,优先使用模板,模板不存在发送text内容
*/
private String templateName;
/**
* 发送给谁
*/
private String toUser;
/**
* 抄送给谁
*/
private String[] ccUser;
/**
* 邮件主体
*/
private String subject;
/**
* 邮件内容,和templateName互斥,优先使用模板,模板不存在发送text内容
*/
private String text;
/**
* 附件列表
*/
private List<String> attachmentList;
}
5. 创建邮件工具类
import com.maple.demo.config.bean.EmailBean;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
@Service
@RequiredArgsConstructor
public class EmailUtil {
private final JavaMailSender mailSender;
private final TemplateEngine templateEngine;
@Value("${spring.mail.username}")
private String from;
@Async
public void sendEmail(EmailBean emailBean) {
try {
// 解决附件名称过长导致的附件名称乱码问题
System.setProperty("mail.mime.splitlongparameters", "false");
// 定义邮件信息
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper;
helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(emailBean.getToUser());
helper.setSubject(emailBean.getSubject());
if (emailBean.getCcUser() != null && emailBean.getCcUser().length > 0) {
helper.setCc(emailBean.getCcUser());
}
// 如果存在模板,定义邮件模板中的内容,context的内容对应email.html的${project}占位的内容
if (emailBean.getContext() != null && StringUtils.isNotBlank(emailBean.getTemplateName())) {
String emailContent = templateEngine.process(emailBean.getTemplateName(), emailBean.getContext());
helper.setText(emailContent, true);
} else {
helper.setText(emailBean.getText());
}
// 如果存在附件,定义邮件的附件
if (emailBean.getAttachmentList() != null && !emailBean.getAttachmentList().isEmpty()) {
for (String attachment : emailBean.getAttachmentList()) {
FileSystemResource file = new FileSystemResource(attachment);
if (StringUtils.isNotBlank(file.getFilename())) {
helper.addAttachment(file.getFilename(), file);
}
}
}
mailSender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
6. 使用html发送验证码的页面模板
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>xiaoxiaofeng</title>
<style>
body {
text-align: center;
margin-left: auto;
margin-right: auto;
}
#main {
text-align: center;
}
</style>
</head>
<body>
<div id="main">
<h3>欢迎使用 <span th:text="${project}"></span></h3>
您的验证码是:<h2><span th:text="${code}"></span></h2>
<span>本站由<a href="https://www.xiaoxiaofeng.com" target="_blank">笑小枫(https://www.xiaoxiaofeng.com)</a>提供技术支持</span>
</div>
</body>
</html>
7. 功能测试
import com.yang.demo.config.bean.EmailBean;
import com.yang.demo.util.EmailUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.context.Context;
import java.util.ArrayList;
import java.util.List;
@RestController
@AllArgsConstructor
@RequestMapping("/example")
@Api(tags = "实例演示-发送邮件")
public class TestSendEmailController {
private final EmailUtil emailUtil;
@PostMapping("/sendEmailText")
@ApiOperation(value = "发送纯文本带附件的邮件")
public void sendEmailText(String text) {
List<String> attachmentList = new ArrayList<>();
// 定义绝对路径
attachmentList.add("E:\\雪山.jpg");
// 定义相对路径
attachmentList.add("src/main/resources/templates/email.html");
EmailBean emailBean = EmailBean.builder()
.text(text)
.subject("QQ邮箱纯文本带附件信息发送")
.toUser("2294397905@qq.com")
.attachmentList(attachmentList)
.build();
emailUtil.sendEmail(emailBean);
}
@PostMapping("/sendEmailTemplate")
@ApiOperation(value = "根据html模板发送验证码邮件")
public void sendEmailTemplate() {
Context context = new Context();
context.setVariable("project", "给爱楼发验证码");
// 生成6位数字验证码
String code = String.valueOf((int) (Math.random() * 900000 + 100000));
context.setVariable("code", code);
EmailBean emailBean = EmailBean.builder()
.context(context)
.templateName("email")
.subject("给爱楼发验证码")
.toUser("2294397905@qq.com")
.build();
emailUtil.sendEmail(emailBean);
}
}