JavaMail 是 Java 平台發送電子郵件的標準 API。本文記錄從 Maven 引入依賴、SMTP 服務配置、核心代碼封裝到常見坑點(SSL/TLS、授權碼、附件發送)的完整實戰流程,助你快速集成郵件功能。
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
或手動下載 javax.mail.jar 放入 classpath。推薦使用 MvnRepository 查詢最新版本。
package com.example.util;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
public class MailUtil {
/** 發送純文本郵件
* @param subject 主題
* @param content 正文
* @param toAddress 收件人地址
* @throws MessagingException 郵件發送異常
*/
public static void sendTextMail(String subject, String content, String toAddress)
throws MessagingException {
// 1. SMTP 會話屬性
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true"); // 需認證
props.setProperty("mail.host", "smtp.163.com"); // 發件郵箱 SMTP 地址
props.setProperty("mail.transport.protocol", "smtp"); // 協議
// 2. 建立會話
Session session = Session.getInstance(props);
// 3. 構建郵件對象
MimeMessage message = new MimeMessage(session);
message.setSubject(subject);
message.setText(content);
message.setFrom(new InternetAddress("your_email@163.com")); // 發件人
// 4. 連接發送
Transport transport = session.getTransport();
transport.connect("your_email@163.com", "your_auth_code"); // 授權碼非登錄密碼
transport.sendMessage(message, new Address[]{new InternetAddress(toAddress)});
transport.close();
}
}
| 屬性 | 說明 | 常見值 |
|---|---|---|
| mail.smtp.auth | 是否需身份驗證 | true |
| mail.host | SMTP 服務器地址 | smtp.163.com / smtp.qq.com / smtp.gmail.com |
| mail.transport.protocol | 傳輸協議 | smtp |
| mail.smtp.port | SMTP 端口(可選) | 25 / 465(SSL) / 587(TLS) |
| mail.smtp.ssl.enable | 啟用 SSL | true (465 端口) |
| mail.smtp.starttls.enable | 啟用 STARTTLS | true (587 端口) |
public static void sendHtmlWithAttachment(String subject, String htmlContent,
String toAddress, File attachment)
throws MessagingException, IOException {
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.host", "smtp.163.com");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.ssl.enable", "true");
Session session = Session.getInstance(props);
MimeMessage message = new MimeMessage(session);
message.setSubject(subject);
message.setFrom(new InternetAddress("sender@163.com"));
// 建立 Multipart 容器
Multipart multipart = new MimeMultipart();
// 1. HTML 正文部分
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(htmlContent, "text/html;charset=UTF-8");
multipart.addBodyPart(htmlPart);
// 2. 附件部分
if (attachment != null && attachment.exists()) {
MimeBodyPart attachPart = new MimeBodyPart();
DataSource source = new FileDataSource(attachment);
attachPart.setDataHandler(new DataHandler(source));
attachPart.setFileName(MimeUtility.encodeText(attachment.getName()));
multipart.addBodyPart(attachPart);
}
message.setContent(multipart);
Transport transport = session.getTransport();
transport.connect("sender@163.com", "auth_code");
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}
| 異常 | 原因 | 解決 |
|---|---|---|
| AuthenticationFailedException | 密碼/授權碼錯誤 | 確認使用授權碼而非登錄密碼;檢查郵箱是否開啟 SMTP/IMAP 服務 |
| Could not connect to SMTP host | 網絡/防火牆/端口 | telnet smtp.xxx.com 25 測試連通性;嘗試 465/587 端口並啟用 SSL/TLS |
| MessagingException: 554 DT:SPM | 內容被判定為垃圾郵件 | 避免敏感詞;添加 DKIM/SPF 記錄;使用正規域名郵箱 |
| javax.net.ssl.SSLHandshakeException | SSL 證書不信任 | JDK 信任庫導入郵箱 CA 證書;或臨時信任所有憑證(僅測試) |
JavaMail API 設計經典,掌握 Session → Message → Transport 三步驟即可發送郵件。生產環境務必關注異步化、配置管理、重試與監控,確保郵件送達率。下一步可探索 Spring Boot JavaMailSender 封裝,進一步簡化代碼。