При автоматизации рассылок из 1С программисты часто сталкиваются с тем, что красиво сверстанное HTML-письмо в почтовом клиенте получателя (особенно в Microsoft Outlook) выглядит как обычный текст или имеет «развалившуюся» верстку. Давайте разберем по шагам, почему это происходит, как проанализировать проблемное письмо и какие технические приемы помогут нам сохранить дизайн сообщения.
Первым делом проанализируем ситуацию с точки зрения почтового клиента. Основная сложность заключается в том, что Microsoft Outlook (начиная с версий 2007 года) использует для отображения писем движок Microsoft Word, а не стандартный браузерный движок. Это критически важное различие. Word крайне плохо понимает современные стандарты веб-верстки.
Рассмотрим основные ограничения этого движка:
style, расположенные в заголовке письма head, часто вырезаются или игнорируются.margin и padding ведут себя непредсказуемо для блочных элементов div.Чтобы понять, что именно уходит из 1С и что получает Outlook, воспользуемся советом из обсуждения. Нам нужно посмотреть на «сырой» текст письма. Разберем, как это сделать:
Content-Type: text/html.Проанализировав содержимое, мы увидим, в каком виде 1С передала HTML-код. Если в коде присутствуют ссылки на локальные стили или классы, которые не были преобразованы в инлайновые (встроенные) атрибуты, значит, Outlook их просто отбросил. Также стоит обратить внимание на кодировку: она должна быть явно указана как UTF-8.
Выяснив, что Outlook игнорирует блок стилей в «шапке», мы приходим к единственному надежному решению — CSS Inlining. Это процесс переноса всех правил оформления непосредственно в атрибут style каждого HTML-тега.
Посмотрим на пример. Вместо такой конструкции:
<style>
.red-text { color: red; font-size: 14px; }
</style>
<p class="red-text">Текст сообщения</p>
Нам необходимо программно сформировать (или подготовить в шаблоне) следующий код:
<p style="color: red; font-size: 14px; margin: 0; padding: 0;">Текст сообщения</p>
Только в таком виде оформление гарантированно будет прочитано движком Word в Outlook.
Разберем структуру документа. Поскольку мы работаем в условиях ограничений Word-движка, нам придется вернуться к практике 2000-х годов — использованию таблиц table для позиционирования элементов. Таблицы интерпретируются Outlook гораздо стабильнее, чем блоки div.
Рекомендуется использовать следующую вложенность:
td для создания колонок и отступов.Теперь проанализируем программную часть на стороне платформы 1С. При формировании объекта ИнтернетПочтовоеСообщение крайне важно правильно указать тип текста. Если этого не сделать, почтовый сервер или клиент могут интерпретировать письмо как Plain Text, и получатель увидит голый HTML-код с тегами.
Рассмотрим пример кода для корректной отправки:
// Создаем объект сообщения
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Отчет по продажам";
// Формируем текст в формате HTML
ТекстHTML = "<html><body>" +
"<h1 style='color: #2e6c80;'>Добрый день!</h1>" +
"<p style='font-family: Arial, sans-serif;'>Ниже приведены данные.</p>" +
"</body></html>";
// Добавляем текст и ОБЯЗАТЕЛЬНО указываем тип
ТекстПисьма = Письмо.Тексты.Добавить(ТекстHTML);
ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
// Устанавливаем кодировку
Письмо.Кодировка = "UTF-8";
// Отправка через профиль
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Если в вашем HTML-тексте используются картинки, например логотип компании, обычная ссылка на диск C:\Pictures\logo.png не сработает. Нам нужно встроить картинку в само тело письма как вложение и связать её с текстом через Content-ID (CID).
Выполним это по следующему алгоритму:
Идентификатор.img.Пример реализации:
// Путь к файлу на сервере
ПутьККартинке = "C:\Temp\logo.png";
ИмяКартинки = "CompanyLogo";
// Добавляем картинку во вложения
Вложение = Письмо.Вложения.Добавить(ПутьККартинке);
Вложение.Идентификатор = ИмяКартинки;
// В HTML ссылаемся на идентификатор
ТекстHTML = "<img src='cid:" + ИмяКартинки + "'>";
Чтобы письмо выглядело профессионально и не «разваливалось», придерживайтесь следующих правил:
p и ячеек td с помощью инлайновых стилей margin: 0; padding: 0;, так как Outlook добавляет свои значения по умолчанию.line-height, но учитывайте, что для Outlook полезно добавлять специфический параметр mso-line-height-rule: exactly;.font: 12px Arial; пишите font-size: 12px; font-family: Arial;).Таким образом, мы выяснили, что основной проблемой является специфика рендеринга Outlook. Переведя верстку на таблицы, внедрив стили непосредственно в теги и правильно настроив объект ИнтернетПочтовоеСообщение в 1С, вы добьетесь идентичного отображения писем у всех адресатов.