文档站点
Skip to content

邮件 ​

Laravel 用 Mail::to()->send() + Mailable 类 + config/mail.php;Spring Boot 用 JavaMailSender + SimpleMailMessage / MimeMessage + application.yml。概念对应得很工整,差异主要在「模板渲染」上。

配置 SMTP ​

yaml
spring:
  mail:
    host: smtp.example.com
    port: 587
    username: your@example.com
    password: your-password
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

对应 Laravel 的 MAIL_MAILER、MAIL_HOST、MAIL_USERNAME 等。

TIP

测试/开发环境推荐用 Mailtrap 这类假 SMTP 服务,邮件不会真发出去,但流程全通。Laravel 开发者应该很熟了,Java 用法一样 —— 把 host/port 换成 Mailtrap 的即可。

发送纯文本邮件 ​

java
@Service
public class MailService {
    private final JavaMailSender mailSender;

    public MailService(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendWelcome(String to, String name) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(to);
        message.setSubject("欢迎注册");
        message.setText("你好," + name + ",欢迎加入!");
        mailSender.send(message);
    }
}

对应 Laravel:

php
Mail::raw("你好,$name,欢迎加入!", function ($m) use ($to) {
    $m->to($to)->subject('欢迎注册');
});

发送 HTML 邮件 + 附件 ​

java
public void sendHtml(String to, String subject, String html) throws MessagingException {
    MimeMessage message = mailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(html, true);                      // true = HTML

    FileSystemResource file = new FileSystemResource("invoice.pdf");
    helper.addAttachment("invoice.pdf", file);        // 附件

    mailSender.send(message);
}

邮件模板:Thymeleaf(对应 Blade 邮件模板) ​

Laravel 用 resources/views/emails/xxx.blade.php;Spring 用 Thymeleaf 模板引擎渲染 HTML 再发:

依赖 ​

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

模板:src/main/resources/templates/emails/welcome.html ​

html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
    <h1 th:text="'你好,' + ${name}">你好</h1>
    <p>欢迎加入,点击下面的链接完成注册:</p>
    <a th:href="${link}">完成注册</a>
</body>
</html>

TIP

Thymeleaf 属性:th:text(文本)、th:href(链接)、th:each(循环)、th:if(判断)。${name} 是传入的数据。它就是 Java 世界的 Blade。

渲染并发送 ​

java
@Service
public class MailService {
    private final JavaMailSender mailSender;
    private final SpringTemplateEngine templateEngine;

    public MailService(JavaMailSender mailSender, SpringTemplateEngine templateEngine) {
        this.mailSender = mailSender;
        this.templateEngine = templateEngine;
    }

    public void sendWelcomeMail(String to, String name, String link) throws MessagingException {
        Context context = new Context();
        context.setVariable("name", name);
        context.setVariable("link", link);

        String html = templateEngine.process("emails/welcome", context);   // 渲染模板

        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
        helper.setTo(to);
        helper.setSubject("欢迎注册");
        helper.setText(html, true);
        mailSender.send(message);
    }
}

对比

LaravelSpring Boot
Mail::to($to)->send(new WelcomeMail($user))mailService.sendWelcomeMail(...)
Mailable 类Service 方法(Java 没有 Mailable 类概念,Service 方法即可)
emails/welcome.blade.phptemplates/emails/welcome.html + Thymeleaf
th:text="${name}"
Mail::queue()配合 @Async 或消息队列(见 异步与队列)

异步发送 ​

邮件是慢操作(网络 IO),同步发会拖慢请求。Laravel 用 Mail::queue();Spring 配合 @Async:

java
@Async
public void sendWelcomeMail(String to, String name, String link) { ... }

或在 @TransactionalEventListener(AFTER_COMMIT) 里触发,避免事务回滚后发错邮件。

实践建议 ​

  1. 邮件服务独立封装:MailService 收口所有发送逻辑,别在业务代码里直接 mailSender
  2. 模板优先:内容进模板,别在 Java 代码里拼 HTML
  3. 生产用 SMTP 服务:SES / SendGrid / 阿里云邮件推送,本地用 Mailtrap
  4. 发送失败要可观测:发送逻辑加日志 + 重试(@Retryable 或消息队列重投)

面向 PHP / Laravel 开发者的 Spring Boot 中文文档