Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含扩展字符的MIME附件名称失败_C#_.net_Email_Mime_Attachment - Fatal编程技术网

C# 包含扩展字符的MIME附件名称失败

C# 包含扩展字符的MIME附件名称失败,c#,.net,email,mime,attachment,C#,.net,Email,Mime,Attachment,在一个用国际文件名发送电子邮件的项目中,我遇到了一个不寻常的问题。如果仅附加US-ASCII文件名,则可以获得超过200个字符的长度而不会出现错误 如果我包含一个扩展字符,它将以UTF-8编码,在它变为funky之前的长度非常小(

在一个用国际文件名发送电子邮件的项目中,我遇到了一个不寻常的问题。如果仅附加US-ASCII文件名,则可以获得超过200个字符的长度而不会出现错误

如果我包含一个扩展字符,它将以UTF-8编码,在它变为funky之前的长度非常小(<40个字符)。给时髦下定义。。下面是一个文件名损坏后的示例:

=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:,以及上面的一个修改版本。