Skip to content

邮件


JavaMailSender(类比 Mail::send)

添加依赖

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

配置

yaml
spring:
  mail:
    host: smtp.qq.com
    port: 587
    username: your@qq.com
    password: your-auth-code     # QQ 邮箱用授权码,不是登录密码
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

发送简单邮件

java
@Service
public class MailService {

    @Autowired
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String from;

    public void sendSimple(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);        // 类比 Mail::send()
    }
}

// 使用
mailService.sendSimple("user@example.com", "欢迎注册", "感谢您注册我们的应用");

发送 HTML 邮件

java
public void sendHtml(String to, String subject, String htmlContent)
        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);    // true = HTML 格式

    mailSender.send(message);
}

发送带附件的邮件

java
public void sendWithAttachment(String to, String subject, String text, File attachment)
        throws MessagingException {

    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true);

    helper.setFrom(from);
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(text);
    helper.addAttachment(attachment.getName(), attachment);   // 添加附件

    mailSender.send(message);
}

⚠️ 常见坑

1. QQ 邮箱的授权码

JavaMailSender 配置 QQ 邮箱时,密码不是 QQ 密码,需要在 QQ 邮箱设置 → 账户 → 生成授权码。这和 Laravel 的配置一样,不是 Java 特有的问题。

2. 多部分邮件的异常

java
MimeMessageHelper helper = new MimeMessageHelper(message, true);
//                                 ⬆ 第二个参数 multipart,发送 HTML 或附件时必须为 true

如果忘了设为 true,HTML 内容会被当作纯文本显示,附件也无法添加。

3. 没有 Laravel 的 Mailable 类

Laravel 有 php artisan make:mail WelcomeMail 生成专门的邮件类,Spring Boot 没有。社区常用模板引擎(Thymeleaf 或 FreeMarker)来渲染邮件内容:

java
@Autowired
private SpringTemplateEngine templateEngine;

public void sendTemplate(String to, String subject, Context context) {
    String html = templateEngine.process("email/welcome", context);
    sendHtml(to, subject, html);
}

4. 异步发送避免阻塞

邮件发送是 IO 操作(网络请求),会阻塞当前线程。建议配合 @Async 使用:

java
@Async
public void sendSimple(String to, String subject, String content) { ... }

面向 PHP 开发者的 Spring Boot 文档