下面使用 Spring Boot 3、Java 17 以上版本,通过 SMTP 发送纯文本或 HTML 邮件。SMTP 授权码和网页登录密码可能不同,以邮箱服务商说明为准。
依赖与配置
在已有 Spring Boot 项目添加依赖,由 Boot 管理版本:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId></dependency>application.yml 示例使用 SMTPS 465。服务器、端口与 TLS 模式必须和服务商一致;使用 STARTTLS 587 时不要照抄这份 SSL 配置。
spring: mail: host: ${SMTP_HOST} port: 465 username: ${SMTP_USER} password: ${SMTP_PASSWORD} default-encoding: UTF-8 properties: mail.smtp.auth: true mail.smtp.ssl.enable: true mail.smtp.connectiontimeout: 5000 mail.smtp.timeout: 5000 mail.smtp.writetimeout: 5000通过运行环境设置这三个变量,不提交授权码。保存下面的 MailService.java 到启动类扫描范围,包名改成自己的:
package example;
import jakarta.mail.MessagingException;import org.springframework.beans.factory.annotation.Value;import org.springframework.mail.SimpleMailMessage;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.mail.javamail.MimeMessageHelper;import org.springframework.stereotype.Service;
@Servicepublic class MailService { private final JavaMailSender sender; private final String from;
public MailService(JavaMailSender sender, @Value("${spring.mail.username}") String from) { this.sender = sender; this.from = from; }
public void sendText(String to, String subject, String text) { SimpleMailMessage mail = new SimpleMailMessage(); mail.setFrom(from); mail.setTo(to); mail.setSubject(subject); mail.setText(text); sender.send(mail); }
public void sendHtml(String to, String subject, String html) throws MessagingException { var mail = sender.createMimeMessage(); var helper = new MimeMessageHelper(mail, false, "UTF-8"); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(html, true); sender.send(mail); }}从已有业务方法注入 MailService 后,调用 sendText(自己的收件邮箱, "SMTP 测试", "这是一封测试邮件")。不要把真实发送放进每次自动运行的测试;单元测试用模拟的 JavaMailSender 检查邮件内容。
怎样判断成功
sender.send 无异常说明 SMTP 服务器接受了这次提交,不代表邮件最终进入收件箱。首次只发给自己的邮箱,同时查看垃圾邮件和退信。
连接超时先查主机、端口与网络;认证失败查 SMTP 是否开启、授权码和发件地址;SSL 错误查 TLS 模式与证书。不要通过关闭证书校验解决问题。
评论