首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JavaMail 入門實戰(三):發送郵件完整指南

     編輯:Java 綜合教學

JavaMail 發送郵件實戰:從文本到帶附件/內嵌資源的複雜郵件

承接前兩篇(會話創建、郵件構建),本文聚焦 Transport 類發送流程,給出純文本、HTML、帶附件、帶內嵌圖片四種完整可運行示例,並說明 SMTP 認證、SSL/TLS、QQ/163/企業郵箱常見配置坑點。

核心發送流程(三步走)

  1. 從 Session 獲取協議實現:Transport transport = session.getTransport("smtp")。
  2. 連接 SMTP 服務器:transport.connect(smtpHost, username, authCode) —— **注意:密碼欄填「授權碼」而非登錄密碼**。
  3. 發送並關閉:transport.sendMessage(msg, msg.getAllRecipients()); transport.close()。

示例 1:發送純文本郵件

Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.smtp.port", "465");           // SSL 端口
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");    // 啟用 SSL
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

Session session = Session.getDefaultInstance(props);
session.setDebug(true); // 打印完整 SMTP 交互日志

MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("sender@qq.com"));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("receiver@163.com"));
msg.setSubject("JavaMail 測試 - 純文本");
msg.setText("你好,這是純文本郵件。", "UTF-8");
msg.setSentDate(new Date());
msg.saveChanges();

Transport transport = session.getTransport("smtp");
transport.connect("sender@qq.com", "授權碼"); // QQ郵箱需開啟SMTP獲取授權碼
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();

示例 2:發送 HTML 富文本郵件

MimeMessage msg = new MimeMessage(session);
// ... 設置發件人、收件人、主題同前 ...
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent("<h1 style='color:#1890ff'>HTML 郵件</h1><p>支持<b>富文本</b>排版</p>", "text/html;charset=UTF-8");

MimeMultipart mp = new MimeMultipart("alternative");
mp.addBodyPart(htmlPart);
msg.setContent(mp);
msg.saveChanges();
// ... 發送流程同前 ...

示例 3:發送帶附件郵件

MimeMessage msg = new MimeMessage(session);
// ... 基礎頭信息 ...
MimeBodyPart textPart = new MimeBodyPart();
textPart.setText("請查收附件。", "UTF-8");

MimeBodyPart attachPart = new MimeBodyPart();
DataSource fds = new FileDataSource("/path/to/report.pdf");
attachPart.setDataHandler(new DataHandler(fds));
attachPart.setFileName(MimeUtility.encodeText("報告.pdf")); // 中文文件名編碼

MimeMultipart mp = new MimeMultipart("mixed");
mp.addBodyPart(textPart);
mp.addBodyPart(attachPart);
msg.setContent(mp);
msg.saveChanges();

示例 4:發送帶內嵌圖片的 HTML 郵件

MimeMessage msg = new MimeMessage(session);
// ...
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent("<img src='cid:logo' /><p>內嵌圖片測試</p>", "text/html;charset=UTF-8");

MimeBodyPart imgPart = new MimeBodyPart();
DataSource ids = new FileDataSource("/path/to/logo.png");
imgPart.setDataHandler(new DataHandler(ids));
imgPart.setHeader("Content-ID", "<logo>"); // 與 cid:logo 對應

MimeMultipart related = new MimeMultipart("related");
related.addBodyPart(htmlPart);
related.addBodyPart(imgPart);

MimeMultipart mixed = new MimeMultipart("mixed");
mixed.addBodyPart(new MimeBodyPart()); // 可再加附件
// 將 related 作為一個整體加入 mixed
MimeBodyPart relatedWrapper = new MimeBodyPart();
relatedWrapper.setContent(related);
mixed.addBodyPart(relatedWrapper);

msg.setContent(mixed);
msg.saveChanges();

常見郵箱 SMTP 配置速查

郵箱SMTP 主機SSL 端口非 SSL 端口備註
QQ郵箱smtp.qq.com465587 (STARTTLS)需開啟「服務-賬號-POP3/SMTP」獲取授權碼
163郵箱smtp.163.com465/99425需開啟「設置-POP3/SMTP/IMAP」獲取授權碼
Gmailsmtp.gmail.com465587 (STARTTLS)需開啟「兩步驟驗證」生成應用專用密碼
Outlooksmtp.office365.com587 (STARTTLS)—企業郵箱通用

避坑指南

  • 授權碼 ≠ 登錄密碼:所有主流郵箱 SMTP 均需單獨生成授權碼/應用密碼。
  • SSL vs STARTTLS:465 端口通常隱式 SSL;587 端口需 mail.smtp.starttls.enable=true。
  • 中文主題/附件名:使用 MimeUtility.encodeText() 編碼,防止亂碼。
  • 大附件:調大 mail.smtp.timeout、mail.smtp.connectiontimeout,考慮分片發送。
  • 調試模式:session.setDebug(true) 能輸出完整 SMTP 指令交互,排查連接、認證、發送失敗的利器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved