В процессе эксплуатации высоконагруженных систем обмена сообщениями между 1С:Предприятие и Microsoft Exchange 2019 разработчики часто сталкиваются со специфическим поведением протокола IMAP. Типичная ситуация: регламентное задание успешно отправляет первые несколько писем, после чего стабильно падает с ошибкой The specified message set is invalid (Код ошибки: 4). Проанализируем, почему это происходит и как решить проблему, не прибегая к радикальным изменениям конфигурации.
Рассмотрим ситуацию: при использовании типовых механизмов 1С для отправки почты через IMAP, платформа выполняет последовательность действий. Сначала письмо отправляется по SMTP или помещается в папку «Отправленные» с помощью команды APPEND, а затем 1С пытается установить флаг \Seen (Прочитано) для этого сообщения. Проанализируем фрагмент кода, который вызывает исключение:
Если ПротоколПолученияПочты = ПротоколИнтернетПочты.IMAP Тогда
Соединение.Послать(Письмо, ОбрабатыватьТексты, ПротоколИнтернетПочты.IMAP);
РезультатОтправкиПисьма.Вставить("ИдентификаторПисьмаIMAP", Письмо.ИдентификаторСообщения);
ФлагиПисьма = Новый ФлагиИнтернетПочтовогоСообщения;
ФлагиПисьма.Прочитанное = Истина;
ФлагиПисем = Новый Соответствие;
ФлагиПисем.Вставить(Письмо.ИдентификаторСообщения, ФлагиПисьма);
Соединение.УстановитьФлагиСообщений(ФлагиПисем);
КонецЕсли;
При изучении логов почтового сервера Exchange выясняется, что команда APPEND проходит успешно, но следующая за ней команда STORE возвращает ошибку:
LOG: store * +FLAGS.SILENT (\Seen) -> R="11 BAD The specified message set is invalid."
Выясним причину: символ * в протоколе IMAP является указателем на «максимальный порядковый номер сообщения в папке». Ошибка возникает из-за того, что в рамках одной сессии Exchange не всегда успевает обновить индекс папки сразу после добавления нового объекта. Когда 1С запрашивает изменение флага для «последнего» сообщения, сервер считает этот указатель невалидным, так как внутренний счетчик сессии еще не синхронизирован.
Разберем, почему система работает некоторое время, а затем дает сбой. Это связано с механизмами Throttling Policy (политики регулирования) в Microsoft Exchange и особенностями реализации почтового клиента в платформе 1С версии 8.3.27 и выше. Проанализируем основные факторы:
STORE * отклоняется.ImapMaxBurst, который определяет количество команд, которые пользователь может отправить «всплеском». Часто этот лимит настроен таким образом, что после 10-15 быстрых операций сервер начинает требовать паузу или выдает BAD на операции управления метаданными.UID.Если мы имеем возможность вносить изменения в код, самым простым и надежным способом будет отказ от принудительной установки флага «Прочитано» сразу после отправки. Рассмотрим, как это влияет на процесс: когда 1С не вызывает метод УстановитьФлагиСообщений, команда STORE * не отправляется на сервер, и цепочка APPEND продолжается без ошибок.
Проанализируем ситуацию: письмо, помещенное в папку «Отправленные» через APPEND, по умолчанию может иметь флаг «Непрочитанное» (зависит от настроек сервера). Если для бизнес-логики это не критично, просто закомментируем строки, отвечающие за ФлагиПисьма.Прочитанное.
Если патчить код конфигурации нежелательно (например, в случае множества распределенных баз), необходимо скорректировать поведение почтового сервера. Выясним, какие параметры стоит проверить:
1c.robot), следует создать персональную ThrottlingPolicy.
Set-ThrottlingPolicy -Identity "1C_Robot_Policy" -IMAPMaxConcurrency Unlimited -IMAPMaxBurst Unlimited -MessageRateLimit Unlimited
Set-Mailbox -Identity "1c.robot" -ThrottlingPolicy "1C_Robot_Policy"
APPEND.Рассмотрим альтернативный архитектурный подход. Вместо того чтобы заставлять 1С копировать письмо в папку «Отправленные» через IMAP (что является тяжелой операцией), можно использовать возможности SMTP-транспорта.
Разберем шаги реализации:
1c.robot, сервер должен автоматически копировать его в определенную папку.Если проблема сохраняется, проанализируем состояние почтового ящика. Огромное количество писем в папке (более 100-200 тысяч) значительно замедляет работу индексов IMAP в Exchange. Проверим это, выполнив очистку папки «Отправленные» или создав тестовый «пустой» ящик. Как показывает практика, на чистых ящиках ошибка The specified message set is invalid возникает значительно реже, что подтверждает теорию о задержках индексации как основной причине сбоя.
Подводя итог, можно сказать, что связка 1С 8.3.27 и Exchange 2019 по протоколу IMAP требует тонкой настройки либо на стороне сервера (политики Throttling), либо на стороне кода (отказ от управления флагами в той же сессии, где происходит запись письма).