包含扩展字符的 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 附件名称失败的主要内容,如果未能解决你的问题,请参考以下文章