Spring Boot集成JavaMailSender实现邮件发送

Spring Boot 集成 JavaMailSender实现邮件发送

背景

邮件发送为项目中的常用功能之一,例如注册成功后需要发送激活邮件,每日报表统计,日志告警监控,数据迁移通知等功能都需要自动发送邮件通知管理员或运维人员处理

具体实现

本文将从Spring Boot集成的JavaMailSender来实现邮件发送功能

1、关于JavaMailSender

JavaMailSender是Spring Framework中的一个接口,用于发送电子邮件

它是Spring对JavaMail API的封装,提供了更简单和更方便的方式来发送邮件

JavaMailSender接口定义了一组发送邮件的方法,包括发送简单文本邮件、发送带附件的邮件、发送HTML格式的邮件等

它隐藏了底层JavaMail API的复杂性,使得在Spring应用中发送邮件变得更加容易

JavaMailSender是Spring Framework中用于发送邮件的接口,它简化了邮件发送的过程,提供了更高级的抽象和便利性

2、引入pom依赖

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

3、yml邮件配置

下面以腾讯企业邮箱对应的配置为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mail:
host: smtp.exmail.qq.com
port: 465
username: xx@xx.com
password: pwd
protocol: smtp
default-encoding: UTF-8
from: xx@xx.com
# 多个收件人,用逗号分隔
to: xx@xx.com
# 多个抄送人,用逗号分隔
cc: 2454084262@qq.com
properties: # 配置以SSL的方式发送,端口是465
mail:
smtp:
auth: true
ssl:
enable: true
socketFactory:
class: com.sun.mail.util.MailSSLSocketFactory
fallback: false

首先配置邮箱的host,根据邮件提供商的域名进行更改

port:查看对应邮件提供商发送服务器的端口

image-20250427140303468

注:必须开启IMAP/SMTP服务

腾讯企业邮箱参考:帮助中心

password:客户端的专用密码(不是登陆密码)

image-20250427140512676

from:发件人邮件

properties:如果邮箱采用SSL方式发送,则必须配置此项

4、配置实现类接口

根据需要配置邮件发送的内容

1
2
3
4
5
6
7
8
9
public interface MailService {
/**
* 发送邮件通知
*
* @param subject 邮件主题
* @param content 邮件正文
*/
void sendEmail(String subject, String content);
}

5、配置邮件实现类

实现接口中的sendEmail方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@Service
public class MailServiceImpl implements MailService {

private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);

@Autowired
private JavaMailSender mailSender;

// 从配置文件中取发件人和收件人地址
@Value("${spring.mail.from}")
private String mailFrom;

@Value("${spring.mail.to}")
private String mailTo;

@Value("${spring.mail.cc}")
private String mailCc;

@Override
public void sendEmail(String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(mailFrom);
// 将邮件收件人地址拆分为数组(多个地址以逗号分隔)
if (mailTo != null && !mailTo.trim().isEmpty()) {
String[] toArray = mailTo.split("\\s*,\\s*");
message.setTo(toArray);
}
if (mailCc != null && !mailCc.trim().isEmpty()) {
// 去除引号(如果有的话)和多余的空格
String ccProcessed = mailCc.replace("\"", "").trim();
String[] ccArray = ccProcessed.split("\\s*,\\s*");
message.setCc(ccArray);
}
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
logger.info("邮件发送成功,主题:{}", subject);
} catch (Exception e) {
logger.error("邮件发送失败", e);
throw e;
}
}
}

注:由于方法中使用了@Value注解从配置文件中读取发送人、抄送人信息,当有多个发送人/抄送人时,无法正确解析对应的字符串,因此需要先对传入的字符串进行过滤操作,去除空格和引号

配置文件中多个邮件的格式为:xx@xx.com,xx@xx.com,xx@xx.com

6、代码应用

在开发完成实现类之后,在需要发送邮件的方法中调用

1
2
3
private final MailService mailService;

mailService.sendEmail("增量数据迁移完成", result);

image-20250427141736696

最终效果:

image-20250427141904974