邮件
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);
}
}对比
| Laravel | Spring Boot |
|---|---|
Mail::to($to)->send(new WelcomeMail($user)) | mailService.sendWelcomeMail(...) |
| Mailable 类 | Service 方法(Java 没有 Mailable 类概念,Service 方法即可) |
emails/welcome.blade.php | templates/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) 里触发,避免事务回滚后发错邮件。
实践建议
- 邮件服务独立封装:
MailService收口所有发送逻辑,别在业务代码里直接mailSender - 模板优先:内容进模板,别在 Java 代码里拼 HTML
- 生产用 SMTP 服务:SES / SendGrid / 阿里云邮件推送,本地用 Mailtrap
- 发送失败要可观测:发送逻辑加日志 + 重试(
@Retryable或消息队列重投)