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

JavaMail 實戰:解析 Hotmail 退信 (multipart/report) 處理方案

     編輯:Java 相關知識

問題背景

Hotmail 實現了郵件傳送狀態通知 (multipart/report),標準郵件客戶端常忽略此類型,導致退信無法正確識別。RFC 1892 定義了 DSN (Delivery Status Notifications) 格式,但普及率低,眾多服務器採用私有格式,增加解析難度。

解決方案:擴展解析邏輯

在現有 parseMultipart 遞歸解析中,針對兩種特殊 MIME 類型添加處理:


private void parseMultipart(Multipart multipart) throws Exception {
    for (int i = 0, n = multipart.getCount(); i < n; i++) {
        BodyPart part = multipart.getBodyPart(i);
        if (part.isMimeType("multipart/*")) {
            parseMultipart((Multipart) part.getContent());
        } else if (part.isMimeType("text/html")) {
            // 處理文本內容
        }
        // 處理附件、圖片等...
        
        // 【關鍵擴展】退信狀態通知
        else if (part.isMimeType("message/delivery-status")) {
            part.setFileName("details.txt"); // 模仿 Outlook 命名
            saveAttachedFile(part); // 內含退信原因、狀態碼、原郵件頭等
        }
        // 【關鍵擴展】原郵件內容 (RFC822 格式)
        else if (part.isMimeType("message/rfc822")) {
            MimeBodyPart mbp = new MimeBodyPart(part.getInputStream());
            part.setFileName(mbp.getHeader("Subject", null) + ".eml"); // 以原主題命名
            saveAttachedFile(part);
        }
    }
}

進階優化建議

  • 關聯原發送郵件:根據 Message-ID 在「已發送」箱查找原件。
  • 觸發通知事件:推送給用戶或記錄日誌分析退信率。
  • 分類處理:區分永久失敗 (5.x.x) 與暫時性失敗 (4.x.x),自動重試或清理列表。

補充:Hotmail 協議特殊性

Hotmail 非 POP3,而是基於 WebDAV 協議。JavaMail 訪問 Hotmail 需使用專用 Provider(如 com.sun.mail.webdav),詳見《通過 JavaMail 訪問 Hotmail 郵箱》。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved