複合郵件包含圖片、HTML正文、純文字替代版等多部分,MIME類型層級結構:
multipart/alternative:同一內容不同表現(文字/HTML)multipart/related:HTML內嵌資源(圖片、CSS)text/plain、text/html、image/*等郵件結構呈樹狀,需遞迴遍歷才能正確提取內容。
public String getContent(Part part) throws MessagingException, IOException {
String contentType = part.getContentType();
if (contentType == null) return "無效部分";
ContentType ct = new ContentType(contentType);
// 文字/HTML直接提取
if (ct.match("text/plain") || ct.match("text/html")) {
return "" + part.getContent() + "
";
}
// 附件資訊
StringBuilder result = new StringBuilder();
String fileName = part.getFileName();
if (fileName != null) {
result.append("附件: ").append(fileName).append("
");
}
String desc = part.getDescription();
if (desc != null) {
result.append("說明: ").append(desc).append("
");
}
// 遞迴處理multipart
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
result.append(getContent(mp.getBodyPart(i)));
}
}
return result.toString();
}
multipart/alternative與multipart/related嵌套,必須遞迴到葉子節點ContentType.match()而非字串比對,支援參數化MIME類型part.getContent()自動處理Base64/Quoted-Printable解碼messageId與partIndex定位MimeMessage避免重複解析Content-ID索引此方案支援主流郵件客戶端生成的複雜MIME結構,是JavaMail處理複合郵件的標準模式。