在项目开发中,发邮件是非常常见的需求,比如用户注册后发送激活链接、忘记密码时发送重置邮件、系统监控触发告警通知运维人员等。原生的JavaMail API用起来比较繁琐,需要手动构建Session、Transport等对象,而Spring对其做了封装,配合Spring Boot的自动配置能力,只需要引入一个starter、写几行配置,就能直接注入JavaMailSender发送邮件。本文将完整演示Spring Boot整合Spring Boot Mail的全过程,包括依赖引入、SMTP参数配置,以及发送普通文本、HTML、附件和内嵌图片邮件的具体实现。

一、引入依赖与邮箱基础配置
1. 添加Maven依赖
Spring Boot对邮件功能做了一个独立的starter,使用时只需要在pom.xml中加入如下依赖即可,不需要再单独引入javax.mail相关的坐标,starter内部已经帮你处理好了版本兼容问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>如果项目是Gradle构建的,对应的写法是implementation 'org.springframework.boot:spring-boot-starter-mail'。引入之后,Spring Boot的自动配置类MailSenderAutoConfiguration会检测到classpath下的邮件相关类,并自动注册一个JavaMailSenderImpl实例到容器中,后续直接注入使用即可。
2. 配置SMTP服务器参数
发邮件的核心是配置一个可用的SMTP服务器。以国内常用的QQ邮箱和163邮箱为例,必须先在邮箱的设置页面开启SMTP服务,并获得一个授权码(不是邮箱登录密码),这个授权码就是配置里的password。以QQ邮箱为例,配置写在application.yml中如下:
spring:
mail:
host: smtp.qq.com
port: 465
username: yourname@qq.com
password: 你的授权码
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
ssl:
enable: true
socketFactory:
port: 465有几个细节需要注意。第一,465端口走的是SSL协议,如果使用587端口则对应STARTTLS,配置写法是mail.smtp.starttls.enable: true。第二,username必须填完整的邮箱地址。第三,QQ邮箱新版协议要求强制SSL,所以ssl.enable一定要打开,否则会报连接异常。163邮箱把host换成smtp.163.com即可,同样需要授权码。企业邮箱(如腾讯企业邮、阿里企业邮)的配置方式类似,host使用对应的SMTP域名即可。
二、使用JavaMailSender发送各类邮件
1. 发送简单文本邮件
最基础的方式是注入JavaMailSender,借助SimpleMailMessage构建一封纯文本邮件。这种方式适合发送验证码、通知类内容,代码量最少。
@Service
public class MailService {
@Resource
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from); // 发件人
message.setTo(to); // 收件人,可以是数组
message.setSubject(subject); // 邮件主题
message.setText(content); // 正文
message.setCc("cc@ippipp.com"); // 抄送,可选
mailSender.send(message);
}
}发送成功后,可以在收件箱看到这封邮件。如果发送失败,常见原因是授权码错误或未开启SMTP服务,异常信息中通常会提示503或身份验证失败,按提示回头检查配置即可。
2. 发送HTML富文本邮件
纯文本邮件的展示能力有限,实际业务中更多场景需要发送排版美观的HTML邮件,比如验证码卡片、账单详情等。这时需要使用MimeMessage,并把内容类型设置为HTML。
public void sendHtmlMail(String to, String subject, String htmlContent) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(htmlContent, true); // 第二个参数true表示内容是HTML
mailSender.send(message);
}注意MimeMessageHelper构造方法的第二个参数必须传true,表示支持multipart模式,这样才能携带附件或内嵌资源。HTML内容建议使用内联样式而不是外部CSS,因为绝大多数邮件客户端出于安全考虑不会加载外部样式文件,直接内联style属性的兼容性最好。
3. 发送带附件和内嵌图片的邮件
附件通过addAttachment方法添加,图片这类需要嵌在正文中显示的资源则用addInline方法,两者配合可以覆盖绝大多数业务需求。
public void sendComplexMail(String to, String subject) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText("<p>这是一封带图片和附件的邮件</p><p><img src='cid:logoPic'/></p>", true);
// 附件
FileSystemResource file = new FileSystemResource(new File("D:\\files\\report.pdf"));
helper.addAttachment("月度报告.pdf", file);
// 内嵌图片,cid要与HTML中的src对应
FileSystemResource image = new FileSystemResource(new File("D:\\files\\logo.png"));
helper.addInline("logoPic", image);
mailSender.send(message);
}这里有个容易踩的坑:内嵌图片的cid必须和HTML中src属性的值完全一致,否则图片不会显示,只出现一个占位符。另外文件路径中的反斜杠在Java字符串里要写成\\转义形式,或者干脆使用正斜杠以及ClassPathResource从resources目录读取,后者更利于打包部署。
三、常见问题排查与最佳实践
1. 典型异常分析
整合过程中最常遇到的几类异常值得梳理一下。第一个是AuthenticationFailedException,绝大多数是授权码填错,或者邮箱后台没有开启SMTP服务,重新生成授权码即可。第二个是connect time out,一般是端口和协议不匹配,比如465端口没有开启SSL,或者服务器防火墙拦截了出站端口。第三个是中文乱码,确保配置了default-encoding: UTF-8,文件名中文乱码时可以使用helper.setAttachmentFilename(MimeUtility.encodeText(name))编码处理。
2. 生产环境的几点建议
实际项目中建议把邮件发送封装成独立服务,并且使用@Async异步执行,避免SMTP通信耗时阻塞主业务线程。发送失败的记录应落库并支持重试,防止网络抖动导致邮件丢失。同时要控制发送频率,部分邮箱服务商对单账号每日发信量有限制,超出会临时封禁。对于验证码类邮件,建议在内容中加入有效期提示并在服务端做好过期校验。如果发送量较大,可以考虑专业邮件服务商的API,稳定性和送达率会更有保障。
总的来说,Spring Boot Mail把JavaMail的复杂度封装得相当到位,配合JavaMailSender和MimeMessageHelper这两个核心类,从简单文本到带附件的复杂邮件都能轻松搞定,把配置和封装做扎实之后,邮件功能可以稳定地服务于各类业务场景。
Spring Boot Mail邮件发送Spring Boot整合修改时间:2026-09-05 14:48:34