使用 JavaMail API 發送郵件的標準流程包含:建立 Session、構建 MimeMessage、設定發件人/收件人/主旨/內容、透過 Transport 連接 SMTP 伺服器發送。以下以 126 郵箱為例,提供可直接運行的完整工具類。
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
public class EmailSender {
// === 請替換為您的真實帳號資訊 ===
private static final String USERNAME = "your_username";
private static final String PASSWORD = "your_auth_code"; // 客戶端授權碼,非登入密碼
private static final String SMTP_HOST = "smtp.126.com";
private static final String FROM_EMAIL = USERNAME + "@126.com";
private static final String FROM_NAME = "我的應用系統";
public static void sendHtmlMail(String to, String subject, String htmlContent) throws MessagingException {
Properties props = new Properties();
props.put("mail.smtp.host", SMTP_HOST);
props.put("mail.smtp.auth", "true");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.port", "25"); // 或 465 (SSL), 587 (TLS)
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(USERNAME, PASSWORD);
}
});
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(FROM_EMAIL, FROM_NAME, "UTF-8"));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject(subject, "UTF-8");
message.setSentDate(new Date());
// 建立 HTML 郵件內容
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(htmlContent, "text/html;charset=UTF-8");
MimeMultipart multipart = new MimeMultipart("mixed");
multipart.addBodyPart(htmlPart);
message.setContent(multipart);
message.saveChanges();
// 發送
try (Transport transport = session.getTransport("smtp")) {
transport.connect(SMTP_HOST, 25, USERNAME, PASSWORD);
transport.sendMessage(message, message.getAllRecipients());
}
System.out.println("郵件發送成功: " + to);
}
public static void main(String[] args) {
String html = "歡迎註冊
請點擊 啟用帳號
";
try {
sendHtmlMail("target@qq.com", "帳號啟用通知", html);
} catch (Exception e) {
e.printStackTrace();
}
}
}
UTF-8,使用 MimeUtility.encodeText() 處理中文。MimeBodyPart,使用 FileDataSource + DataHandler,設定 setFileName(MimeUtility.encodeText(name)) 避免中文亂碼。multipart/related,htmlPart 引用 cid:imageId,另一個 MimeBodyPart 設定 setHeader("Content-ID", "<imageId>")。mail.smtp.ssl.enable=true 或 mail.smtp.starttls.enable=true,端口對應修改。JavaMail 發送郵件核心不複雜,難點在於郵箱服務商的反垃圾策略與網路環境變數。掌握授權碼配置、內容合規、編碼處理、異常排查,即可構建穩健的郵件通知服務。