SmtpClient отправки сообщения


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

Я сократил код, чтобы не включать вложения и из адресов.

Если я отключаю строку с альтернативным представлением, то электронная почта отображается правильно, но я также хочу отправить текстовую версию.

using (SmtpClient client = GetSmtpClient(settings)) {
    using (MailMessage message = new MailMessage()) {
        message.IsBodyHtml = true;
        message.BodyEncoding = System.Text.Encoding.GetEncoding("iso-8859-1");
        message.To.Add(toList);
        message.Subject = subject;
        message.Body = htmlTemplate;
        message.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(textTemplate, new ContentType("text/plain")));
        client.Send(message);
     }
}

Edit : сообщение изначально посылало текст в качестве основного текста и html в качестве альтернативного представления. но я столкнулся с проблемой с акцентированными и внешними символами, как описано здесь , и хотел установить IsBodyHtml в true, что заставляет меня установить html в главное представление.

2 2

2 ответа:

У меня тоже были проблемы с этим, но вот очень сокращенная версия кода, которая работала для меня...

   private MailMessage CreateEmailMessage(string emailAddress) {

        MailMessage msg = new MailMessage();

        msg.From = new MailAddress(FromEmailAddress, FromName);
        msg.To.Add(new MailAddress(emailAddress));
        msg.Subject = "Msg Subject here";

        string textBody = File.ReadAllText(TextTemplateFile);


        string htmlBody = "";
        if (EmailFormat == "html") {
            htmlBody = File.ReadAllText(HtmlTemplateFile);

            foreach (Attachment inline in InlineAttachments) {
                inline.ContentDisposition.Inline = true;
                msg.Attachments.Add(inline);
            }

            AlternateView alternateHtml = AlternateView.CreateAlternateViewFromString(htmlBody,
                                                                                      new ContentType("text/html"));
            msg.AlternateViews.Add(alternateHtml);

            AlternateView alternateText = AlternateView.CreateAlternateViewFromString(textBody,
                                                                                      new ContentType("text/plain"));
            msg.AlternateViews.Add(alternateText);

        }
        else {
            msg.Body = textBody;
        }

        return msg;
    }

В конце концов я понял, что строка 'htmlTemplate', передаваемая в метод, определяет charset=ISO-8859-1 в заголовке письма и, следовательно, переопределяет любые изменения, которые я вносил в код.

Я изменил кодировку на UTF-8 и восстановил свой код следующим образом:

using (SmtpClient client = GetSmtpClient(settings)) {
  using (MailMessage message = new MailMessage()) {
    message.To.Add(toList);
    message.Subject = subject;
    message.Body = textTemplate;          
    message.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(htmlTemplate, new ContentType("text/html")));
    client.Send(message);
  }
}

И теперь может отправлять как текстовые, так и html-шаблоны, а также решать проблему акцентированных символов.