Exception: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM
解決:設置 mail.smtp.starttls.enable=true。
NoSuchProviderException: Invalid protocol: null原因:應用打包時攜帶的 javax.mail 版本與容器(Jetty)自帶版本衝突,容器優先加載舊版 Jar,導致默認協議解析失效。
解決:顯式指定協議 session.getTransport("smtp"),或升級容器 Jar / 打包排除依賴。
package com.zhyea.zytools;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
public class MailSender {
private static final String HOST = "smtp.exmail.qq.com";
private static final int PORT = 587;
private static final String USER = "robin@zhyea.com";
private static final String PASS = "robinzhyea";
private static final Properties PROPS = new Properties();
static {
PROPS.put("mail.smtp.host", HOST);
PROPS.put("mail.smtp.port", PORT);
PROPS.put("mail.smtp.auth", "true");
PROPS.put("mail.smtp.user", USER);
PROPS.put("mail.smtp.password", PASS);
PROPS.put("mail.smtp.starttls.enable", "true"); // 關鍵
}
public static void send(String to, String subject, String htmlContent) {
try {
Session session = Session.getInstance(PROPS);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(USER));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject);
msg.setContent(htmlContent, "text/html;charset=gbk");
msg.setSentDate(new Date());
msg.saveChanges();
Transport transport = session.getTransport("smtp"); // 顯式指定協議
transport.connect(USER, PASS);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
} catch (Exception e) { e.printStackTrace(); }
}
}
| 屬性 | 值 | 說明 |
|---|---|---|
| mail.smtp.host | smtp.exmail.qq.com | SMTP 服務器 |
| mail.smtp.port | 587 | STARTTLS 端口 |
| mail.smtp.starttls.enable | true | 啟用 TLS 升級 |
| mail.smtp.auth | true | 需要認證 |
getTransport("smtp") 可繞過默認協議解析 Bug。JavaMailSender 統一管理配置與連接池。