邮件发送

依赖与配置

<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=truestarttls.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 参数上,跟着它的说明文档配置即可。

笔记加载中…