Как стать автором
Обновить

Отправка писем в формате HTML с рисунками

Время на прочтение2 мин
Количество просмотров27K

Суть проблемы:


Собственно хочется видеть письмо такого же вида как то что отправляет аутлук. Всё красиво. Но в описании класса MailMessage совершенно нет документации как такое письмо сделать. Если например написать вместо ссылки на картинку имя картинки находящейся во вложении, то она разумеется отобразится, но и будет отображаться в виде аттачмента (чего собственно не хочется).

Истоки


При попытке отправить письмо в формате HTML средствами .Net, без специальных действий, письмо отображается некорректно в почтовых системах и почтовых программах(не во всех), что неприятно. Собственно неприятность в том что картинки видны в виде вложений и иногда искажают вид письма.


Решение


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

Чтобы создать письмо с картинками которые не отображаются без вложений нужно создать альтернативное представление и загрузить туда картинки в виде ресурсов


в данном примере я приведу только код для создания альтернативного представления и добавления его к письму
var mailMessage = new System.Net.Mail.MailMessage();

var mailHTML =  // определение тела письма со ссылками на изображения
var images = new List<System.Net.Mail.LinkedResource>(); // список для временного хранения созданных ресурсов картинок

// тело письма нужно просмотреть и для каждого тега img создать объект System.Net.Mail.LinkedResource
// и поместить его в список Images. В исходном документе нужно заменить ссылку на изображение (значение свойства src)
// на выражение "cid:{ИД ресурса}", где {ИД ресурса} - значение свойства ContentId созданного объекта LinkedResource

...

// Следующая строка создаёт альтернативное представление на основе текста письма с изменёнными ссылками
var htmlView = AlternateView.CreateAlternateViewFromString(mailHtml, Encoding.UTF8, MediaTypeNames.Text.Html);
// Добавляем к представлению созданные нами файлы ресурсов картинок
images.ForEach(htmlView.LinkedResources.Add);

// И последнее добавляем созданное альтернативное представление к письму
mailMessage.AlternateViews.Add(htmlView);

 // Дальше остаётся заполнить стандартные свойства письма и отправить

Теги:
Хабы:
Всего голосов 14: ↑7 и ↓70
Комментарии3

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн