Как наложить текст на картинку при отправке письма из 1С, чтобы оно корректно отображалось в почтовых клиентах?

Программист 1С v8.3 (Управляемые формы)
← К списку

При работе с автоматизированной рассылкой писем из системы 1С, особенно когда требуется персонализировать визуальный контент, мы часто сталкиваемся с задачей наложения текста на изображение. Например, поздравительная открытка с именем сотрудника или уведомление с динамически генерируемым текстом. На первый взгляд кажется, что это легко сделать с помощью стандартных HTML-тегов и CSS-свойств, таких как position: absolute.

Однако, как показывает практика, почтовые клиенты интерпретируют HTML и CSS совершенно иначе, чем веб-браузеры, что приводит к некорректному отображению:

  1. Изображение и текст могут отображаться последовательно, один под другим, вместо желаемого наложения.
  2. Стили могут игнорироваться или отображаться некорректно.

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

Надежное решение: Программное наложение текста на изображение с помощью ImageMagick

Когда речь идет об автоматизации и необходимости динамически генерировать изображения с наложенным текстом (например, для тысяч сотрудников с персонализированными данными), наиболее эффективным и надежным методом является программное создание изображения, в котором текст уже является частью графики. Для этой цели отлично подходит утилита ImageMagick.

Что такое ImageMagick?

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

Как мы будем использовать ImageMagick?

Мы рассмотрим шаги по использованию утилиты convert.exe из пакета ImageMagick для наложения текста на исходное изображение. Затем мы посмотрим, как интегрировать этот процесс в 1С и отправить полученное изображение по почте.

  1. Подготовка ImageMagick:

    Для начала нам понадобится установить ImageMagick на сервер или компьютер, с которого будет осуществляться рассылка. После установки утилита convert.exe будет доступна для вызова из командной строки.

  2. Команда для наложения текста:

    Основная команда для наложения текста — это convert с различными параметрами. Обратим внимание на ключевые опции:

    • -pointsize: Размер шрифта.
    • -fill: Цвет текста (например, black, red или шестнадцатеричный код #RRGGBB).
    • -gravity: Позиционирование текста относительно изображения (например, NorthWest, Center, SouthEast).
    • -annotate: Сама команда для наложения текста, принимает угол поворота, смещение по X, смещение по Y и сам текст.
    • -background: Цвет фона для текста (если хотим, чтобы текст был на подложке).
    • -font: Путь к файлу шрифта или его название.

    Посмотрим на пример команды, которая накладывает текст "С Новым Годом, Иван Иванович!" по центру изображения:

    
    convert "C:\Путь\К\Исходной\Картинке.jpg" ^
            -pointsize 30 ^
            -fill "red" ^
            -gravity Center ^
            -annotate +0+0 "С Новым Годом, Иван Иванович!" ^
            "C:\Путь\К\Результату\ПерсонализированнаяОткрытка.jpg"
    

    Здесь:

    • "C:\Путь\К\Исходной\Картинке.jpg" – путь к исходному изображению.
    • "С Новым Годом, Иван Иванович!" – персонализированный текст.
    • "C:\Путь\К\Результату\ПерсонализированнаяОткрытка.jpg" – путь, куда будет сохранено новое изображение с наложенным текстом.

    Для многострочного текста можно использовать символ новой строки \n:

    
    convert "C:\Путь\К\Исходной\Картинке.jpg" ^
            -pointsize 25 ^
            -fill "blue" ^
            -gravity North ^
            -annotate +0+10 "Дорогой Иван Иванович!\nПоздравляем Вас с Днем Рождения!" ^
            "C:\Путь\К\Результату\ПерсонализированнаяОткрытка.jpg"
    
  3. Выполнение команды из 1С:

    В 1С мы можем выполнить внешнюю команду с помощью объекта ЗапуститьПриложение или КомандаСистемы. Проанализируем пример кода для вызова ImageMagick:

    
    &НаКлиенте
    Процедура ОтправитьПерсонализированноеПисьмо()
    
        ИмяСотрудника = "Иван Иванович"; // Пример динамических данных
        ТекстПоздравления = "Дорогой " + ИмяСотрудника + "!\nПоздравляем Вас с праздником!";
    
        ПутьКImageMagick = "C:\Program Files\ImageMagick-7.1.1-Q16-HDRI\convert.exe"; // Укажите свой путь
        ПутьКИсходнойКартинке = КаталогВременныхФайлов() + "ИсходнаяОткрытка.jpg";
        ПутьКРезультату = КаталогВременныхФайлов() + "ПерсонализированнаяОткрытка.jpg";
    
        // Предполагаем, что исходная картинка уже есть или загружена
        // Например, из макета или из файла
        // ДвоичныеДанныеКартинки.Записать(ПутьКИсходнойКартинке);
    
        // Формируем строку команды
        СтрокаКоманды = """" + ПутьКImageMagick + """ " +
                        """" + ПутьКИсходнойКартинке + """ " +
                        "-pointsize 30 " +
                        "-fill ""#000080"" " + // Темно-синий цвет
                        "-gravity South " +
                        "-annotate +0+20 """ + ТекстПоздравления + """ " + // Смещение от низа
                        """" + ПутьКРезультату + """";
    
        // Запускаем команду
        РезультатЗапуска = ЗапуститьПриложение(СтрокаКоманды, , Истина); // Истина - ждать завершения
    
        Если РезультатЗапуска = 0 Тогда // Команда выполнена успешно
            Сообщить("Изображение успешно сгенерировано: " + ПутьКРезультату);
    
            // Теперь отправляем письмо с этим изображением
            ОтправитьПисьмоСФайлом(ПутьКРезультату);
    
        Иначе
            Сообщить("Ошибка при генерации изображения. Код ошибки: " + РезультатЗапуска);
        КонецЕсли;
    
    КонецПроцедуры
    
    &НаСервере
    Процедура ОтправитьПисьмоСФайлом(ПутьКФайлу)
    
        Пользователь = "sender@example.com";
        Пароль = "password";
        СерверSMTP = "smtp.example.com";
        ПортSMTP = 587; // Или 465 для SSL
    
        // Создаем объекты для работы с почтой
        Профиль = Новый ИнтернетПочтовыйПрофиль;
        Профиль.АдресСервераSMTP = СерверSMTP;
        Профиль.Пользователь = Пользователь;
        Профиль.Пароль = Пароль;
        Профиль.ПортSMTP = ПортSMTP;
        Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
        Профиль.ИспользоватьSSLSMTP = Истина;
    
        Почта = Новый ИнтернетПочта;
        Почта.Подключиться(Профиль);
    
        Сообщение = Новый ИнтернетПочтовоеСообщение;
        Сообщение.Получатели.Добавить("recipient@example.com");
        Сообщение.Тема = "Ваше персонализированное поздравление!";
        Сообщение.Отправитель = Пользователь;
    
        // Вставляем изображение как встроенное вложение (cid)
        Вложение = Сообщение.Вложения.Добавить(ПутьКФайлу);
        Вложение.Идентификатор = "personalized_image"; // Уникальный идентификатор
        Вложение.ТипСодержимого = "image/jpeg"; // Или "image/png" в зависимости от формата
    
        // Формируем HTML-тело письма
        HTMLТело = "
        
        
            
        
        
            

    Здравствуйте!

    Мы приготовили для Вас специальную открытку:

    С наилучшими пожеланиями,

    Ваша компания

    "; Сообщение.УстановитьТелоИзСтроки(HTMLТело, ТипТекстаПочтовогоСообщения.HTML); Почта.Отправить(Сообщение); Почта.Отключиться(); Сообщить("Письмо успешно отправлено!"); КонецПроцедуры

    В этом примере мы:

    • Динамически формируем текст поздравления.
    • Составляем команду для convert.exe, включая пути к файлам и параметры оформления текста.
    • Используем метод ЗапуститьПриложение() для выполнения команды.
    • После успешной генерации изображения, формируем почтовое сообщение с помощью объектов ИнтернетПочтовыйПрофиль, ИнтернетПочта и ИнтернетПочтовоеСообщение.
    • Очень важный момент: добавляем сгенерированное изображение как вложение с уникальным идентификатором (CID) с помощью свойства ИнтернетПочтовоеВложение.Идентификатор. Это позволяет ссылаться на изображение прямо в HTML-теле письма через src="cid:ваш_идентификатор", и оно будет отображаться внутри письма, а не как отдельное вложение.

Альтернативные подходы: Попытки наложения средствами HTML/CSS (с оговорками)

Мы проанализируем ситуацию, почему прямые HTML/CSS-решения, работающие в браузере, не подходят для почтовых клиентов. Причина кроется в том, что почтовые клиенты (особенно старые версии Outlook, Lotus Notes) используют устаревшие движки рендеринга, которые плохо поддерживают современные CSS-свойства. Они часто игнорируют position: absolute, z-index, сложные фоновые изображения и многие другие свойства.

Существуют попытки имитировать наложение с помощью HTML/CSS, но они крайне сложны в реализации, ненадежны и требуют множества хаков:

Мы рекомендуем избегать этих методов для динамического наложения текста, так как они не обеспечивают стабильного и предсказуемого результата во всех почтовых клиентах. Важно помнить, что цель – корректное отображение у получателя, а не только в нашем браузере.

Перспективные подходы: Динамический контент и ИИ (для общего контекста)

Хотя эти подходы не всегда напрямую интегрируются с типовым функционалом 1С для отправки писем, мы рассмотрим их для полноты картины, поскольку они предлагают мощные возможности для персонализации:

  1. Динамический контент в платформах email-маркетинга:

    Многие современные платформы для email-маркетинга (типа Mailchimp, SendGrid) предлагают встроенные функции "динамического контента". Это позволяет автоматически изменять блоки текста и изображений в письме в зависимости от данных получателя (например, имени, должности). Такие платформы используют переменные (например, {{firstname}}) для подстановки персональных данных, что позволяет эффективно персонализировать письма без сложного кодирования.

  2. Использование ИИ для генерации изображений:

    В настоящее время существуют инструменты на базе искусственного интеллекта (например, DALL-E, Stable Diffusion, Midjourney), которые могут генерировать изображения по текстовым запросам. Вместо наложения текста на существующее изображение, можно сгенерировать полностью новое персонализированное изображение, в котором текст уже будет частью графики. Некоторые из этих инструментов предлагают API для автоматической интеграции в рабочие процессы, что открывает интересные возможности для будущих решений.

Заключение и тестирование

Как мы выяснили, самым надежным и рекомендованным способом наложения динамического текста на изображение при отправке писем из 1С является программная генерация изображения с помощью внешних утилит, таких как ImageMagick. Это обеспечивает предсказуемый результат независимо от особенностей почтового клиента получателя.

Внимание: Независимо от выбранного подхода, крайне важно тщательно тестировать отправляемые письма в различных почтовых клиентах (Gmail, Outlook, Apple Mail, мобильные клиенты и т.д.), чтобы убедиться в корректном отображении. Используйте сервисы для предпросмотра писем, чтобы гарантировать идеальное отображение у всех получателей.

← К списку