普通郵件 Content-Type 為 text/html;帶附件郵件需設置為 Multipart,包含正文部分(text/html)與一個或多個附件部分。
private Multipart getMultipart() throws MessagingException, UnsupportedEncodingException {
MimeMultipart mp = new MimeMultipart();
try {
// 1. 正文部分
MimeBodyPart contentPart = new MimeBodyPart();
// 必須指定字符集,否則中文亂碼
contentPart.setContent(_mailContent.getContent(), "text/html; charset=GB2312");
mp.addBodyPart(contentPart);
// 2. 附件部分
for (int i = 0; i < _mailAttachment.getAttachPath().size(); i++) {
MimeBodyPart attachmentPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(
(String) _mailAttachment.getAttachPath().get(i));
attachmentPart.setDataHandler(new DataHandler(fds));
// 關鍵:編碼文件名,解決中文附件名顯示問題
attachmentPart.setFileName(
MimeUtility.encodeWord(fds.getName(), "GB2312", null));
mp.addBodyPart(attachmentPart);
}
} catch (MessagingException | UnsupportedEncodingException e) {
System.out.println("郵件構建失敗: " + e.getMessage());
throw e;
}
return mp;
}
setContent() 指定 charset,附件文件名 MimeUtility.encodeWord() 指定編碼。缺一不可。setFileName(encodeWord(...)),附件雖會發送(郵件體積增大),但收件端不顯示附件名。此特性可用於實現「內嵌圖片的 HTML 郵件」—— 附件實為圖片,HTML 正文通過 cid: 引用。_mailAttachment.getAttachPath() 需為 List,存放絕對路徑。利用上述特性:將圖片作為附件添加但不設置文件名(或設置為空),HTML 正文中使用 <img src="cid:part1.xxx"> 引用。具體實現需為每個圖片附件指定 Content-ID 頭。(本文專注附件發送,內嵌圖片詳見後續專題)