如何在C# SmtpClient编程中设置包含中文字符的附件文件名?

3

我的代码如下:

ContentType ct = new ContentType();
ct.MediaType = MediaTypeNames.Application.Octet;
ct.Name = "这是一个很长的中文文件名希望能用它在附件名中.Doc";
Attachment attach = new Attachment(stream, ct);

但是收到的附件文件名不正确,并且我发现ct.Name变成了"=?utf-8?B?6L+Z5piv5LiA5Liq5b6I6ZW/55qE5Lit5paH5paH5Lu25ZCN5biM5pyb?=\r\n =?utf-8?B?6IO955So5a6D5Zyo6ZmE5Lu25ZCN5Lit?=",在VS2010调试器中。

请建议,如何在附件文件名中使用中文字符?


哇!第一次在 SO 问题中看到中文! - Cheng Chen
实际上,我对调试器中名称中的换行符持怀疑态度。这是因为中文中的某些内容而生成的吗?您能否尝试不使用它或使用更简单的内容 - 比如仅使用前几个字符? - Rup
已知问题:http://support.microsoft.com/kb/2402064 - phoenix
3个回答

2

你可以尝试:

Attachment att = new Attachment(@"c:\path to file\somename.txt",    
System.Net.Mime.MediaTypeNames.Application.Octet);

//this itself should work.
att.Name = "история-болезни.doc";  // non-english filename

//if the above line doesn't make it work, try this.
att.Name = System.Web.HttpUtility.UrlEncode(att.Name, System.Text.Encoding.UTF8);

0

不,调试器中的值是正确的。MIME内容文件名必须始终为ASCII,因此其他字符集必须进行编码以进行传输(请参见RFC 2047)。

那是您的中文字符的Base64编码的UTF-8表示形式 - 这就是=?utf8?B?前缀的含义。收件人的电子邮件客户端应将其解码回正确的字符。

编辑:糟糕,我错过了您说接收到的文件名是错误的。我建议您尝试向不同的电子邮件客户端发送电子邮件,以查看问题是否出在接收方,并与具有正确文件名的电子邮件的消息头进行比较,如果您可以从不同的客户端生成一个,则不确定该建议超出了什么。


Rup,感谢您的回复!您的方法也不起作用。我发现如果文件名长度较短,例如 ct.Name =“这是一个很长.pdf”,它会起作用。 - mothee
你知道为什么更长的文件名会用两个“=?utf8?B?”前缀进行翻译吗:“=?utf-8?B?6L+Z5piv5LiA5Liq5b6I6ZW/55qE5Lit5paH5paH5Lu25ZCN5biM5pyb?=\r\n =?utf-8?B?6IO955So5a6D5Zyo6ZmE5Lu25ZCN5Lit?=” - mothee
很抱歉,我不确定。我猜可能是中文字符的问题(但我不会说中文,所以不确定),或者可能是编码长度的问题:过去我见过电子邮件客户端对长主题行做出奇怪的处理,所以我猜它们也会对文件名做出类似的处理。我不知道 MIME 部分是否有行长度限制。我认为你需要确定这是否是合法的 MIME 编码,然后找出 .NET 或电子邮件客户端的问题,并解决这个问题。很抱歉我没有任何具体的想法。 - Rup
谢谢你的帮助,Rup。看起来这不是 MIME 的长度限制问题,因为我使用了一个非常长的英文文件名,它也可以工作。所以我猜测这可能是编码或字符集的问题,但我现在还不知道原因。 - mothee

0

最终,我找到了一个解决方法,根据RFC 2047规定,'ecoded-word'之间的分隔符可以是CRLF或SPACE,而C#使用CRLF作为分隔符,但NOTES/Gmail客户端无法解释它,在我将CRLF替换为SPACE后,在NOTE/Gmail中运行良好。

感谢Rup,你提供的RCF2047参考对我很有帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接