Генерация электронной почты в формате HTML с помощью .NET - PullRequest
2 голосов
/ 25 апреля 2019

Два дня я боролся за создание простого электронного письма в формате HTML с приложением .NET.По этой теме уже есть несколько ответов вопросов , и в каждом случае синтаксис относительно прост.Мне все еще потребовалось больше дня, чтобы заставить его работать.Однако решение вызывает больше вопросов.Я просмотрел документацию Microsoft и там ничего не нашел.

Этот синтаксис работает и генерирует электронное письмо в формате HTML:

MailMessage message = new MailMessage();
message.Subject = "Test";
message.From = new MailAddress("user@athisaddress.com");
message.To.Add("me@myorg.com");
message.Body = "<strong>This is a test</strong>";
message.IsBodyHtml = true;
smtpClient.Send(message);

Однако, если я использую SendМетод объекта SmtpClient, имеющий подпись с четырьмя параметрами, НЕ будет генерировать электронное письмо в формате HTML:

smtpClient.Send("user@athisaddress.com", "me@myorg.com", 
    message.Subject, message.Body);

Может кто-нибудь объяснить, почему это происходит.Это задокументировано или это известная проблема? IsBodyHtml был установлен в true в обоих случаях.

Ответы [ 3 ]

3 голосов
/ 25 апреля 2019

Я думаю, что объяснение этому довольно простое.

В первом случае вы явно устанавливаете для isBodyHtml значение true в вашем MailMessage объекте.Затем вы передаете объект MailMessage методу Send().Поэтому он форматирует электронную почту как HTML, согласно вашим инструкциям.

Во втором случае у вас нет средств сообщить системе, в каком формате должно быть электронное письмо.Обычный текст обычно является форматом по умолчанию, и поэтому при отсутствии каких-либо других инструкций, я ожидаю, что он будет использоваться.

NB. Вы утверждаете, что isBodyHTML был установлен в true в обоих случаях, но это не имеет никакого смысла.Во втором случае вы не передаете объект MailMessage методу ... свойство IsBodyHtml принадлежит MailMessage.Так как еще и где вы могли бы установить такое значение?

В этом втором сценарии единственными значениями, которые получает метод Send(), являются четыре строки (from, to, subject и body).Он не получает никакой другой информации об электронной почте.Свойство isBodyHTML никогда не используется, поскольку оно является частью неиспользуемого MailMessage.

2 голосов
/ 25 апреля 2019

Потому что нет никакого обозначения IsBodyHTML, установленного в true при использовании функции Send, как вы сделали.Я думаю, что IsBodyHTML находится внутри объекта MailMessage.

Я не совсем уверен, что IsBodyHTML устанавливает в теле, но это может создать полностью сформированный HTML (<<code>html><head><body>etc....), так что, возможно, попробуйте.

1 голос
/ 25 апреля 2019

Перегрузка, которая не работает для вас внутренне, выглядит примерно так

MailMessage mailMessage = new MailMessage(from, recipients, subject, body);
Send(mailMessage);

Создает экземпляр MailMessage, не устанавливает IsBodyHtml и вызывает другую перегрузку. IsBodyHtml контролирует MediaType, используемый для MimePart тела в вашей почте, и если IsBodyHtml не установлен, PlainText будет использоваться вместо Himeml MimePart. Установка IsBodyHtml никоим образом не изменяет содержимое свойства Body, поэтому вы должны использовать перегрузку с MailMessage, чтобы вы могли явно установить IsBodyHtml.

...