如何在C#SmtpClient编程中用汉字设置附件文件名?

如何在C#SmtpClient编程中用汉字设置附件文件名?,c#,cjk,smtpclient,C#,Cjk,Smtpclient,我的代码如下: ContentType ct = new ContentType(); ct.MediaType = MediaTypeNames.Application.Octet; ct.Name = "这是一个很长的中文文件名希望能用它在附件名中.Doc"; Attachment attach = new Attachment(stream, ct); 但收到的附件的中文文件名不正确,我在VS2010调试程序中发现ct.Name为“=?utf-8?B?6L+Z5PIV5LIQ5B6I6Z

我的代码如下:

ContentType ct = new ContentType();
ct.MediaType = MediaTypeNames.Application.Octet;
ct.Name = "这是一个很长的中文文件名希望能用它在附件名中.Doc";
Attachment attach = new Attachment(stream, ct);
但收到的附件的中文文件名不正确,我在VS2010调试程序中发现ct.Name为“=?utf-8?B?6L+Z5PIV5LIQ5B6I6ZW/55QE5LIT5PAH5PAH55PAH5LU25ZCN5BIM5Pb?=\r\n=?utf-8?B?6IO955SO5A6D5ZYO6ZME525LUZCN5LIT?=”


请注意,如何在附件文件名中使用中文字符?

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

这是一个用base-64编码的UTF-8表示的汉字,这就是
=?utf8?B?
前缀的意思。收件人的电子邮件客户端应将其解码回正确的字符

编辑:哎呀,我没听到你说收到的文件名是错误的。我建议您尝试向不同的电子邮件客户端发送电子邮件,看看问题是否出在收件人身上,如果您可以从不同的客户端生成电子邮件,则可以将邮件标题与文件名正确的电子邮件进行比较,但我不确定除此之外还有什么建议。

您可以尝试:

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);

最后,我找到了一个解决办法,根据RFC 2047,分隔符可以是CRLF或“ecoded word”之间的空格,C#使用CRLF作为分隔符,但NOTES/Gmail客户端无法解释它,在我用空格替换CRLF后,它在NOTES/Gmail中工作良好


感谢Rup,您的RCF2047参考帮助我

哇!第一次看到中国人提出这样的问题!事实上,我对调试器名称中的换行表示怀疑。这是因为中国的某些东西吗?你能不能不用它,或者用一些简单的东西——比如说前几个字符?已知问题:Rup,谢谢你的回答!你的方法也不行。我发现文件名的长度是否较短,例如ct.name=”这是一个很长.你知道为什么较长的文件名会被翻译成两个“=?utf8?B?”前缀:“=?utf-8?B?6L+Z5PIV5LIQ5B6I6ZW/55QE5LIT5PAH5PAH5BAH5LU25ZCN5BIM5PYB”=\r\n=?utf-8?B?6IO955So5a6D5Zyo6ZmE5Lu25ZCN5Lit?=”我不确定,抱歉。我猜可能是中文(但我不会说中文,所以我不知道)或者可能是编码的长度:我以前见过电子邮件客户对长主题行做一些奇怪的事情,所以我猜他们也会对文件名做一些处理。我不知道MIME部分是否有行长度限制。我想你必须弄清楚这是否是合法的MIME编码,然后弄清楚是.NET还是电子邮件客户端出了错,以及如何解决这个问题。对不起,我没有任何具体的想法。谢谢你,Rup。它似乎没有MIME的长度限制,我使用了一个很长的英文文件名,它也可以工作。所以我想这可能是编码或字符集的问题,但我现在不知道原因。