SmtpClient发送邮件时附件名称乱码

探讨使用System.Net.Mail.SmtpClient发送带有长中文名附件的邮件时出现乱码的问题。提供.NET Framework BUG详情及补丁下载链接,并给出绕过BUG的代码示例。

在用户环境发现一个现象,使用System.Net.Mail.SmtpClient发送邮件,当附件名包含中文且长度较长时,最终的邮件里附件名会乱掉,写个简单的测试程序:

1
2
3
4
5
6
7
8
9
var  mail =  new  MailMessage( "from@test.com" "to@test.com" );
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居然是这样的:

wKioL1TAk2HxTQVDAALo43KZJXY016.jpg


这个怪异的name导致了在邮件客户端里显示乱码。换不同的机器测试,有些机器是正常的,说明与软件环境有关。正常的邮件应该是这样的:

wKiom1TAkzPTByU1AALE4lxTXVw257.jpg


研究了一下,发现是.Net Framework的BUG,详见微软网站:http://support.microsoft.com/kb/2402064, 当附件名超过41个utf8 byte时,会错误的进行2次编码导致的。 补丁见 https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=31723。


如果服务器未升级,可以暂时修改程序来避开这个BUG,主要是手工指定附件的名称:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var  mail =  new  MailMessage( "from@test.com" "to@test.com" );
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 =  "attachment" ;            //指定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);


此时收到的邮件是这样的,注意划红线部分:

wKiom1TAmEbAA5K4AAKvKFT83aQ416.jpg






    本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/1606985,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值