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

JavaMail 發送帶附件郵件:完整實戰指南

     編輯:Java 程式設計入門

郵件結構與 Content-Type 關鍵點

普通郵件 Content-Type 為 text/html;帶附件郵件需設置為 Multipart,包含正文部分(text/html)與一個或多個附件部分。

核心代碼:構建 Multipart 郵件內容

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;
}

關鍵注意事項

  1. 字符集雙重設置:正文 setContent() 指定 charset,附件文件名 MimeUtility.encodeWord() 指定編碼。缺一不可。
  2. 附件名編碼的隱性作用:若省略 setFileName(encodeWord(...)),附件雖會發送(郵件體積增大),但收件端不顯示附件名。此特性可用於實現「內嵌圖片的 HTML 郵件」—— 附件實為圖片,HTML 正文通過 cid: 引用。
  3. 附件路徑集合 _mailAttachment.getAttachPath() 需為 List,存放絕對路徑。

發送包含內嵌圖片的 HTML 郵件(進階應用)

利用上述特性:將圖片作為附件添加但不設置文件名(或設置為空),HTML 正文中使用 <img src="cid:part1.xxx"> 引用。具體實現需為每個圖片附件指定 Content-ID 頭。(本文專注附件發送,內嵌圖片詳見後續專題)


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