SmtpClient发送邮件时附件名称乱码
程序员文章站
2022-06-21 20:46:00
System.Net.Mail.SmtpClient发送邮件,当附件名包含中文且附件名超过41个utf8 byte时,会错误的进行2次编码导致乱码。 ......
在用户环境发现一个现象,使用system.net.mail.smtpclient发送邮件,当附件名包含中文且长度较长时,最终的邮件里附件名会乱掉,写个简单的测试程序:
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居然是这样的:
这个怪异的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("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 = "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);
此时收到的邮件是这样的,注意划红线部分:
推荐阅读
-
解决ci框架php发送邮件附件中文乱码问题
-
.Net使用SmtpClient发送邮件,报错:不允许使用邮箱名称。 服务器响应为: xxxw
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
-
SmtpClient发送邮件时附件名称乱码
-
解决 PHP 的 mail() 发送邮件时出现乱码的问题
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法,
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法,
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法_php技巧
-
PHPMailer发送邮件中文附件名乱码的解决办法
-
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法_PHP