本文主要介绍了使用SpringBoot发送邮件,主要包含如何获取发送邮件的授权码,这里以QQ邮箱为例,然后介绍了功能如何实现,包括通过模板发送邮件,发送带图片的邮件,发送带附件的邮件,发送带有多个附件的邮件。
使用SPringBoot发送邮件呢,首先需要发送邮件的地址开通SMTP服务,并获取到对应的授权码,接下来就以QQ邮箱为例,简单的介绍一下怎么可通SMTP,并且获取到授权码值。具体操作如下图所示:
1069070069
这个号码已关闭服务,可以发送下面的10690329021269
。上面我们已经获取到QQ邮箱的STMP服务的授权码,接下来我们看看怎么实现功能。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-mailartifactId>
dependency>
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
这里的配置文件是以QQ邮箱的为例,如果是其他的邮箱,可以参考表格里的SMTP服务器地址和对应的端口号。
邮箱类型 | SMTP服务器地址 | 端口号 |
---|---|---|
QQ邮箱 | smtp.qq.com | 465或587 |
sina邮箱 | smtp.sina.cn | 465或587 |
126邮箱 | smtp.126.com | 465或994 |
aliyun邮箱 | smtp.aliyun.com | 465或994 |
163邮箱 | smtp.163.com | 465或994 |
yeah邮箱 | smtp.yeah.net | 465或994 |
config.bean
包下编写发送邮件类EmailBean.java
👇package com.maple.demo.config.bean;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.thymeleaf.context.Context;
import java.util.List;
/**
* @author 笑小枫
* @date 2022/7/22
*/
@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;
}
util
包下编写邮件的工具类EmailUtil.java
👇package com.maple.demo.util;
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;
/**
* @author 笑小枫
* @date 2022/7/22
*/
@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();
}
}
}
配置发送邮件的模板
在resources
目录下创建templates
目录。创建email.html
模板。
这里可以根据自己的需求配置html页面,这种方式是通过配置thymeleaf模板的形式进行发送,如果直接可以发送文本内容即可,则不用配置。
如果配置的模版比较多,且经常变动或者由业务人员配置,可以直接添加一张邮件模版配置表,前端通过富文本的形式进行页面配置,然后取邮件模版的配置表内容即可。相对复杂一些,这里只说一下思路,不再进行演示,有什么疑问可以留言或者联系我。
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<title>xiaoxiaofengtitle>
<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>
编写一个发送邮件的掩饰controller,主要演示两种模式发送邮件
package com.maple.demo.controller;
import com.maple.demo.config.bean.EmailBean;
import com.maple.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;
/**
* @author 笑小枫
* @date 2022/7/22
*/
@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("D:\\xiaoxiaofeng.jpg");
// 定义相对路径
attachmentList.add("src/main/resources/templates/email.html");
EmailBean emailBean = EmailBean.builder()
.text(text)
.subject("欢迎使用笑小枫个人博客")
.toUser("1150640979@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("1150640979@qq.com")
.build();
emailUtil.sendEmail(emailBean);
}
}
使用我们的接口服务平台进行调用
纯文本的邮件的测试结果👇,可以看到添加的两个附件。
通过html模版发送邮件的测试结果👇
本章到这里结束了,喜欢的朋友关注一下我呦😘😘,大伙的支持,就是我坚持写下去的动力。
笑小枫个人博客:https://www.xiaoxiaofeng.com
本文源码:https://github.com/hack-feng/maple-demo
本系列的源码已同步在Github:https://github.com/hack-feng/maple-demo