При автоматизации работы с электронной почтой в 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда настройка «удалять сообщения с сервера» игнорируется программой. Ящик постепенно переполняется, а письма, которые уже были получены в систему, остаются на сервере. Давайте разберемся, почему это происходит и как правильно настроить удаление сообщений.
Первое, что необходимо проанализировать — это протокол, по которому ваше приложение взаимодействует с почтовым сервером. В 1С объект ИнтернетПочта универсален, но его поведение при удалении напрямую зависит от протокола:
Message-ID (из заголовков письма). Удаление происходит относительно просто, но часто требует немедленной фиксации изменений.UID, который присваивается сервером. Метод УдалитьСообщения в 1С для протокола IMAP ожидает именно этот UID, а не Message-ID из заголовка письма.Частая ошибка заключается в том, что программисты пытаются использовать ИдентификаторСообщения (Message-ID), который хранится в базе данных 1С, для передачи его в метод УдалитьСообщения(). Если соединение установлено по IMAP, сервер просто не понимает, какое письмо вы хотите удалить, так как ожидает свой внутренний UID.
Чтобы успешно удалить письмо, нельзя использовать «застывшие» в базе данных строки. Необходимо получить актуальные данные непосредственно из текущей сессии с почтовым сервером. Для этого используем метод ПолучитьИдентификаторы().
Давайте посмотрим, как это выглядит в коде:
// Предположим, объект ИнтернетПочта уже создан и подключен
// Сначала получаем список всех идентификаторов, доступных на сервере в данный момент
МассивИдентификаторовНаСервере = ИнтернетПочта.ПолучитьИдентификаторы();
// Сравниваем или находим нужный идентификатор для нашего объекта письма
// ИнтернетПисьмо — это объект, полученный при чтении почты
Для Каждого Идентификатор Из МассивИдентификаторовНаСервере Цикл
// Выполняем логику поиска соответствия
Если НайтиНужноеПисьмо(Идентификатор) Тогда
МассивДляУдаления = Новый Массив;
МассивДляУдаления.Добавить(Идентификатор);
ИнтернетПочта.УдалитьСообщения(МассивДляУдаления);
КонецЕсли;
КонецЦикла;
При использовании протокола IMAP, простого вызова метода УдалитьСообщения бывает недостаточно. Дело в том, что в IMAP процесс удаления происходит в два этапа:
\Deleted для письма (это делает метод УдалитьСообщения).Чтобы изменения вступили в силу и место на сервере действительно освободилось, необходимо вызвать метод ОчиститьУдаленныеСообщения():
ИнтернетПочта.УдалитьСообщения(МассивПисемДляУдаления);
ИнтернетПочта.ОчиститьУдаленныеСообщения();
Если пропустить этот вызов, письма будут продолжать «висеть» на сервере до тех пор, пока сессия не завершится или пока почтовый клиент не выполнит процедуру очистки (expunge) самостоятельно.
Чтобы избежать затыков при приеме почты, когда «кривое» письмо блокирует всю процедуру обмена, следуйте этим рекомендациям:
Попытка...Исключение. Это позволит программе пропустить одно поврежденное письмо и продолжить обработку остальных.ИнтернетПисьмо, связанные с идентификатором сообщения. Если IMAP — работайте исключительно с UID.Выбрать(): Если ваша задача — просто забрать почту и сразу удалить ее, рассмотрите возможность использования ИнтернетПочта.Выбрать(Истина, МассивПисем). Этот метод позволяет автоматизировать процесс пометки на удаление сразу в момент получения писем, что зачастую оказывается надежнее ручного формирования массива идентификаторов.Работая в команде, всегда анализируйте логи почтового обмена — в них часто видна реакция сервера на команды DELE (для POP3) или STORE +FLAGS (\Deleted) (для IMAP), что поможет оперативно вычислить, на каком этапе «затык».