spring boot 使用 spring mail 发送邮件需配置 spring-boot-starter-mail 依赖及正确 smtp 参数,qq 邮箱须开启 smtp 并用授权码;支持 simplemailmessage 发文本邮件、mimemessagehelper 发 html 邮件和附件;常见问题包括授权码错误、端口被屏蔽、host/port 配置错误。

Spring Boot 中使用 Spring Mail 发送邮件,核心是依赖 spring-boot-starter-mail 和配置正确的 SMTP 参数,再通过 JavaMailSender 接口调用发送方法。关键不在写多少代码,而在于配置准确、授权方式正确、协议与端口匹配。
配置邮箱服务(以 QQ 邮箱为例)
必须先在邮箱官网开启 SMTP 服务并获取授权码(不是登录密码)。QQ 邮箱路径:设置 → 账号 → POP3/IMAP/SMTP/Exchange 服务 → 开启 SMTP 并按提示生成授权码。
application.yml 中配置如下:
spring:
mail:
host: smtp.qq.com
port: 465
username: your_email@qq.com
password: your_app_password
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
ssl:
enable: true
socketFactory:
port: 465
- 端口 465 对应 SSL 模式;若用 587,则需启用
starttls.enable: true,且 protocol 改为smtp - 163、126、Gmail 等邮箱的 host 和端口不同,需查对应服务商文档(如 163 是
smtp.163.com:465) - password 字段填的是授权码,填错会导致
AuthenticationFailedException
发送纯文本邮件
使用 SimpleMailMessage 最简方式实现:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
@Service
public class MailService {
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
public void sendTextMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
}
}
- 支持单个或多个收件人(
setTo(String[]))、抄送(setCc())、密送(setBcc()) - 不支持 HTML 标签或附件,仅用于通知类轻量消息
发送 HTML 邮件和带附件的邮件
需用 MimeMessageHelper 构建富文本内容:
public void sendHtmlWithAttachment(String to, String subject, String htmlContent, File attachment) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(htmlContent, true);
if (attachment != null && attachment.exists()) {
helper.addAttachment(attachment.getName(), new FileSystemResource(attachment));
}
mailSender.send(message);
}
- 构造
MimeMessageHelper时传入true表示支持附件 -
setText(..., true)才能渲染 HTML 标签,否则会原样显示源码 - 附件可来自文件系统、classpath 或字节数组(用
ByteArrayResource)
常见问题排查要点
发不出邮件?先检查这三项:
- 授权码是否过期或被重置(QQ/163 授权码不随密码变更自动更新)
- 防火墙或公司网络是否屏蔽了 465/587 端口
- 日志中是否出现
javax.mail.AuthenticationFailedException或Could not connect to SMTP host—— 前者配错密码,后者配错 host/port 或网络不通










