Работа с электронной почтой в 1С — это не только отправка и получение текста. Для создания качественного почтового сервиса внутри системы необходимо учитывать правила сетевых протоколов и ожидания пользователей. В этой статье мы разберем по шагам, как правильно организовать ответы на письма, чтобы они группировались в цепочки, как управлять статусами прочтения и эффективно работать с вложениями.
Многие начинающие разработчики полагают, что для создания «ответа» достаточно добавить префикс Re: к теме письма и вставить текст исходного сообщения. Однако современные почтовые клиенты (Gmail, Outlook, Thunderbird) используют гораздо более надежные механизмы. Проанализируем, как это работает на уровне протоколов.
Для того чтобы письма связывались в дерево диалога, необходимо использовать служебные заголовки формата RFC 822. Рассмотрим основные из них:
Message-ID письма, на которое вы отвечаете.В 1С при получении почты через объект ИнтернетПочтовоеСообщение идентификатор доступен в свойстве ИдентификаторСообщения. При формировании ответа нам крайне важно сохранить этот ID. Рассмотрим программную логику подготовки заголовков:
// Предположим, ПисьмоОснование - это объект ИнтернетПочтовоеСообщение, на которое мы отвечаем
НовоеПисьмо = Новый ИнтернетПочтовоеСообщение;
НовоеПисьмо.Тема = "Re: " + ПисьмоОснование.Тема;
// В стандартном объекте 1С прямая запись In-Reply-To может быть ограничена
// Однако мы можем использовать структуру заголовков, если работаем с CDO или внешними библиотеками
// В рамках стандартной ИнтернетПочты важно правильно заполнить тело
Выясним причину, по которой обычного копирования текста недостаточно. Существует общепринятый этикет оформления ответов (Quoting). Если мы используем Plain Text, то перед каждой строкой исходного письма принято ставить символ ">". Однако сегодня стандартом является HTML.
Проанализируем ситуацию с HTML-письмом. Для корректного отображения исходное сообщение следует оборачивать в тег <blockquote>. Это создаст визуальный отступ или вертикальную линию слева, что позволит пользователю легко отличить новый текст от старого. Также хорошим тоном считается добавление разделителя, например: "--- Исходное сообщение ---" с указанием даты и автора.
Часто возникает задача программно изменить состояние письма на сервере. В 1С для этого используется метод УстановитьФлагиСообщений объекта ИнтернетПочта. Разберем пример кода, который позволяет пометить сообщения как непрочитанные.
Важное замечание: этот функционал полноценно работает только при использовании протокола IMAP. Протокол POP3 не поддерживает синхронизацию флагов состояний на сервере.
Рассмотрим пример реализации:
// Создаем объект для установки флагов
ФлагСообщения = Новый ФлагиИнтернетПочтовогоСообщения();
ФлагСообщения.Прочитанное = Ложь; // Устанавливаем статус "Непрочитано"
// Создаем соответствие, где ключ - идентификатор сообщения, значение - объект флагов
ФлагиСообщенийIMAP = Новый Соответствие;
// Пройдемся по массиву полученных писем (заголовков)
Для Каждого Письмо Из СписокПисем Цикл
// Используем уникальный идентификатор сообщения на сервере
ФлагиСообщенийIMAP.Вставить(Письмо.Идентификатор[0], ФлагСообщения);
КонецЦикла;
// Отправляем команду на сервер
Почта.УстановитьФлагиСообщений(ФлагиСообщенийIMAP);
Обратите внимание, что в объекте ФлагиИнтернетПочтовогоСообщения по умолчанию все свойства имеют значение Неопределено. Это сделано специально: сервер изменит только те флаги, которые вы явно установили в Истина или Ложь, не затрагивая остальные (например, флаг «Важное» или «Удалено»).
Рассмотрим ситуацию: в почтовом ящике сотни писем с тяжелыми вложениями. Если мы будем скачивать каждое письмо целиком только для того, чтобы проверить наличие файла, производительность системы упадет. Выясним, как оптимизировать этот процесс.
При использовании метода Выбрать(Ложь) (получение только заголовков) коллекция Вложения будет пустой. Но мы можем проанализировать служебную информацию:
multipart/mixed или multipart/related, это первый признак наличия вложенных объектов (файлов или встроенных изображений).yes однозначно указывает на наличие файлов.Размер объекта сообщения позволяет косвенно судить о наличии вложений. Если письмо весит несколько мегабайт, там гарантированно есть контент помимо текста.Для продвинутой работы с IMAP рекомендуется использовать команду BODYSTRUCTURE. Она позволяет получить дерево строения письма (типы данных, имена файлов, их размеры) без загрузки самих данных. В стандартной платформе 1С это может потребовать низкоуровневой работы с протоколом или использования внешних компонент.
Помимо флага Прочитанное, в протоколе IMAP существует системный флаг \Answered. Мы рекомендуем устанавливать его сразу после того, как письмо было успешно отправлено из 1С в ответ на входящее. Это позволит другим сотрудникам, работающим с тем же почтовым ящиком через другие клиенты (например, с мобильных телефонов), видеть иконку «стрелочки», означающую, что на письмо уже ответили.
Проанализируем использование уникальных идентификаторов (UID). Помните, что Идентификатор из 1С привязан к сессии IMAP. Для надежного хранения связей в базе данных 1С лучше сохранять глобальный Message-ID, так как он не меняется при перемещении письма между папками или переиндексации почтового ящика.
Таким образом, комбинируя правильную работу с заголовками, использование HTML-цитирования и грамотное управление флагами IMAP, мы можем создать в 1С полноценный почтовый клиент, не уступающий по функциональности профессиональным решениям. Если требуется готовый базовый функционал работы с почтой без изменения конфигурации, можно использовать расширение для отправки и получения почтовых сообщений с вложениями.