package com.app.tools;
import java.util.Date;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class SendEmail {
// 163 郵箱配置
public static final String HOST = "smtp.163.com";
public static final String PROTOCOL = "smtp";
public static final int PORT = 25; // 163 使用 25 端口
public static final String FROM = "your_email@163.com"; // 發件郵箱
public static final String PWD = "your_auth_code"; // 客戶端授權碼(非登錄密碼!)
private static Session getSession() {
Properties props = new Properties();
props.put("mail.smtp.host", HOST);
props.put("mail.store.protocol", PROTOCOL);
props.put("mail.smtp.port", PORT);
props.put("mail.smtp.auth", "true"); // 必須為字符串 "true"
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(FROM, PWD);
}
};
return Session.getDefaultInstance(props, auth);
}
public static void send(String toEmail, String htmlContent) {
Session session = getSession();
try {
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(FROM));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(toEmail));
msg.setSubject("賬號激活郵件");
msg.setSentDate(new Date());
msg.setContent(htmlContent, "text/html;charset=utf-8");
Transport.send(msg);
System.out.println("郵件發送成功:" + toEmail);
} catch (MessagingException e) {
e.printStackTrace();
throw new RuntimeException("郵件發送失敗", e);
}
}
public static void main(String[] args) {
String html = "<h1>歡迎註冊</h1><p>點擊鏈接激活:<a href='https://xxx.com/activate?token=abc'>激活賬號</a></p>";
send("target@qq.com", html);
}
}
無論 163 還是 QQ 郵箱,登錄密碼不能直接用於 SMTP 認證,必須在郵箱設置中開啟「SMTP/IMAP/POP3 服務」並獲取獨立授權碼。

javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 25
排查清單:
telnet smtp.163.com 25 或 nc -zv smtp.163.com 25props.put("mail.smtp.auth", "true") 值必須為字符串 "true",非 boolean true,否則可能拋出「需要認證」異常
| 郵箱 | SMTP 主機 | 端口 | 加密方式 | 備註 |
|---|---|---|---|---|
| 163 | smtp.163.com | 25 / 465 / 587 | STARTTLS / SSL | 推薦 465 (SSL) 或 587 (STARTTLS) |
| smtp.qq.com | 465 / 587 | SSL / STARTTLS | 25 端口通常不支援 | |
| Gmail | smtp.gmail.com | 465 / 587 | SSL / STARTTLS | 需開啟「低安全性應用」或應用專用密碼 |
| Outlook | smtp.office365.com | 587 | STARTTLS | 企業郵箱可能不同 |
SSL 連接額外配置(以 465 端口為例):
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
javax.mail.AuthenticationFailedException
常見原因:

QQ 郵箱對單賬號發送頻率有嚴格限制(如每小時 20 封、每天 100 封)。測試階段建議:
@Async 或消息隊列剝離發送耗時Session 線程不安全,高併發場景使用 javax.mail.Session 無連接池特性,建議封裝連接池或使用 Spring JavaMailSender<!-- Maven -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>
<version>2.0.1</version>
</dependency>
<!-- 或舊版本 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>