Как реализовать ответ на электронное письмо с сохранением цепочки переписки и управлением статусами в 1С

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

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

Организация цепочек писем (Threading)

Многие начинающие разработчики полагают, что для создания «ответа» достаточно добавить префикс Re: к теме письма и вставить текст исходного сообщения. Однако современные почтовые клиенты (Gmail, Outlook, Thunderbird) используют гораздо более надежные механизмы. Проанализируем, как это работает на уровне протоколов.

Для того чтобы письма связывались в дерево диалога, необходимо использовать служебные заголовки формата RFC 822. Рассмотрим основные из них:

  1. Message-ID: Уникальный идентификатор каждого отправленного письма.
  2. In-Reply-To: В этом поле должен быть указан Message-ID письма, на которое вы отвечаете.
  3. References: Содержит список всех идентификаторов предыдущих сообщений в данной ветке переписки.

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


// Предположим, ПисьмоОснование - это объект ИнтернетПочтовоеСообщение, на которое мы отвечаем
НовоеПисьмо = Новый ИнтернетПочтовоеСообщение;
НовоеПисьмо.Тема = "Re: " + ПисьмоОснование.Тема;

// В стандартном объекте 1С прямая запись In-Reply-To может быть ограничена
// Однако мы можем использовать структуру заголовков, если работаем с CDO или внешними библиотеками
// В рамках стандартной ИнтернетПочты важно правильно заполнить тело

Оформление тела ответа и цитирование

Выясним причину, по которой обычного копирования текста недостаточно. Существует общепринятый этикет оформления ответов (Quoting). Если мы используем Plain Text, то перед каждой строкой исходного письма принято ставить символ ">". Однако сегодня стандартом является HTML.

Проанализируем ситуацию с HTML-письмом. Для корректного отображения исходное сообщение следует оборачивать в тег <blockquote>. Это создаст визуальный отступ или вертикальную линию слева, что позволит пользователю легко отличить новый текст от старого. Также хорошим тоном считается добавление разделителя, например: "--- Исходное сообщение ---" с указанием даты и автора.

Управление статусом «Прочитано/Непрочитано»

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

Важное замечание: этот функционал полноценно работает только при использовании протокола IMAP. Протокол POP3 не поддерживает синхронизацию флагов состояний на сервере.

Рассмотрим пример реализации:


// Создаем объект для установки флагов
ФлагСообщения = Новый ФлагиИнтернетПочтовогоСообщения();
ФлагСообщения.Прочитанное = Ложь; // Устанавливаем статус "Непрочитано"

// Создаем соответствие, где ключ - идентификатор сообщения, значение - объект флагов
ФлагиСообщенийIMAP = Новый Соответствие;

// Пройдемся по массиву полученных писем (заголовков)
Для Каждого Письмо Из СписокПисем Цикл
    // Используем уникальный идентификатор сообщения на сервере
    ФлагиСообщенийIMAP.Вставить(Письмо.Идентификатор[0], ФлагСообщения);
КонецЦикла; 

// Отправляем команду на сервер
Почта.УстановитьФлагиСообщений(ФлагиСообщенийIMAP);

Обратите внимание, что в объекте ФлагиИнтернетПочтовогоСообщения по умолчанию все свойства имеют значение Неопределено. Это сделано специально: сервер изменит только те флаги, которые вы явно установили в Истина или Ложь, не затрагивая остальные (например, флаг «Важное» или «Удалено»).

Определение наличия вложений без скачивания сообщения

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

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

Для продвинутой работы с IMAP рекомендуется использовать команду BODYSTRUCTURE. Она позволяет получить дерево строения письма (типы данных, имена файлов, их размеры) без загрузки самих данных. В стандартной платформе 1С это может потребовать низкоуровневой работы с протоколом или использования внешних компонент.

Дополнительные флаги: помечаем ответ

Помимо флага Прочитанное, в протоколе IMAP существует системный флаг \Answered. Мы рекомендуем устанавливать его сразу после того, как письмо было успешно отправлено из 1С в ответ на входящее. Это позволит другим сотрудникам, работающим с тем же почтовым ящиком через другие клиенты (например, с мобильных телефонов), видеть иконку «стрелочки», означающую, что на письмо уже ответили.

Проанализируем использование уникальных идентификаторов (UID). Помните, что Идентификатор из 1С привязан к сессии IMAP. Для надежного хранения связей в базе данных 1С лучше сохранять глобальный Message-ID, так как он не меняется при перемещении письма между папками или переиндексации почтового ящика.

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

← На главную