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

Posted

技术标签:

【中文标题】包含扩展字符的 MIME 附件名称失败【英文标题】:MIME Attachment Names containing Extended Characters Fails 【发布时间】:2011-12-14 03:23:53 【问题描述】:

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

如果我包含一个扩展字符,它会以 UTF-8 编码,并且在它变得时髦之前的长度非常小(

=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.NameEncoding 的编码设置为 UTF8 和 UTF32,但都不起作用。在附件上设置 ContentDisposition.FileName 失败,因为它不只使用 US-ASCII 字符。

关于如何让它包含完整的文件名和重音/扩展字符的任何建议?

谢谢 查德威克

【问题讨论】:

你试过Unicode编码iso-8859-1吗? John:是的...我也尝试过 unicode...当它包含特殊字符时,它似乎与字符串的长度有关。 Emaling attachments with long names and accents的可能重复 【参考方案1】:

微软有一个修补程序似乎对我有用。 Check http://support.microsoft.com/kb/2402064 在该页面上,有一个下载链接可以为您提供所需的内容。 只需安装正确的版本,具体取决于您的系统。

【讨论】:

【参考方案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);

How to set the attatchment file name with chinese characters in C# SmtpClient programming?

【讨论】:

经过进一步审查,实际问题似乎源于文件名的长度,而不仅仅是因为它包含一些国际字符。如果编码后的文件名包含多于一行,.NET 框架似乎对编码后的文件名进行了编码并最终破坏了整个混乱。我已在此处将其作为错误提交:Microsoft Connect,以及上述的修改版本。

以上是关于包含扩展字符的 MIME 附件名称失败的主要内容,如果未能解决你的问题,请参考以下文章

更改附件标题 MIME python

名词1

带有附件的梨邮件在 $mime = new Mail_mime 处失败

带有多个附件 + html 的 SMTP 邮件 Mime

附件名称和文件扩展名在电子邮件 *.eml 中不起作用

通过邮件 mime php 来自附件的文件名