При работе с объектом ИнтернетПочта по протоколу IMAP разработчики часто сталкиваются с ситуацией, когда фильтрация писем на стороне сервера не срабатывает и метод Выбрать() загружает абсолютно все сообщения из почтового ящика. Разберем причины такого поведения и проанализируем корректный порядок вызова методов платформы 1С.
Проанализируем две основные причины, из-за которых отбор сообщений работает не так, как ожидается:
ПолучитьЗаголовки() или ПолучитьИдентификаторы() с параметрами отбора не изменяет внутреннее состояние объекта. Если после этого просто вызвать ПочтаIMAP.Выбрать(Ложь) без второго параметра, платформа проигнорирует отбор и затребует с сервера абсолютно все письма.ПараметрыОтбора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.Отключиться();
Выясним различия между ключами фильтрации по дате:
00:00:00 происходит крайне редко.