Отправка почты как в формате HTML, так и в виде обычного текста в.net

Я отправляю почту из моего приложения на C#, используя SmtpClient. Прекрасно работает, но я должен решить, хочу ли я отправить письмо в виде обычного текста или HTML. Интересно, есть ли способ отправить оба? Я думаю, что это называется multipart.

Я немного погуглил, но в большинстве примеров, по сути, не использовался SmtpClient, а были собраны все элементы SMTP-Body, что немного "страшно", поэтому мне интересно, встроено ли что-то в.net Framework 3.0?

Если нет, есть ли действительно хорошо используемая / надежная сторонняя библиотека для отправки электронных писем?

7 ответов

Решение

Что вы хотите сделать, это использовать свойство AlternateViews в MailMessage

http://msdn.microsoft.com/en-us/library/system.net.mail.mailmessage.alternateviews.aspx

Документация MSDN, кажется, упускает одну вещь, хотя, мне пришлось установить тип контента вручную, но в остальном он работает как шарм:-)

MailMessage msg = new MailMessage(username, nu.email, subject, body);
msg.BodyEncoding = Encoding.UTF8;
msg.SubjectEncoding = Encoding.UTF8;

AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlContent);
htmlView.ContentType = new System.Net.Mime.ContentType("text/html");
msg.AlternateViews.Add(htmlView);

Просто хочу добавить, что вы можете использовать определенные константы MediaTypeNames.Text.Html а также MediaTypeNames.Text.Plain вместо "text/html" а также "text/plain", который всегда является предпочтительным способом. Оно в System.Net.Mime Пространство имен.

Таким образом, в приведенном выше примере это будет:

AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlContent, null, MediaTypeNames.Text.Html);

Я просто собираюсь поставить здесь заметку для всех, у кого возникли проблемы и которые попадают на эту страницу, - иногда SMTP-серверы Outlook преобразуют исходящую электронную почту. Если вы видите, что ваше текстовое тело полностью исчезает, и ничего, кроме вложений в кодировке base64, это может быть связано с тем, что ваш сервер перекодирует электронную почту. SMTP-сервер Google не перекодирует электронную почту - попробуйте отправить туда и посмотреть, что получится.

Помимо использования представлений AlternateViews для добавления представлений html и обычного текста, убедитесь, что вы также не устанавливаете тело объекта Mail Message.

// do not do this: 
var msg = new MailMessage(model.From, model.To);
msg.Body = compiledHtml;  

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

Для людей (таких как я), у которых возникла проблема с отображением в текстовой части открытого текста вместо HTML-части.

Gmail, кажется, всегда отображает последнюю часть в вашем сообщении.

Таким образом, если вы добавили html-часть до того, как ваши шансы на использование открытого текста будут представлены, gmail всегда будет показывать простой текстовый вариант.

Чтобы это исправить, вы можете просто добавить текстовую часть перед вашей HTML-частью.

Для тех, кто столкнулся с этой проблемой, вы можете проверить, есть ли у вас теги прехедера в вашем html.

В моем html я добавил тег с фразой «Активируйте свою учетную запись администратора клиента, щелкнув ссылку».

Похоже, что gmail помечает фразу «щелкнуть ссылку» после ее удаления, все мои отправленные электронные письма попадают прямо в папку «Входящие».

Другие вопросы по тегам