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

JMail 發送郵件與附件中文檔名亂碼解決方案

     編輯:ASP.NET 基礎

前言

JMail (Dimac JMail) 是經典 ASP/ASP.NET 郵件元件,需註冊 COM DLL (`regsvr32 jmail.dll`)。使用 `AddAttachment` 附加中文檔名時,郵件原始碼會出現 `=?GB2312?Q?...?=` 編碼導致部分收信端顯示亂碼。本文分析成因並提供「不設定 ContentType」的簡單解法。

基本發送程式碼


using JMAIL;

public void SendMail(string sender, string senderMail, string receiver, string subject, string body)
{
    MessageClass msg = new MessageClass();
    msg.Charset = "utf-8";          // 郵件主體編碼
    msg.From = senderMail;
    msg.FromName = sender;
    msg.Subject = subject;
    msg.Body = body;                // HTML 內容
    msg.AddRecipient(receiver, "", "");
    msg.MailServerUserName = "smtpUser";
    msg.MailServerPassWord = "smtpPwd";

    if (msg.Send("smtp.163.com", false))
        Console.WriteLine("發送成功");
    else
        Console.WriteLine("發送失敗: " + msg.ErrorMessage);
}

附件亂碼問題重現


// 附加中文檔名
msg.AddAttachment(@"C:\報表_202401.xlsx"); 

// 郵件原始碼片段 (Content-Type 標頭)
Content-Type: application/octet-stream; name="=?GB2312?Q?=B3=A8=BC=FE=5F=32=30=32=34=30=31=2E=78=6C=73=78?="
Content-Disposition: inline; filename="=?GB2312?Q?=B3=A8=BC=FE=5F=32=30=32=34=30=31=2E=78=6C=73=78?="

部分舊版 Outlook/網頁郵件無法正確解碼 `=?GB2312?Q?...?=`,顯示亂碼或空白檔名。

解決方案:移除 msg.ContentType 設定

JMail 內部邏輯:若手動設定 `msg.ContentType = "text/html"`,附件編碼會強制使用該字元集 (GB2312) 進行 Q-Encoding。完全不設定 ContentType,讓 JMail 自動根據 `Charset` (UTF-8) 產生標準 MIME 結構,附件檔名改用 RFC 2231 (`filename*=UTF-8''...`) 或標準 Base64 編碼,相容性大幅提升。


// 關鍵:刪除或註解掉這行
// msg.ContentType = "text/html"; 

// 正確流程
msg.Charset = "utf-8";
msg.Body = "..."; // HTML 內容
// 不設定 ContentType
msg.AddAttachment(@"C:\報表_202401.xlsx"); // 中文檔名正常

完整修正後發送方法


public void SendMailWithAttachment(string sender, string senderMail, string receiver, 
    string subject, string htmlBody, string attachmentPath)
{
    MessageClass msg = new MessageClass();
    msg.Charset = "utf-8";
    msg.From = senderMail;
    msg.FromName = sender;
    msg.Subject = subject;
    msg.Body = htmlBody;
    msg.AddRecipient(receiver, "", "");
    msg.MailServerUserName = "user";
    msg.MailServerPassWord = "pwd";

    if (!string.IsNullOrEmpty(attachmentPath))
    {
        // 可選:指定 MIME 類型 (第三參數)
        // msg.AddAttachment(attachmentPath, false, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        msg.AddAttachment(attachmentPath); // 只傳路徑,讓 JMail 自動判斷
    }

    bool ok = msg.Send("smtp.163.com", false);
    // 處理結果...
}

JMail 附件相關方法補充

方法用途
AddAttachment(path, inline, contentType)本地檔案附件。inline=true 為內嵌圖片 (CID 引用)
AddURLAttachment(url, saveAs, inline, auth)從 URL 下載並附加,支援基本認證

現代替代建議

  • System.Net.Mail (內建):.NET Framework 2.0+ 內建、無需註冊 COM、支援 SSL/TLS、附件編碼標準 (RFC 2231)。
  • MailKit:跨平台、支援 OAuth2/IMAP/SMTP/POP3、MimeKit 處理複雜 MIME、MIT 授權。
  • FluentEmail:MailKit/System.Net.Mail 之上的流暢 API、支援 Razor 模板。

總結

JMail 附件中文檔名亂碼的核心原因是手動設定 `ContentType` 導致編碼不匹配。移除 `msg.ContentType` 設定,僅設定 `Charset="utf-8"` 即可讓 JMail 產生標準相容的 MIME 結構。長期來看,建議遷移至 `System.Net.Mail` 或 `MailKit` 避免 COM 元件部署與維護痛點。

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