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?...?=`,顯示亂碼或空白檔名。
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);
// 處理結果...
}
| 方法 | 用途 |
|---|---|
| AddAttachment(path, inline, contentType) | 本地檔案附件。inline=true 為內嵌圖片 (CID 引用) |
| AddURLAttachment(url, saveAs, inline, auth) | 從 URL 下載並附加,支援基本認證 |
JMail 附件中文檔名亂碼的核心原因是手動設定 `ContentType` 導致編碼不匹配。移除 `msg.ContentType` 設定,僅設定 `Charset="utf-8"` 即可讓 JMail 產生標準相容的 MIME 結構。長期來看,建議遷移至 `System.Net.Mail` 或 `MailKit` 避免 COM 元件部署與維護痛點。