В корпоративной среде часто возникает ситуация, когда пользователю (например, diradmin) предоставляются права доступа к другому почтовому ящику (например, info) через механизм делегирования (доверия). При использовании обычных почтовых клиентов, таких как Microsoft Outlook, общие ящики появляются в интерфейсе автоматически. Однако при попытке программного доступа через 1С с использованием объекта ИнтернетПочта разработчики часто сталкиваются с тем, что видят только структуру папок основного аккаунта, а папки делегированного ящика остаются невидимыми.
В этой статье мы подробно разберем, почему стандартные методы 1С не видят доверенные ящики «из коробки», и проанализируем несколько способов решения этой задачи: от манипуляций с параметрами подключения по протоколу IMAP до использования веб-сервисов и COM-технологий.
Проанализируем работу протокола IMAP. Когда мы подключаемся к серверу, указывая стандартный логин diradmin@domain.com, сервер открывает контекст именно этого пользователя. Чтобы «переключить» контекст на делегированный ящик info, многие почтовые серверы (включая Microsoft Exchange и Kerio) поддерживают специальный формат строки логина. Это самый простой способ, так как он не требует переписывания кода 1С, использующего объект ИнтернетПочта.
Рассмотрим варианты написания логина в настройках профиля ИнтернетПочтовыйПрофиль. Вместо обычного имени пользователя попробуем указать один из следующих вариантов:
diradmin@domain.com/infodomain\diradmin\infoinfo@domain.com\diradminВ коде 1С это будет выглядеть следующим образом:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.yourserver.com";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
// Используем специальный синтаксис для доступа к доверенному ящику
Профиль.ПользовательIMAP = "diradmin@domain.com/info";
Профиль.ПарольIMAP = "Пароль_От_Diradmin";
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
Папки = Почта.ПолучитьПочтовыеЯщики(); // Теперь здесь должна быть структура ящика info
// Дальнейшая обработка писем
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
Важный нюанс: Пароль при такой авторизации всегда указывается именно от основной учетной записи (diradmin), так как авторизация происходит от его имени, но в контексте другого хранилища.
Если почтовый сервер организации — Microsoft Exchange, то использование IMAP не всегда является оптимальным. Протокол EWS предоставляет гораздо больше возможностей для работы с делегированными правами. Хотя в 1С нет встроенного объекта для EWS, мы можем взаимодействовать с ним через HTTPСоединение, отправляя SOAP-запросы (XML).
Выясним преимущество этого метода: он позволяет напрямую обращаться к любой папке другого пользователя, если на нее даны права доступа. Нам не нужно «переключать» весь аккаунт, достаточно в XML-запросе указать адрес целевого ящика в теге Mailbox.
Пример структуры SOAP-запроса для получения идентификатора папки «Входящие» (Inbox) из ящика info@domain.com:
// Пример формирования тела запроса
ТекстЗапроса =
"<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""
| xmlns:t=""http://schemas.microsoft.com/exchange/services/2006/types"">
| <soap:Body>
| <GetFolder xmlns=""http://schemas.microsoft.com/exchange/services/2006/messages"">
| <FolderShape><t:BaseShape>Default</t:BaseShape></FolderShape>
| <FolderIds>
| <t:DistinguishedFolderId Id=""inbox"">
| <t:Mailbox>
| <t:EmailAddress>info@domain.com</t:EmailAddress>
| </t:Mailbox>
| </t:DistinguishedFolderId>
| </FolderIds>
| </GetFolder>
| </soap:Body>
|</soap:Envelope>";
Для реализации этого в 1С используем HTTPСоединение. Необходимо настроить заголовки Content-Type: text/xml и выполнить POST-запрос к адресу https://your-server/ews/exchange.asmx.
В случаях, когда обработка выполняется локально на рабочем месте пользователя (или на Windows-сервере с установленным Outlook), можно воспользоваться интеграцией через COM-соединение. Проанализируем этот путь: он наиболее стабилен в плане прав, так как использует настройки безопасности и профили самого Outlook.
Рассмотрим по шагам, как получить доступ к папке другого пользователя:
info.GetSharedDefaultFolder, который специально предназначен для доступа к доверенным папкам.
Outlook = Новый COMОбъект("Outlook.Application");
NS = Outlook.GetNamespace("MAPI");
// Указываем владельца ящика, к которому есть доступ по доверию
ОбъектПолучатель = NS.CreateRecipient("info@domain.com");
ОбъектПолучатель.Resolve();
Если ОбъектПолучатель.Resolved Тогда
// 6 - константа для папки "Входящие" (olFolderInbox)
ПапкаИнфо = NS.GetSharedDefaultFolder(ОбъектПолучатель, 6);
// Перебираем письма в папке
Для Каждого Письмо Из ПапкаИнфо.Items Цикл
Сообщить("Тема письма: " + Письмо.Subject);
КонецЦикла;
КонецЕсли;
Этот метод хорош тем, что 1С не нужно знать пароли или специфические настройки протоколов — достаточно того, что в Outlook текущего пользователя этот ящик подключен или на него даны права доступа.
Иногда программный доступ не работает не из-за ошибок в коде, а из-за специфики настройки прав в Exchange или другом сервере. Проанализируем ситуацию: системный администратор мог дать права «Full Access» (полный доступ), но забыть про права на уровне структуры папок.
Для того чтобы 1С могла «видеть» структуру через IMAP или API, на корневой уровень почтового ящика info должно быть назначено право Folder Visible (Видимость папки). Без этого права клиент (1С) сможет подключиться к ящику, но не сможет получить список вложенных папок, даже если на них есть права чтения писем.
Подведем итоги нашего исследования. Если стоит задача быстро адаптировать существующий код 1С, использующий ИнтернетПочта, начните с изменения логина IMAP (Способ 1). Это требует минимальных усилий.
Если же вы строите надежную корпоративную систему обмена данными, рассмотрите вариант с HTTP-запросами к EWS (Способ 2). Это позволит избежать зависимости от установленного на сервере или клиенте стороннего софта (Outlook) и даст полный контроль над процессом получения писем.
Также не забывайте про административные методы: если письма нужны только для чтения и обработки в определенных папках, можно настроить правила пересылки на уровне почтового сервера, тогда письма будут автоматически попадать в основной ящик diradmin, и никакие сложные манипуляции с доверием не потребуются.