整體架構
Swing GUI (JFrame)
├── 發件人/收件人/主題/正文輸入區 (JTextField/JTextArea)
├── 附件選擇 (JFileChooser)
├── 發送按鈕 → 觸發 JavaMail 發送邏輯
└── 狀態顯示 (JLabel/JProgressBar)
↓
JavaMail API (javax.mail)
├── Session (SMTP 配置、認證)
├── MimeMessage (郵件內容構建)
├── Transport.send() (發送)
└── 支持 SSL/TLS、HTML、附件、內嵌圖片
核心依賴
<!-- Maven -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<!-- 或 Jakarta Mail (Java EE 8+) -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>
<version>2.0.1</version>
</dependency>
發送郵件核心代碼
public void sendMail(String from, String password, String to, String subject, String body, File[] attachments) throws MessagingException {
// 1. SMTP 會話配置
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com"); // 以 QQ 郵箱為例
props.put("mail.smtp.port", "465");
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(from, password);
}
});
session.setDebug(true); // 控制台打印通信日誌
// 2. 構建郵件
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject(subject, "UTF-8");
// 3. 多部分內容 (文本 + 附件)
Multipart multipart = new MimeMultipart();
// 文本部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(body, "text/html;charset=UTF-8");
multipart.addBodyPart(textPart);
// 附件部分
if (attachments != null) {
for (File file : attachments) {
MimeBodyPart attachPart = new MimeBodyPart();
attachPart.attachFile(file);
multipart.addBodyPart(attachPart);
}
}
message.setContent(multipart);
// 4. 發送
Transport.send(message);
System.out.println("郵件發送成功");
}
Swing 界面要點
- 使用
GridBagLayout 或 MigLayout 實現表單自適應佈局。
- 發送按鈕事件中開啟 SwingWorker 後台執行發送,避免阻塞 EDT 導致界面凍結。
- 進度條顯示附件上傳進度 (需自定義
OutputStream 監聽寫入字節數)。
常見問題排查
| 錯誤 | 原因 | 解決 |
| 535 Error: authentication failed | 密碼錯誤/未開啟 SMTP 服務/需授權碼 | 郵箱設置中開啟 SMTP、生成授權碼作為密碼 |
| Could not connect to SMTP host | 端口/協議錯誤/防火牆攔截 | 嘗試 465(SSL)/587(STARTTLS)/25,檢查網絡連通性 |
| 附件中文名亂碼 | MimeUtility.encodeWord 未編碼 | attachPart.setFileName(MimeUtility.encodeText(file.getName())) |
現代替代方案
- Spring Boot Mail Starter:
JavaMailSender 封裝,配置更簡潔。
- Simple Java Mail:流式 API,
email().from(...).to(...).subject(...).body(...).send()。
- 上一篇文章: 二叉樹創建:僅憑先序遍歷能否確定一棵樹?帶標記先序創建法
- 下一篇文章: Android 星級評價控件 RatingBar 完整使用指南:從 UI 到接口傳值
Copyright ©
程式碼之家 All Rights Reserved