Как программно вставить картинку в HTML-письмо для отправки через 1С?

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как программно вставить картинку в HTML-письмо для отправки через 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #35530
      Телеграм группа https://t.me/odineskiOdineski
      Участник

        Как вставить в html картинку программно для последующей отправки письма

      • #35531
        bot_avaOdin — Одинэсник
        Участник

          Олег, привет!

          Чтобы программно вставить картинку в HTML-письмо для отправки через 1С, нужно не просто вставить тег с base64 или ссылкой, а сделать так, чтобы картинка была вложением письма и корректно отображалась у получателя. Вот подробный алгоритм и пример кода на 1С:

          1. **Подготовка HTML с тегом с ссылкой на вложение (CID)**
          В HTML-тексте указываешь картинку с атрибутом src=»cid:уникальный_идентификатор_картинки».

          2. **Добавление картинки как вложения с этим идентификатором**
          В объекте письма (ИнтернетПочтовоеСообщение) создаёшь вложение, указываешь двоичные данные картинки, тип содержимого (например, «image/png») и идентификатор (CID).

          3. **Отправка письма**
          Отправляешь письмо через ИнтернетПочта.

          ### Пример кода 1С для вставки картинки в HTML-письмо:

          ТаймаутПодключенияПочты = 30000;
          ПутьККартинке = ПолучитьКаталогВременныхФайлов() + "image.png";
          ФайлКартинки = Новый Файл(ПутьККартинке);
          Если ФайлКартинки.Существует() Тогда
              Поток = ФайлКартинки.ПолучитьПотокЧтения();
              ДвоичныеДанные = Новый ДвоичныеДанные;
              ДвоичныеДанные.Записать(Поток);
              Поток.Закрыть();
          Иначе
              Сообщить("Файл картинки не найден");
              Возврат;
          КонецЕсли;
          
          // ...
          
          Почта = Новый ИнтернетПочта;
          Почта.Подключиться(Профиль, ТаймаутПодключенияПочты);
          Почта.Послать(Письмо);
          Почта.Отключиться();

          ### Важные моменты:

          — **Не используйте вставку картинки в base64 в src**, т.к. многие почтовые клиенты не поддерживают такой формат и картинка не отобразится.
          — Используйте вложения с `cid` и указывайте в HTML `src=»cid:идентификатор»`.
          — Если картинка берется из файла, можно использовать метод `ОбработатьТексты()`, который автоматически добавит вложения и заменит пути на cid (если в HTML указаны пути к файлам).
          — Если используете буфер обмена и ФорматированныйДокумент, то нужно вручную преобразовать base64 в вложения, как в примере из БСП (см. ниже).

          ### Альтернативный способ (для ФорматированногоДокумента с base64):

          Если у вас есть HTML с картинками в формате ``, то нужно:

          — Найти все такие картинки в тексте.
          — Преобразовать base64 в двоичные данные.
          — Добавить их как вложения с уникальным cid.
          — Заменить в HTML `src` на `cid:…`.

          Пример алгоритма из БСП (упрощённо):

          ЗаменяемыеКартинки = Новый Соответствие;
          ПозицияПоиска = 1;
          Пока Истина Цикл
              Позиция_img = СтрНайти(ТекстHTML, "", , Позиция_img);
              КартинкаВХ = "src='data:image/png;base64,";
              Позиция_src = СтрНайти(ТекстHTML, КартинкаВХ, , Позиция_img);
              Если Позиция_src > ПозицияЗакрывающийАтрибут Тогда
                  ПозицияПоиска = ПозицияЗакрывающийАтрибут;
                  Продолжить;
              КонецЕсли;
              ПозицияНачалоКартинки = Позиция_src + СтрДлина(КартинкаВХ);
              ПозицияКонецКартинки = СтрНайти(ТекстHTML, "'", , ПозицияНачалоКартинки);
              Строка_base64 = Сред(ТекстHTML, ПозицияНачалоКартинки, ПозицияКонецКартинки - ПозицияНачалоКартинки);
              ДвоичныеДанныеКартинки = Base64Значение(Строка_base64);
              ЗаменяемыеКартинки.Вставить(КартинкаВХ + Строка_base64 + "'", ДвоичныеДанныеКартинки);
              ПозицияПоиска = ПозицияКонецКартинки;
          КонецЦикла;
          
          Для Каждого Картинка Из ЗаменяемыеКартинки Цикл
              Идентификатор = Новый УникальныйИдентификатор;
              Идентификатор = СтрЗаменить(Идентификатор, "-", "_");
              Вложение = Письмо.Вложения.Добавить(Картинка.Значение, Идентификатор);
              Вложение.Идентификатор = Идентификатор;
              Вложение.ТипСодержимого = "image/png";
              ТекстHTML = СтрЗаменить(ТекстHTML, Картинка.Ключ, "src=""cid:" + Идентификатор + """");
          КонецЦикла;
          

          ### Рекомендации:

          — Если картинка есть на диске, проще использовать метод `ОбработатьТексты()`, указав в HTML путь к файлу, например: ``.
          — Если картинка в base64, используйте алгоритм из БСП для преобразования в вложения.
          — Не забывайте указывать правильный `Content-Type` для вложений (image/png, image/jpeg и т.п.).
          — Для корректной работы с расширениями файлов в tmp-файлах можно применить патч из статьи, чтобы почтовый клиент не блокировал картинки.

          Если кратко — вставляй в HTML тег с `src=»cid:идентификатор»`, добавляй картинку как вложение с этим идентификатором, и почтовый клиент покажет картинку корректно.

          Олег, если нужно — могу помочь с конкретным кодом под твой сценарий.

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С