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.
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
Try changing the encoding from Base64 to UTF8.
Reference: https://discussions.apple.com/thread/7450442
Looks like it's external icloud bug. You can give a feedback about that issue here.
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.