Как правильно выполнить отбор писем по дате и статусу по протоколу IMAP в 1С

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

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

Почему не срабатывает отбор при загрузке почты

Проанализируем две основные причины, из-за которых отбор сообщений работает не так, как ожидается:

  1. Непереданный результат фильтрации в метод выборки. Сам по себе вызов метода ПолучитьЗаголовки() или ПолучитьИдентификаторы() с параметрами отбора не изменяет внутреннее состояние объекта. Если после этого просто вызвать ПочтаIMAP.Выбрать(Ложь) без второго параметра, платформа проигнорирует отбор и затребует с сервера абсолютно все письма.
  2. Исключающие параметры отбора по статусу. Часто в структуру параметров добавляют ключ ПараметрыОтбораIMAP.Вставить("Seen", Ложь) для получения только непрочитанных писем. Если искомое письмо уже было прочитано (статус Прочитано = Истина), сервер исключит его из результата отбора, даже если дата отправки полностью соответствует условиям.

Правильная последовательность действий при получении писем

Рассмотрим шаги для корректного получения отфильтрованных писем по протоколу IMAP.

Шаг 1. Настройка профиля и установка соединения

Создаем и заполняем объект ИнтернетПочтовыйПрофиль, подключаемся к серверу:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АутентификацияPOP3 = Ложь;
Профиль.АутентификацияSMTP = Ложь;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.АдресСервераIMAP = Объект.АдресСервераIMAP;
Профиль.ПортIMAP = Объект.ПортIMAP;    
Профиль.ПользовательIMAP = Объект.ПользовательIMAP;
Профиль.ПарольIMAP = Объект.ПарольIMAP;

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

Шаг 2. Формирование параметров отбора

Для корректного отбора писем за период вместо точного совпадения даты рекомендуется использовать ключ ПослеДатыОтправления (AfterDateOfPosting):


ПараметрыОтбораIMAP = Новый Структура;
// Отбор писем, отправленных начиная с указанной даты
ПараметрыОтбораIMAP.Вставить("ПослеДатыОтправления", Дата("20180410000000"));

// Если требуется отбор только непрочитанных писем, раскомментируйте:
// ПараметрыОтбораIMAP.Вставить("Seen", Ложь);

Шаг 3. Получение идентификаторов или заголовков

Для повышения производительности предпочтительнее использовать метод ПолучитьИдентификаторы(), а не ПолучитьЗаголовки(). Метод извлекает только уникальные идентификаторы писем (UID) без передачи заголовков по сети:

МассивИдентификаторов = ПочтаIMAP.ПолучитьИдентификаторы(, ПараметрыОтбораIMAP);

Шаг 4. Выборка писем по полученному массиву

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


Если МассивИдентификаторов.Количество() > 0 Тогда
    // Передаем массив идентификаторов вторым параметром
    МассивСообщений = ПочтаIMAP.Выбрать(Ложь, МассивИдентификаторов);

    Для Каждого Сообщение Из МассивСообщений Цикл
        // Обработка загруженного сообщения
    КонецЦикла;
Иначе
    Сообщить("Сообщения по заданному отбору не найдены.");
КонецЕсли;

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

Особенности использования ключей отбора по дате в IMAP

Выясним различия между ключами фильтрации по дате:

  1. Точное совпадение (PostDating / ДатаОтправления): Ищет письма с точным совпадением даты и времени с точностью до секунды. Так как входящие письма содержат время отправки и часовой пояс, совпадение с датой со временем 00:00:00 происходит крайне редко.
  2. Фильтрация за период (ПослеДатыОтправления / ДоДатыОтправления): Позволяет задать нижнюю и верхнюю границы даты отправки писем. На стороне IMAP-сервера сравнение выполняется с учетом часового пояса сервера.
← На главную