Как в 1С переместить письмо в другую папку по протоколу IMAP?

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

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

Штатный метод платформы: ПереместитьВПочтовыйЯщик

Начиная с версии платформы 8.3.12, в объекте ИнтернетПочта появился специализированный метод ПереместитьВПочтовыйЯщик (в англоязычном синтаксисе — MoveToMailbox). Данный метод доступен только при подключении по протоколу IMAP и позволяет перемещать письма внутри одного почтового аккаунта.

Синтаксис метода выглядит следующим образом:

ПереместитьВПочтовыйЯщик(<МассивИдентификаторовСообщений>, <Имя>)

Проанализируем параметры этого метода:

  1. МассивИдентификаторовСообщений — обязательный параметр типа Массив, содержащий строковые серверные идентификаторы (UIDL) сообщений, которые необходимо переместить.
  2. Имя — обязательный параметр типа Строка, задающий имя целевого почтового ящика (папки) на сервере IMAP. Папка обязательно должна существовать. Если структура каталогов содержит иерархию, в качестве разделителя используется символ из свойства СимволРазделитель объекта ИнтернетПочта (обычно это символ "/").

Важное примечание: метод опирается на поддержку почтовым сервером расширения UIDPLUS. Если сервер не поддерживает данное расширение, платформа сгенерирует исключение.

Посмотрим на практический пример программного кода для перемещения писем:


Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);

// Устанавливаем исходную папку для работы
Почта.ТекущийПочтовыйЯщик = "INBOX";

// Формируем массив идентификаторов сообщений для перемещения
МассивПисем = Новый Массив;
МассивПисем.Добавить(ИдентификаторПисьма);

// Перемещаем письма в существующую папку "Archive"
Почта.ПереместитьВПочтовыйЯщик(МассивПисем, "Archive");

Почта.Отключиться();

Почему письмо перемещается как копия и как это исправить?

Нередко разработчики сталкиваются с ситуацией, когда после вызова метода ПереместитьВПочтовыйЯщик письмо появляется в папке назначения, однако продолжает отображаться и в исходном каталоге. Выясним причину такого поведения.

По спецификации протокола IMAP операция перемещения состоит из трех этапов:

  1. Копирование сообщения в целевую папку.
  2. Установка служебного флага \Deleted (пометка на удаление) на оригинальное письмо в текущей папке.
  3. Физическое сжатие каталога (команда EXPUNGE).

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

Для физического удаления помеченных писем вызовем метод ОчиститьУдаленныеСообщения():


Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);

// Обязательно указываем исходную папку
Почта.ТекущийПочтовыйЯщик = "INBOX";

МассивПисем = Новый Массив;
МассивПисем.Добавить(ИдентификаторПисьма);

// Выполняем перемещение
Почта.ПереместитьВПочтовыйЯщик(МассивПисем, "Archive");

// Окончательно удаляем помеченные сообщения из текущего ящика (команда EXPUNGE)
Почта.ОчиститьУдаленныеСообщения();

Почта.Отключиться();

Альтернативный вариант: ручная пометка и очистка

Если поведение метода перемещения на конкретном почтовом сервере работает некорректно, можно реализовать операцию через явное копирование и последующее удаление:

  1. Сначала скопируем письмо в целевую папку с помощью метода КопироватьВПочтовыйЯщик.
  2. Затем вызовем метод УдалитьСообщения, передав туда массив идентификаторов. В режиме IMAP данный метод помечает письма флагом удаления.
  3. В конце вызываем ОчиститьУдаленныеСообщения() для окончательного удаления помеченных писем из исходной папки.

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

Особенности почтовых серверов

Обратим внимание на архитектурные нюансы внешних почтовых провайдеров:

  1. Сервисы с ярлыками (например, Gmail): в подобных сервисах концепция папок реализована через метки. Перемещение по IMAP зачастую лишь назначает новую метку, а удаление оригинала из входящих определяется настройками самого почтового аккаунта в веб-интерфейсе.
  2. Права доступа: учетная запись, под которой выполняется подключение, должна обладать правами на удаление и очистку (права delete/expunge) в исходной папке на стороне IMAP-сервера.
← На главную