具有长非ascii名称的电子邮件附件
我尝试使用System.Net.Mail.Attachment
发送System.Net.Mail.Attachment
。
附件名称是“Счёт-договор№4321от4июля.pdf”
附件创建代码:
var nameEncoding = Encoding.UTF8; return new System.Net.Mail.Attachment(new MemoryStream(bytes), MessageBodiesHelpers.EncodeAttachmentName(fileName, nameEncoding), attachment.MediaType) { TransferEncoding = TransferEncoding.Base64, NameEncoding = nameEncoding };
MessageBodiesHelpers.EncodeAttachmentName
中的代码取自https://social.msdn.microsoft.com/Forums/en-US/b6c764f7-4697-4394-b45f-128a24306d55/40-smtpclientsend-attachments-mit-umlauten-im-dateinamen?forum = dotnetframeworkde
如果我将该附件发送到gmail或ms exchange,则附件名称已成功解码。 但!
如果我将该附件发送到icloud,那么我会得到“???? – ???????№4321от4????。pdf”
邮件附件标题:
来自ms exchange:
Content-Type: application/pdf; name="=?utf-8?B?0KHRh9GR0YIt0LTQ?==?utf-8?B?vtCz0L7QstC+0YAg?==?utf-8?B?4oSWNDMyMSDQvtGC?==?utf-8?B?IDQg0LjRjtC70Y8u?==?utf-8?B?cGRm?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment
来自icloud:
Content-Transfer-Encoding: BASE64 Content-Type: APPLICATION/PDF; name="????-??????? =?utf-8?B?4oSWNDMyMSDQvtGC?= 4 ????.pdf"
如何格式化icloud的名称?
UPD
如果我将消息从outlook(ms exchange)转发到icloud,则附件名称已成功解码。 头:
Content-Transfer-Encoding: BASE64 Content-Disposition: ATTACHMENT; size=200702; modification-date="Mon, 04 Jul 2016 13:40:22 GMT"; filename*=utf-8''%D0%A1%D1%87%D1%91%D1%82%2D%D0%B4%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%20%E2%84%964321%20%D0%BE%D1%82%204%20%D0%B8%D1%8E%D0%BB%D1%8F.pdf; creation-date="Mon, 04 Jul 2016 13:40:22 GMT" Content-Type: APPLICATION/PDF; name*=utf-8''%D0%A1%D1%87%D1%91%D1%82%2D%D0%B4%D0%BE%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%20%E2%84%964321%20%D0%BE%D1%82%204%20%D0%B8%D1%8E%D0%BB%D1%8F.pdf
UPD2
如果我使用icloud(icloud.com)的web界面阅读消息,则附件名称已成功解码。
在.NET 4.0中,SmtpClient现在实现RFC行长度限制(76个字符)。 这需要对编码过程进行大量更改,而不是涵盖一些问题,例如您描述的问题。
在您的情况下,非ascii附件名称存在问题,将编码为超过41 utf-8字节(Encoding.UTF8.GetByteCount(fileName);)。 在这种情况下,名称被编码两次,并可能有额外的换行符。 唯一已知的解决方法是限制非ascii文件名的长度。
您可以阅读此post以获取有关您的问题的更多信息
尝试将编码从Base64更改为UTF8。
参考: https : //discussions.apple.com/thread/7450442
看起来像是外部的icloud bug。 您可以在此处提供有关该问题的反馈。
看看这个讨论 。 你可能不得不翻译它或只看代码。 这也有一些有用的信息,并引用第一个链接作为变通方法。
- InvalidProgramException / Common Language Runtime检测到无效程序
- 如何使用word interop一次一个地添加项目到word文档的新行
- System.Net.CertificatePolicy到ServerCertificateValidationCallback接受所有证书策略
- 如何在C#中使用Linq对OrderedDictionary进行排序(使用.NET 3.5)?
- 新的C#异步function是否在编译器中严格实现
- 将更多项添加到非常大的HashSet 时出现OutOfMemoryException
- 在c#中对HTTP请求进行unit testing
- 使用有效的Double向DateTime添加秒可导致ArgumentOutOfRangeException
- C# – 无法在方法中声明委托