邮件
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. 多部分邮件的异常
javaMimeMessageHelper 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) { ... }