在用戶環境發現一個現象,使用System.Net.Mail.SmtpClient發送郵件,當附件名包含中文且長度較長時,最終的郵件里附件名會亂掉,寫個簡單的測驗程式:
var mail = new MailMessage("[email protected]", "[email protected]"); mail.Subject = "測驗郵件亂碼"; var atta = new Attachment(@"C:\測驗郵件中文出現亂碼20150115.rar"); mail.Attachments.Add(atta); var smtp = new SmtpClient(); smtp.Host = "test.com"; smtp.Credentials = new NetworkCredential("from", "test"); smtp.Send(mail);
使用Foxmail接收郵件,然后查看郵件原始資訊,發現附件部分的MIME居然是這樣的:

這個怪異的name導致了在郵件客戶端里顯示亂碼,換不同的機器測驗,有些機器是正常的,說明與軟體環境有關,正常的郵件應該是這樣的:

研究了一下,發現是.Net Framework的BUG,詳見微軟網站:http://support.microsoft.com/kb/2402064, 當附件名超過41個utf8 byte時,會錯誤的進行2次編碼導致的, 補丁見 https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=31723,
如果服務器未升級,可以暫時修改程式來避開這個BUG,主要是手工指定附件的名稱:
var mail = new MailMessage("[email protected]", "[email protected]"); mail.Subject = "測驗郵件亂碼"; string file = @"C:\測驗郵件中文出現亂碼20150115.rar"; var atta = new Attachment(file); string name = Path.GetFileName(file); string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(name)); atta.ContentDisposition.FileName = string.Format("=?utf-8?B?{0}?=", base64); //指定附件的filename atta.Name = "p_w_upload"; //指定MimePart的Name,不包含中文,這樣就不會被BUG影響 atta.NameEncoding = Encoding.UTF8; mail.Attachments.Add(atta); var smtp = new SmtpClient(); smtp.Host = "test.com"; smtp.Credentials = new NetworkCredential("from", "test"); smtp.Send(mail);
此時收到的郵件是這樣的,注意劃紅線部分:

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/103518.html
標籤:C#
上一篇:C#冒泡演算法
