Как настроить отбор входящих писем при получении почты через объект ИнтернетПочта в 1С

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

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

Выясним причину: почему отбор не срабатывает

Основная причина игнорирования параметров отбора заключается в используемом почтовом протоколе:

  1. Протокол POP3 не поддерживает серверную фильтрацию. Если подключение выполняется по протоколу POP3 (по умолчанию во многих конфигурациях), почтовый сервер физически не умеет выполнять поиск по полям письма. В этом случае платформа 1С полностью игнорирует переданную структуру мОтбор и возвращает идентификаторы всех сообщений в почтовом ящике.
  2. Серверная фильтрация работает только по протоколу IMAP. Протокол IMAP изначально проектировался для управления почтой непосредственно на сервере и поддерживает команды поиска SEARCH.
  3. Особенности почтовых серверов и кодировок. При использовании кириллических строк в отборе платформа передает поисковый запрос в кодировке UTF-8. Некоторые почтовые серверы (например, определенные версии MS Exchange или устаревшие IMAP-демоны) могут некорректно обрабатывать команду поиска по тексту или прерывать соединение при фильтрации по кириллическим подстрокам.

Способ 1. Использование протокола IMAP для серверного отбора

Проанализируем правильный порядок настройки подключения к почтовому ящику по протоколу IMAP. Для выполнения поиска на стороне сервера необходимо явно указать параметры IMAP в профиле и передать объект перечисления ПротоколИнтернетПочты.IMAP при вызове метода Подключиться().

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

  1. Строковые параметры (поиск по вхождению подстроки без учета регистра): "Тема" (или "Subject"), "Отправитель" ("From"), "Получатели" ("To"), "Копии" ("Cc"), "Текст" ("Text"), "ТелоСообщения" ("Body").
  2. Параметры дат (тип Дата): "ДатаОтправления", "ДоДатыОтправления", "ПослеДатыОтправления".
  3. Логические флаги (тип Булево): "Прочитанные" (или "Seen"), "Новые" ("New"), "Недавние" ("Recent"), "Удаленные" ("Deleted"), "Важные" ("Flagged").

Посмотрим на практический пример кода для получения только непрочитанных писем с определенной темой:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательIMAP = "robot@mail.ru";
Профиль.ПарольIMAP = "ПарольПриложения";

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

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

// Формируем параметры отбора (условия объединяются по "И")
Отбор = Новый Структура;
Отбор.Вставить("Seen", Ложь);
Отбор.Вставить("Тема", "VedomostTovarov");

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

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

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

Важное замечание: при вызове метода Выбрать() обязательно передавайте полученный МассивИдентификаторов вторым параметром. Если вызвать Почта.Выбрать(Ложь) без передачи массива, платформа начнет последовательно скачивать все письма из почтового ящика целиком.

Способ 2. Клиентская фильтрация через получение заголовков

Если используемый почтовый сервер нестабильно обрабатывает поиск по кириллице через IMAP или если подключение возможно только по протоколу POP3, разберем самый надежный и универсальный двухэтапный алгоритм.

Метод ПолучитьЗаголовки() скачивает только служебную информацию о сообщениях (тему, отправителя, дату, идентификатор) без тяжелого тела письма и вложений. Это обеспечивает минимальный трафик и высокую скорость работы.

Разберем реализацию этого способа по шагам:

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

Посмотрим на пример реализации:


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

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

СтрокаПоиска = ВРег("VedomostTovarov");

Для Каждого Заголовок Из МассивЗаголовков Цикл
    // Проверяем вхождение нужной подстроки в тему письма
    Если Найти(ВРег(Заголовок.Тема), СтрокаПоиска) > 0 Тогда
        // Заголовок содержит массив идентификаторов (обычно из одного элемента)
        ИдентификаторыДляЗагрузки.Добавить(Заголовок.Идентификатор[0]);
    КонецЕсли;
КонецЦикла;

// Если найдены целевые письма, скачиваем их полностью
Если ИдентификаторыДляЗагрузки.Количество() > 0 Тогда
    МассивПисем = Почта.Выбрать(Ложь, ИдентификаторыДляЗагрузки);
    
    Для Каждого Письмо Из МассивПисем Цикл
        // Выполняем разбор и обработку письма
    КонецЦикла;
КонецЕсли;

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

Способ 3. Использование правил сортировки на стороне почтового сервера

Если входящий поток писем очень большой, самым производительным решением является предварительная фильтрация средствами самого почтового сервиса (Яндекс, Mail.ru, Gmail, Exchange):

  1. В веб-интерфейсе или настройках почтового сервера создаем правило обработки входящей почты: если тема содержит нужный маркер (например, VedomostTovarov), перемещать письмо в отдельную папку (например, INBOX/Orders).
  2. В коде 1С подключаемся по IMAP и переключаем контекст на нужную папку: Почта.ТекущийПочтовыйЯщик = "INBOX/Orders";.
  3. Забираем все сообщения из этой папки без необходимости формировать сложные серверные или клиентские отборы.
← На главную