При разработке почтовых механизмов в 1С часто возникает задача отправить не просто плоский текст, а красиво оформленное письмо: с выделением жирным шрифтом, курсивом, пользовательскими цветами текста, таблицами и вложенными графическими элементами. Для визуального редактирования такого текста на управляемой форме используется реквизит с типом ФорматированныйДокумент. Однако при прямой передаче содержимого в почтовое сообщение оформление нередко теряется, и получатель видит обычный неформатированный текст.
Разберем подробно, почему это происходит и как правильно выгрузить разметку и отправить полноценное HTML-письмо с помощью встроенного языка 1С.
Проанализируем ситуацию: объект ФорматированныйДокумент хранит текст и его стили во внутреннем представлении платформы 1С. При попытке получить из него обычную строку (например, через строковое приведение или обращение к текстовому содержимому) платформа отсекает теги оформления.
Чтобы почтовый клиент адресата корректно отобразил все цвета, шрифты и структуру, необходимо решить две задачи:
ПолучитьHTML.ТипТекстаПочтовогоСообщения.HTML при формировании объекта ИнтернетПочтовоеСообщение.Рассмотрим синтаксис метода объекта ФорматированныйДокумент:
ПолучитьHTML(<ТекстHTML>, <Вложения>)
Разберем параметры данного метода:
Строка) — переменная, в которую метод помещает сгенерированный HTML-код страницы. Обратите внимание: переменная передается по ссылке и заполняется самим методом.Структура) — коллекция встроенных объектов (например, изображений, вставленных в текст). Ключами структуры являются строковые идентификаторы (CID), а значениями — объекты типа Картинка.Разберем по шагам весь процесс формирования и отправки письма из формы обработки или документа.
Шаг 1. Получение HTML и вложений на клиенте или сервере
Метод ПолучитьHTML доступен как в клиентском, так и в серверном контексте. Создадим переменные и извлечем данные из реквизита формы:
&НаКлиенте
Процедура ОтправитьПисьмо(Команда)
ТекстHTML = "";
СтруктураВложений = Новый Структура;
// Получаем HTML-код и структуру встроенных картинок
ФорматированныйДокумент.ПолучитьHTML(ТекстHTML, СтруктураВложений);
// Передаем сформированные данные на сервер для отправки
ОтправитьПисьмоНаСервере(ТекстHTML, СтруктураВложений);
КонецПроцедуры
Шаг 2. Формирование интернет-почтового сообщения на сервере
Посмотрим на пример серверной процедуры, выполняющей сборку и отправку сообщения через объект ИнтернетПочта:
&НаСервере
Процедура ОтправитьПисьмоНаСервере(Знач ТекстHTML, Знач СтруктураВложений)
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Тестовое форматированное письмо";
Письмо.Отправитель.Адрес = "sender@example.com";
Письмо.Получатели.Добавить("recipient@example.com");
Письмо.Кодировка = "UTF-8";
// Добавляем основной текст письма с обязательным указанием типа HTML
Письмо.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);
// Обрабатываем встроенные изображения
Для Каждого ЭлементВложения Из СтруктураВложений Цикл
КартинкаОбъект = ЭлементВложения.Значение;
ИдентификаторCID = ЭлементВложения.Ключ;
// Получаем двоичные данные картинки
ДвоичныеДанныеКартинки = КартинкаОбъект.ПолучитьДвоичныеДанные();
// Добавляем во вложения письма и связываем по CID
ВложениеПисьма = Письмо.Вложения.Добавить(ДвоичныеДанныеКартинки, ИдентификаторCID);
ВложениеПисьма.Идентификатор = ИдентификаторCID;
КонецЦикла;
// Подключение к почтовому серверу и отправка
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.example.com";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "sender@example.com";
Профиль.ПарольSMTP = "secret_password";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ИспользоватьSSLSMTP = Истина;
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Исключение
Почта.Отключиться();
ВызватьИсключение "Ошибка при отправке почты: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Рассмотрим подробнее тонкости, на которые следует обратить внимание при работе с почтовыми сообщениями:
ПолучитьHTML генерирует разметку, ссылки на внедренные картинки получают вид src="cid:ид_картинки". Чтобы почтовый клиент смог отобразить их внутри тела письма, свойство Идентификатор у объекта вложения в Письмо.Вложения должно строго совпадать с ключом из структуры вложений.Письмо.Кодировка = "UTF-8". Это исключает искажение кириллических символов при прохождении через различные почтовые шлюзы.ФорматированныйДокумент создает базовый HTML и встроенные CSS-стили. Некоторые почтовые программы (например, Microsoft Outlook) используют специфические движки рендеринга, поэтому слишком сложные стили или нестандартные шрифты могут отображаться упрощенно.Если возможностей встроенного редактора недостаточно или требуется отправлять строгие отчеты и шаблоны, рассмотрим альтернативные подходы:
СтрШаблон или СтрЗаменить.ТабличныйДокумент можно сохранить в HTML с помощью метода ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.HTML), после чего прочитать полученный файл в строку и передать в тело письма.