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 ответа:
У меня тоже были проблемы с этим, но вот очень сокращенная версия кода, которая работала для меня...
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-шаблоны, а также решать проблему акцентированных символов.