C# 包含扩展字符的MIME附件名称失败
在一个用国际文件名发送电子邮件的项目中,我遇到了一个不寻常的问题。如果仅附加US-ASCII文件名,则可以获得超过200个字符的长度而不会出现错误 如果我包含一个扩展字符,它将以UTF-8编码,在它变为funky之前的长度非常小(<40个字符)。给时髦下定义。。下面是一个文件名损坏后的示例:C# 包含扩展字符的MIME附件名称失败,c#,.net,email,mime,attachment,C#,.net,Email,Mime,Attachment,在一个用国际文件名发送电子邮件的项目中,我遇到了一个不寻常的问题。如果仅附加US-ASCII文件名,则可以获得超过200个字符的长度而不会出现错误 如果我包含一个扩展字符,它将以UTF-8编码,在它变为funky之前的长度非常小(
=utf-8BSU5GT1JNw4FUSUNBX0ltcGFjdF9Bc3Nl
它看起来像是带有UTF-8解码指令或mime边界的UTF8编码字符串。。。不知道是哪个
以前有人见过吗?文件名的规则/限制是什么?我尝试通过outlook手动发送文件,它会处理,所以我认为这不是MIME特有的限制
示例代码:
class Program
{
private const string DOMAIN = "foobar.com";
private const string SMTPHOST = "mail." + DOMAIN;
private const string FROM = "chadwick.posey@" + DOMAIN;
private const string TO = FROM;
static void Main(string[] args)
{
MailMessage msg = new MailMessage(FROM, TO, "Subject", "Body");
string path = Path.GetTempPath();
string name = "AAAAAA_AAAAAAAAAAAA_AAAAAAA_AAAA - IIIIIII CCCCCCCCCC DD IIIIIIÁIIII_20111018_091327.pptx";
File.WriteAllText(path + "\\" + name, "blah");
Attachment att = new Attachment(path + "\\" + name, new ContentType("application/vnd.openxmlformats-officedocument.presentationml.presentation"));
msg.Attachments.Add(att);
SmtpClient client = new SmtpClient(SMTPHOST, 25);
client.Send(msg);
}
}
我已经尝试过(到目前为止)——将attachment.nameconding的编码设置为UTF8和UTF32,两者都不起作用。在附件上设置ContentDisposition.FileName失败,因为它不仅使用US-ASCII字符
关于如何在tact中包含带有重音/扩展字符的完整文件名,有什么建议吗
谢谢
查德威克这应该可以:
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);
微软的一个热修复程序似乎帮了我的忙。 在那个页面上,有一个下载链接,可以得到你需要的东西。
请根据您的系统安装正确的版本。您尝试过Unicode编码{iso-8859-1}吗?约翰:是的。。。我也试过unicode。。。当字符串包含特殊字符时,这似乎与字符串的长度有关,而不是与其他任何内容有关。可能的重复经过进一步检查,实际问题似乎更多地来自文件名的长度,而不仅仅是它包含几个国际字符。如果编码后的文件名结束时包含多行,则.NET framework似乎会对编码后的文件名进行编码,并最终破坏整个混乱局面。我在这里提交了它作为一个bug:,以及上面的一个修改版本。