邮件发送
依赖与配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
Boot 检测到 spring.mail.host 后会自动配置 JavaMailSender Bean。以常见 SMTP 为例(具体参数以你的邮箱服务商说明为准):
spring.mail.host=smtp.example.com
spring.mail.port=465
spring.mail.username=notify@example.com
spring.mail.password=邮箱授权码
spring.mail.protocol=smtps
spring.mail.properties.mail.smtp.ssl.enable=true
使用 587 端口 + STARTTLS 时写法不同(auth=true、starttls.enable=true,不启用 ssl.enable)。两种加密方式别混配。注意很多服务商要求填「授权码」而非登录密码,并需先在邮箱后台开启 SMTP 服务。
简单文本邮件
@Service
public class MailService {
private final JavaMailSender sender;
public MailService(JavaMailSender sender) {
this.sender = sender;
}
public void sendSimple(String to, String subject, String text) {
SimpleMailMessage msg = new SimpleMailMessage();
msg.setFrom("notify@example.com");
msg.setTo(to);
msg.setSubject(subject);
msg.setText(text);
sender.send(msg);
}
}
多数服务商要求发件地址与认证账号一致,setFrom 不要随便填。
HTML 邮件与附件
public void sendRich(String to, String subject, String html) throws MessagingException {
MimeMessage message = sender.createMimeMessage();
// true 表示 multipart,可携带附件
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setFrom("notify@example.com");
helper.setTo(to);
helper.setSubject(subject);
helper.setText(html, true); // true 表示按 HTML 解析正文
helper.addAttachment("报表.pdf", new File("D:/tmp/report.pdf"));
sender.send(message);
}
MimeMessageHelper 还提供 setCc(抄送)、setBcc(密送)、addAttachment(name, InputStreamSource) 等方法;附件不必是磁盘文件,把字节流包成 ByteArrayResource 即可。完整用法以 Spring 官方 JavaMail 文档为准。
实践注意
- 发送是网络 IO,频繁或批量发送时放入线程池或消息队列异步执行(见 21 章),避免阻塞请求线程;
- 发送失败会抛
MailException及其子类,调用处要做好日志与重试策略; - 收件人、内容等参数建议用 09 章的校验先行把关;
- 本地开发没有真实邮箱时,可以注入
JavaMailSender的 Mock 或搭建测试邮箱,保证业务代码可测试(见 23 章)。
小结
邮件功能 = spring-boot-starter-mail + spring.mail.* 配置 + JavaMailSender。文本用 SimpleMailMessage,HTML/附件用 MimeMessageHelper,剩下的坑基本都在服务商 SMTP 参数上,跟着它的说明文档配置即可。