Как правильно вставить изображения в HTML-письмо при отправке из 1С

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

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

Анализ проблемы: почему внешние ссылки и локальные пути могут не работать

Рассмотрим типичную ситуацию: вы сформировали HTML-текст, в котором указали прямые ссылки на картинки, размещенные на внешнем сервере. В браузере письмо отображается корректно, но при попытке отправки из 1С возникает ошибка доступа или картинки просто пропадают. Выясним причину этого явления. Проблема часто кроется в контексте выполнения кода. Если отправка происходит на стороне сервера (в фоновом задании или серверном модуле), учетная запись, под которой запущен сервер 1С, может не иметь прав на выход в интернет. Кроме того, почтовые серверы получателей (например, Gmail или Outlook) могут блокировать внешние изображения по соображениям безопасности или из-за отсутствия настроенного прокси-сервера в файле inetcfg.xml на вашем сервере.

Другой подход — использование локальных путей к файлам на диске. Это кажется логичным, но напрямую вставить путь вида C:\Temp\image.jpg в HTML-тег img нельзя, так как почтовый клиент получателя не имеет доступа к вашему локальному диску. Здесь на помощь приходит механизм вложений и уникальных идентификаторов.

Метод 1: Использование вложений и идентификаторов CID (Content-ID)

Проанализируем наиболее надежный и профессиональный способ — внедрение картинок непосредственно в тело письма через идентификатор CID. Этот метод позволяет почтовому клиенту однозначно сопоставить тег в HTML-коде с файлом, который прикреплен к письму как вложение.

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


Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Текст = "<html><body>
               |<p>Вот наше изображение:</p>
               |<img src=""cid:MyUniqueImageID"" />
               |</body></html>";
Письмо.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;

// Получаем двоичные данные картинки (из базы или с диска)
КартинкаДвоичныеДанные = ПолучитьКартинкуИзБазы(); 

НовоеВложение = Письмо.Вложения.Добавить(КартинкаДвоичныеДанные, "image.png");
НовоеВложение.Идентификатор = "MyUniqueImageID";

Важный нюанс: для обеспечения максимальной совместимости с MS Outlook и предотвращения попадания в спам, старайтесь делать Идентификатор действительно уникальным. Хорошей практикой считается использование формата, напоминающего email, например: image1@mycompany.ru. Также обратите внимание, что свойство Идентификатор должно совпадать с тем, что указано после cid: в HTML-тексте.

Автоматическая обработка текстов методом ОбработатьТексты()

Платформа 1С предоставляет встроенный механизм для упрощения этой задачи. Если в вашем HTML-тексте уже прописаны абсолютные пути к локальным файлам (например, <img src="C:\Temp\pic.jpg">), вы можете воспользоваться методом ОбработатьТексты() объекта ИнтернетПочтовоеСообщение. Выясним, что именно делает этот метод:

  1. Сканирует HTML-текст письма на наличие ссылок на локальные файлы.
  2. Автоматически создает объекты ИнтернетПочтовоеВложение для каждого найденного файла.
  3. Генерирует уникальные идентификаторы и заменяет локальные пути в тексте на соответствующие ссылки cid:.

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

Метод 2: Особенности работы в мобильном приложении и ошибка дублирования путей

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

Рассмотрим ошибочный вариант кода, который приводил к дублированию путей и некорректной вставке одной и той же картинки:


// ОШИБОЧНЫЙ ВАРИАНТ
ПутьКФайлу = КаталогВременныхФайлов() + ПолучитьИмяВременногоФайла();

В данном случае функция ПолучитьИмяВременногоФайла() уже возвращает полный путь, включающий временный каталог. Повторное добавление КаталогВременныхФайлов() создает некорректную строку пути, что в мобильной платформе может привести к сбоям. Правильный подход выглядит так:


// ПРАВИЛЬНЫЙ ВАРИАНТ
ПутьКФайлу = ПолучитьИмяВременногоФайла("png");
ДвоичныеДанныеКартинки.Записать(ПутьКФайлу);
// Далее используем этот путь в HTML или для создания вложения

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

Метод 3: Использование Base64 (Data URI)

Иногда возникает искушение вставить данные картинки прямо в HTML-код в виде строки Base64. Это выглядит следующим образом:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />

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

Мы рекомендуем использовать этот метод только для очень маленьких элементов (например, разделителей размером 1x1 пиксель) и только если вы уверены в почтовых клиентах ваших получателей.

Рекомендации по верстке картинок для Outlook

Посмотрим на ситуацию со стороны получателя. Большинство корпоративных пользователей используют MS Outlook, который применяет движок рендеринга Word. Это накладывает строгие ограничения на то, как нужно прописывать теги изображений в 1С:

  1. Всегда указывайте атрибуты width и height непосредственно в теге img, а не только в CSS-стилях.
  2. Обязательно заполняйте атрибут alt. Если картинка будет заблокирована, пользователь увидит текстовое описание, что повышает доверие к письму.
  3. Избегайте использования картинок в качестве фона (свойство background-image), так как Outlook их проигнорирует. Используйте только тег img.

Итоги: какой способ выбрать?

Подведем итог нашему исследованию. Для стабильной работы рассылок из 1С наиболее предпочтительным является Метод 1 (CID). Он обеспечивает баланс между размером письма и корректностью отображения. Если же вам необходимо отправить сотни тысяч писем в сутки, рассмотрите вариант использования внешних хранилищ (S3), где в письмо вставляется только публичная ссылка на надежный домен с SSL-сертификатом. Это позволит разгрузить ваш почтовый сервер и уменьшить размер базы данных 1С, в которой хранятся отправленные сообщения.

При работе с мобильной платформой 1С всегда внимательно проверяйте пути к файлам и избегайте избыточного конкатенирования строк с путями, доверяя встроенным функциям системы, таким как ПолучитьИмяВременногоФайла().

← На главную