Почему HTML-письма из 1С отображаются в Outlook без оформления и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Документооборот
← На главную

При автоматизации рассылок из 1С программисты часто сталкиваются с тем, что красиво сверстанное HTML-письмо в почтовом клиенте получателя (особенно в Microsoft Outlook) выглядит как обычный текст или имеет «развалившуюся» верстку. Давайте разберем по шагам, почему это происходит, как проанализировать проблемное письмо и какие технические приемы помогут нам сохранить дизайн сообщения.

Выясним причину: почему Outlook «портит» HTML

Первым делом проанализируем ситуацию с точки зрения почтового клиента. Основная сложность заключается в том, что Microsoft Outlook (начиная с версий 2007 года) использует для отображения писем движок Microsoft Word, а не стандартный браузерный движок. Это критически важное различие. Word крайне плохо понимает современные стандарты веб-верстки.

Рассмотрим основные ограничения этого движка:

  1. Игнорирование внешних и внутренних CSS-блоков: Теги style, расположенные в заголовке письма head, часто вырезаются или игнорируются.
  2. Отсутствие поддержки Flexbox и Grid: Любая попытка использовать современную блочную верстку приведет к тому, что элементы выстроятся в один столбец.
  3. Проблемы с отступами: Свойства margin и padding ведут себя непредсказуемо для блочных элементов div.
  4. Блокировка внешних ресурсов: Картинки по ссылкам из интернета часто блокируются политиками безопасности.

Шаг 1: Диагностика через формат EML

Чтобы понять, что именно уходит из 1С и что получает Outlook, воспользуемся советом из обсуждения. Нам нужно посмотреть на «сырой» текст письма. Разберем, как это сделать:

  1. Отправьте письмо из 1С на свой адрес.
  2. В Outlook сохраните полученное письмо как файл с расширением .eml.
  3. Откройте этот файл обычным текстовым редактором (например, Notepad++).
  4. Найдите секцию Content-Type: text/html.

Проанализировав содержимое, мы увидим, в каком виде 1С передала HTML-код. Если в коде присутствуют ссылки на локальные стили или классы, которые не были преобразованы в инлайновые (встроенные) атрибуты, значит, Outlook их просто отбросил. Также стоит обратить внимание на кодировку: она должна быть явно указана как UTF-8.

Шаг 2: Использование Inline-CSS (Встроенные стили)

Выяснив, что 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.

Шаг 3: Переход на табличную верстку

Разберем структуру документа. Поскольку мы работаем в условиях ограничений Word-движка, нам придется вернуться к практике 2000-х годов — использованию таблиц table для позиционирования элементов. Таблицы интерпретируются Outlook гораздо стабильнее, чем блоки div.

Рекомендуется использовать следующую вложенность:

  1. Внешняя таблица-контейнер шириной 100%.
  2. Внутренняя таблица фиксированной ширины (например, 600px) для контента.
  3. Ячейки td для создания колонок и отступов.

Шаг 4: Программная настройка отправки в 1С

Теперь проанализируем программную часть на стороне платформы 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";

// Отправка через профиль
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();

Шаг 5: Работа с изображениями через CID

Если в вашем HTML-тексте используются картинки, например логотип компании, обычная ссылка на диск C:\Pictures\logo.png не сработает. Нам нужно встроить картинку в само тело письма как вложение и связать её с текстом через Content-ID (CID).

Выполним это по следующему алгоритму:

  1. Добавляем файл во вложения сообщения.
  2. Присваиваем вложению уникальный Идентификатор.
  3. В HTML-коде указываем этот идентификатор в теге img.

Пример реализации:


// Путь к файлу на сервере
ПутьККартинке = "C:\Temp\logo.png";
ИмяКартинки = "CompanyLogo";

// Добавляем картинку во вложения
Вложение = Письмо.Вложения.Добавить(ПутьККартинке);
Вложение.Идентификатор = ИмяКартинки;

// В HTML ссылаемся на идентификатор
ТекстHTML = "<img src='cid:" + ИмяКартинки + "'>";

Дополнительные рекомендации по оформлению

Чтобы письмо выглядело профессионально и не «разваливалось», придерживайтесь следующих правил:

Таким образом, мы выяснили, что основной проблемой является специфика рендеринга Outlook. Переведя верстку на таблицы, внедрив стили непосредственно в теги и правильно настроив объект ИнтернетПочтовоеСообщение в 1С, вы добьетесь идентичного отображения писем у всех адресатов.

← На главную