smtp.office365.com вопросы кодирования темы
Я пытаюсь отправлять электронные письма со своей выделенной учетной записью office365, но у меня возникают проблемы с кодированием темы - все мои специальные символы заменяются на "?".
Код, который я использую, довольно прост и отлично работает с другой тестовой учетной записью на smtp-mail.outlook.com.
using (var mailMsg = new MailMessage(sender, recipient))
{
mailMsg.IsBodyHtml = true;
mailMsg.Subject = "Hello world żółćąź";
mailMsg.Body = body;
using (var smtpClient = new SmtpClient())
{
smtpClient.Credentials = new NetworkCredential("email", "password");
smtpClient.EnableSsl = true;
smtpClient.Host = "smtp.office365.com";
smtpClient.Port = 587;
await smtpClient.SendMailAsync(mailMsg);
}
}
Я попытался установить все возможные предметные коды без удачи. Также преобразование строки объекта в Base64String также не работает. Также пытался установить кодировку заголовка Content-Type... Все найденные разрешения не помогли мне. Может быть, это какая-то конкретная проблема SmtpClient, реализованная только с office365?
А также установка кодировки тела не помогла
mailMsg.BodyEncoding = Encoding.UTF8;
3 ответа
У меня была такая же проблема со счетом моей компании. Вот мои выводы на данный момент:
Похоже, что почтовые серверы Office365 включили SMTPUTF8
расширение несколько месяцев назад, которое меняет поведение System.Net.Mail.SmtpClient
Класс для отправки различных команд SMTP и другой полезной нагрузки DATA.
В моем случае сообщение всегда доставлялось бы нормально при отправке на другую учетную запись Office365, но для других учетных записей мы получали уведомления об отказах по электронной почте от удаленного SMTP-сервера, который принял ретранслированное сообщение электронной почты от Office365. Ошибка была что-то вроде "Получены неверные данные, ожидаемые 7-битные безопасные символы". Таким образом, я мог представить, что удаленный SMTP-сервер из OP мог бы молча заменить все символы за пределами 7-битного диапазона с низким знаком на вопросительный знак.
Отправка через GMail (который также имеет SMTPUTF8
расширение активно) проблем не было.
До сих пор я не отлаживал SmtpClient
Ссылочные источники еще предстоит увидеть, что отправляется на сервер Office365. Таким образом, коренной причиной может быть SmtpClient
отправляет хорошее сообщение о том, какой Office365 "портит" перед ретрансляцией, а какой GMail отправляет без проблем; или же SmtpClient
создает неверный сеанс сообщений / SMTP, который Office365 молча принимает и пересылает на удаленные SMTP-серверы, но который GMail принимает и исправляет на лету перед передачей.
В любом случае, я использовал библиотеки MailKit и MimeKit, используя NuGet, и вместо этого использую их для отправки своих электронных писем. Они предлагают протоколирование протокола SMTP для устранения неполадок и, по-видимому, решают указанную проблему путем правильной отправки SMTPUTF8
а также 8BITMIME
Флаги, как определено в RFC 6531. Требуется дополнительная работа для чтения конфигурации из обычного расположения Web.config или App.config, но библиотеки делают эту работу.
Если вы хотите продолжать использовать SmtpClient
тогда вам следует либо связаться с Microsoft (это их служба и среда выполнения.NET), либо запустить собственный частный SMTP-сервер без SMTPUTF8
расширение, которое передает на удаленные серверы. В последнем случае SmtpClient
должен правильно кодировать все заголовки и полезную нагрузку (хотя это означает, что вы не сможете использовать International
значение для DeliveryFormat
свойство, когда вы хотите отправить людям с интернационализированным адресом электронной почты).
Установите кодировку почтового сообщения так, чтобы она поддерживала символы, которые вы используете, так как по умолчанию us-ascii
:
mailMsg.BodyEncoding = Encoding.UTF8;