При интеграции 1С с почтовыми сервисами по протоколу IMAP часто возникает задача распределения входящей корреспонденции по каталогам: например, перенести обработанные письма в архив или распределить заявки по тематическим папкам ящика. Разберем, какие штатные механизмы платформы 1С:Предприятие позволяют перемещать сообщения и как избежать типичной проблемы, когда перемещенное письмо дублируется и остается в исходной папке.
Начиная с версии платформы 8.3.12, в объекте ИнтернетПочта появился специализированный метод ПереместитьВПочтовыйЯщик (в англоязычном синтаксисе — MoveToMailbox). Данный метод доступен только при подключении по протоколу IMAP и позволяет перемещать письма внутри одного почтового аккаунта.
Синтаксис метода выглядит следующим образом:
ПереместитьВПочтовыйЯщик(<МассивИдентификаторовСообщений>, <Имя>)
Проанализируем параметры этого метода:
Массив, содержащий строковые серверные идентификаторы (UIDL) сообщений, которые необходимо переместить.Строка, задающий имя целевого почтового ящика (папки) на сервере IMAP. Папка обязательно должна существовать. Если структура каталогов содержит иерархию, в качестве разделителя используется символ из свойства СимволРазделитель объекта ИнтернетПочта (обычно это символ "/").Важное примечание: метод опирается на поддержку почтовым сервером расширения UIDPLUS. Если сервер не поддерживает данное расширение, платформа сгенерирует исключение.
Посмотрим на практический пример программного кода для перемещения писем:
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
// Устанавливаем исходную папку для работы
Почта.ТекущийПочтовыйЯщик = "INBOX";
// Формируем массив идентификаторов сообщений для перемещения
МассивПисем = Новый Массив;
МассивПисем.Добавить(ИдентификаторПисьма);
// Перемещаем письма в существующую папку "Archive"
Почта.ПереместитьВПочтовыйЯщик(МассивПисем, "Archive");
Почта.Отключиться();
Нередко разработчики сталкиваются с ситуацией, когда после вызова метода ПереместитьВПочтовыйЯщик письмо появляется в папке назначения, однако продолжает отображаться и в исходном каталоге. Выясним причину такого поведения.
По спецификации протокола IMAP операция перемещения состоит из трех этапов:
Если почтовый сервер не выполняет автоматическое сжатие при установке флага или разрыве соединения, исходное письмо сохраняется в ящике со статусом помеченного на удаление. В зависимости от настроек клиента или веб-почты такие письма могут отображаться как обычные.
Для физического удаления помеченных писем вызовем метод ОчиститьУдаленныеСообщения():
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
// Обязательно указываем исходную папку
Почта.ТекущийПочтовыйЯщик = "INBOX";
МассивПисем = Новый Массив;
МассивПисем.Добавить(ИдентификаторПисьма);
// Выполняем перемещение
Почта.ПереместитьВПочтовыйЯщик(МассивПисем, "Archive");
// Окончательно удаляем помеченные сообщения из текущего ящика (команда EXPUNGE)
Почта.ОчиститьУдаленныеСообщения();
Почта.Отключиться();
Если поведение метода перемещения на конкретном почтовом сервере работает некорректно, можно реализовать операцию через явное копирование и последующее удаление:
КопироватьВПочтовыйЯщик.УдалитьСообщения, передав туда массив идентификаторов. В режиме IMAP данный метод помечает письма флагом удаления.ОчиститьУдаленныеСообщения() для окончательного удаления помеченных писем из исходной папки.Также платформа позволяет управлять статусом писем напрямую с помощью методов ПолучитьФлагиСообщений() и УстановитьФлагиСообщений() с использованием объекта ФлагиИнтернетПочтовогоСообщения (свойство Удаленное = Истина).
Обратим внимание на архитектурные нюансы внешних почтовых провайдеров: