Я пытаюсь отправить электронные письма, содержащие символы, отличные от ASCII, используя классы SmtpClient
и MailMessage
.
Я использую внешнюю почтовую службу (MailChimp), и некоторые из моих писем были отклонены их SMTP-сервером. Я связался с ними, и вот что они ответили:
Похоже, что строка темы кодируется Base64, а затем кодируется Quoted-Printable, что обычно должно быть хорошо, но один из символов разбит на две строки. Поэтому, когда ваши строки темы немного длиннее, для правильной обработки они разбиваются на две строки. При использовании UTF-8 в кавычках для печати в строке темы строки символов не должны разрываться между строками. Вместо этого строку следует закоротить так, чтобы вся строка символов оставалась вместе. В данном случае этого не происходит, поэтому строка символов, представляющая один символ, разбивается на несколько строк и, следовательно, не является допустимой кодировкой UTF-8 для печати в кавычках.
Проблемным предметом является следующее:
Subject: XXXXXXX - 5 personnes vous ont nommé guide
То есть в UTF-8/Base64:
Subject: WFhYWFhYWCAtIDUgcGVyc29ubmVzIHZvdXMgb250IG5vbW3DqSBndWlkZQ==
Поскольку этот заголовок превысит определенную максимальную длину (я не уверен, является ли это кодировкой Quoted-Printable и ее ограничением в 76 символов на строку или ограничением заголовка SMTP), после кодирования и разделения заголовок станет следующим:
Subject: =?utf-8?B?WFhYWFhYWCAtIDUgcGVyc29ubmVzIHZvdXMgb250IG5vbW3D?=
=?utf-8?B?qSBndWlkZQ==?=
По-видимому, это вызывает проблему при декодировании (поскольку первая строка не может быть декодирована в действительную строку). Я не уверен, что полностью понимаю проблему, и у меня есть следующие вопросы:
- Почему ?utf-8?B? часть повторяется? Разве QP-кодирование не должно происходить перед разделением строки и, следовательно, его заголовок не должен повторяться?
- Разве после QP-декодирования мы не должны получить действительную строку Base64 из одной строки?
- В начале второй строки есть пробел, который находится за пределами кодировки QP, может ли это быть проблемой?
- Сломался энкодер или декодер?
Также обратите внимание, что некоторые другие SMTP-серверы примут это сообщение, хотя это не означает, что оно действительно.
В качестве обходного пути я попытался отключить кодировку Base64, которая, по-видимому, не нужна, однако класс MailMessage имеет BodyTransferEncoding, которое управляет этой кодировкой, но только для основной части сообщения. Никакое свойство, по-видимому, не управляет "переносным" кодированием субъекта.