我尝试使用System.Net.Mail.MailMessage
发送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
内的代码
如果我将该附件发送到gmail或ms exchange,则附件名称已成功解码。的 BUT!
如果我将附件发送到 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)的网络界面阅读邮件,则附件名称已成功解码。
答案 0 :(得分:4)
在.NET 4.0中,SmtpClient现在实现RFC行长度限制(76个字符)。这需要对编码过程进行大量更改,而不是涉及您描述的一些问题。
在您的情况下,非ascii附件名称存在问题,将被编码为超过41个utf-8字节(Encoding.UTF8.GetByteCount(fileName);)。在这种情况下,名称被编码两次,并且可能在其中有额外的换行符。唯一已知的解决方法是限制非ascii文件名的长度。
您可以阅读此post 了解有关您的问题的更多信息
答案 1 :(得分:0)
尝试将编码从Base64更改为UTF8。
答案 2 :(得分:0)
看起来像是外部的icloud错误。您可以就此问题提供反馈here。
答案 3 :(得分:0)
看看这个discussion。您可能需要翻译它或只是查看代码。 This也有一些有用的信息,并引用第一个链接作为解决方法。