При интеграции почтовых сервисов в типовые и доработанные конфигурации (например, 1С:Управление производственным предприятием или 1С:Управление торговлей ред. 10.3) разработчики часто сталкиваются с ситуацией: учетная запись настроена в почтовом клиенте по протоколу IMAP, отправка сообщений проходит штатно, но при попытке получить входящую корреспонденцию через платформенный объект Почта вызов метода не возвращает писем, не выдавая при этом ошибок подключения.
Разберем детально механизм работы почтовых объектов платформы 1С, выясним причину такого поведения и рассмотрим способы решения задачи.
Посмотрим на типовой программный код получения входящих сообщений через основной почтовый клиент операционной системы:
Процедура ЗаполнитьТаблицу()
Попытка
мПочта.Отключиться();
Исключение
ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось выполнить отключение от почтовой программы.");
Возврат;
КонецПопытки;
Попытка
мПочта.Подключиться("Outlook");
Исключение
ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось установить подключение к почтовой программе.");
Возврат;
КонецПопытки;
Попытка
// ПрочитанностьПолучаемыхПисем: Истина - только непрочитанные, Ложь - все
мМассивПисем = мПочта.Выбрать(ПрочитанностьПолучаемыхПисем, ВидПолученияПисем);
Исключение
ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось получить электронные письма.");
Возврат;
КонецПопытки;
Если ТипЗнч(мМассивПисем) <> Тип("Массив") Тогда
мМассивПисем = Новый Массив;
Сообщить("Не удалось получить почту. Проверьте настройки почтового клиента.", СтатусСообщения.Важное);
КонецЕсли;
Для Каждого Письмо Из мМассивПисем Цикл
СтрокаПисем = ТаблицаПисем.Добавить();
СтрокаПисем.Письмо = Письмо;
СтрокаПисем.АдресОтправителя = СтрЗаменить(Строка(Письмо.Отправитель), "SMTP:", "");
СтрокаПисем.Тема = Письмо.Тема;
СтрокаПисем.Текст = СтрЗаменить(Письмо.Текст, Символы.ВК, "");
СтрокаПисем.Вложения = (Письмо.Вложения.Количество() > 0);
КонецЦикла;
КонецПроцедуры
Проанализируем, почему вызов мПочта.Выбрать() возвращает пустой результат:
Почта взаимодействует с установленным в операционной системе клиентом (например, Microsoft Outlook) не напрямую по сетевым протоколам, а через библиотеку mapi32.dll. Механизм Simple MAPI по умолчанию опрашивает только стандартную системную папку «Входящие» из основного локального хранилища сообщений профиля (Default Message Store).Выбрать() платформы 1С не находит новых писем.Выбрать(ТолькоНепрочитанные, ...) по умолчанию принимает значение Истина. Если письма уже были помечены прочитанными в Outlook или через веб-интерфейс, они будут проигнорированы выборкой.Если в конфигурации нельзя менять программный код, используем настройку почтового клиента:
Почта успешно считает их в массив.Если требуется сохранить получение писем через почтовый клиент без изменения правил перемещения, заменим Simple MAPI на прямое обращение к объектной модели Outlook через COM:
Попытка
Outlook = Новый COMОбъект("Outlook.Application");
ПространствоИмен = Outlook.GetNamespace("MAPI");
// Получаем доступ к нужной папке учетной записи IMAP
// Например, папка 6 - стандартная папка Входящие olFolderInbox
ПапкаВходящие = ПространствоИмен.GetDefaultFolder(6);
Элементы = ПапкаВходящие.Items;
Для Индекс = 1 По Элементы.Count Цикл
ТекущееПисьмо = Элементы.Item(Индекс);
// Обработка свойств: ТекущееПисьмо.Subject, ТекущееПисьмо.Body, ТекущееПисьмо.SenderEmailAddress
КонецЦикла;
Исключение
Сообщить("Ошибка доступа к Outlook COM: " + ОписаниеОшибки());
КонецПопытки;
Наиболее надежный и современный способ организации работы с IMAP — отказ от внешнего почтового клиента и использование встроенного объекта ИнтернетПочта. Объект соединяется с сервером напрямую без прослоек ОС и ограничений MAPI:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.yandex.ru";
Профиль.ПортIMAP = 993;
Профиль.ПользовательIMAP = "user@domain.ru";
Профиль.ПарольIMAP = "password";
Профиль.ИспользоватьSSLIMAP = Истина;
ПочтовыйКлиент = Новый ИнтернетПочта;
Попытка
ПочтовыйКлиент.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
// Получаем массив заголовков или сразу сообщений
МассивПисем = ПочтовыйКлиент.Выбрать(Ложь); // Ложь - выбирать все или только непрочитанные
Для Каждого Письмо Из МассивПисем Цикл
// Обработка входящего письма: Письмо.Тема, Письмо.Тексты, Письмо.Вложения
КонецЦикла;
ПочтовыйКлиент.Отключиться();
Исключение
ПочтовыйКлиент.Отключиться();
Сообщить("Ошибка получения почты: " + ОписаниеОшибки());
КонецПопытки;
Перевод функционала на объект ИнтернетПочта позволяет избавиться от привязки к установленному клиенту Outlook, гарантирует корректную работу в регламентных фоновых заданиях на сервере и обеспечивает полную совместимость с протоколами IMAP и SSL/TLS.