问题
I try to send System.Net.Mail.MailMessage with System.Net.Mail.Attachment.
Name of attachment is "Счёт-договор №4321 от 4 июля.pdf"
Code for attachment creation:
var nameEncoding = Encoding.UTF8;
return new System.Net.Mail.Attachment(new MemoryStream(bytes),
MessageBodiesHelpers.EncodeAttachmentName(fileName, nameEncoding),
attachment.MediaType)
{
TransferEncoding = TransferEncoding.Base64,
NameEncoding = nameEncoding
};
Code inside MessageBodiesHelpers.EncodeAttachmentName taken from https://social.msdn.microsoft.com/Forums/en-US/b6c764f7-4697-4394-b45f-128a24306d55/40-smtpclientsend-attachments-mit-umlauten-im-dateinamen?forum=dotnetframeworkde
If I send that attachment to gmail or ms exchange, then name of attachment decoded successfully. BUT!
If I send that attachment to icloud then I get "????-??????? №4321 от4 ????.pdf"
Mail attachment headers:
From 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
From icloud:
Content-Transfer-Encoding: BASE64
Content-Type: APPLICATION/PDF;
name="????-??????? =?utf-8?B?4oSWNDMyMSDQvtGC?= 4 ????.pdf"
How to format name for icloud?
upd
If I forward message from outlook (ms exchange) to icloud, then name of attachment decoded successfully. Headers:
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
If I read messages using web interface of icloud (icloud.com), then name of attachment decoded successfully.
回答1:
In .NET 4.0 SmtpClient now implements the RFC line length limits (76 chars). This required extensive changes to the encoding process and not covered a few issues like the one you describe.
In your case, there is an issue with non-ascii attachment names that would be encoded to more than 41 utf-8 bytes (Encoding.UTF8.GetByteCount(fileName);). In this scenario the names are encoded twice and may have extra line breaks in them. The only known workaround is to limit the length of non-ascii file names.
you can read this post for more info about your issue
回答2:
Try changing the encoding from Base64 to UTF8.
Reference: https://discussions.apple.com/thread/7450442
回答3:
Looks like it's external icloud bug. You can give a feedback about that issue here.
回答4:
Take a look at this discussion. You may have to translate it though or just look at the code. This also has some useful information and references the first link as a workaround.
来源:https://stackoverflow.com/questions/38187226/email-attachment-with-long-non-ascii-name