Вложение электронной почты с длинным именем, отличным от ascii
Я пытаюсь отправить 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
, взятый из https://social.msdn.microsoft.com/Forums/en-US/b6c764f7-4697-4394-b45f-128a24306d55/40-smtpclientsend-attachments-mit-umlauten-im-dateinamen?forum=dotnetframeworkde
Если я отправил это приложение для обмена gmail или ms, тогда имя приложения успешно декодировано. НО!
Если я отправлю это приложение в icloud, тогда я получаю "???? -??????? №4321 от4????. pdf"
Заголовки почтовых вложений:
От обмена ms:
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?
обн
Если я пересылаю сообщение из 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), имя файла приложения успешно декодируется.
Ответы
Ответ 1
В .NET 4.0 SmtpClient теперь реализует ограничения длины строки RFC (76 символов). Это потребовало значительных изменений в процессе кодирования и не охватывало несколько вопросов, подобных тем, которые вы описываете.
В вашем случае существует проблема с именами вложений, отличными от ascii, которые будут закодированы до более чем 41 utf-8 байтов (Encoding.UTF8.GetByteCount(имя_файла);). В этом случае имена кодируются дважды и могут иметь дополнительные разрывы строк в них. Единственное известное обходное решение - ограничить длину имен файлов, отличных от ascii.
вы можете прочитать этот post для получения дополнительной информации о своей проблеме
Ответ 2
Попробуйте изменить кодировку с Base64 на UTF8.
Ссылка: https://discussions.apple.com/thread/7450442
Ответ 3
Похоже на внешнюю ошибку icloud. Вы можете дать отзыв об этом выпуске здесь.
Ответ 4
Взгляните на обсуждение. Возможно, вам придется перевести его или просто посмотреть на код. В этом также есть полезная информация и ссылки на первую ссылку в качестве обходного пути.