При интеграции 1С с корпоративной почтовой системой на базе Microsoft Exchange разработчики часто сталкиваются с необходимостью автоматической обработки писем из общих почтовых ящиков (так называемых Shared Mailboxes). Общие ящики активно используются в бизнес-процессах для обработки входящих заявок (например, sales@firma.com, support@firma.com или info@firma.com).
Сложность заключается в том, что у классического общего ящика Exchange нет собственного пароля и активной учетной записи в Active Directory. Доступ к нему предоставляется конкретным пользователям (делегатам). При попытке подключиться к такому ящику через стандартный объект платформы 1С ИнтернетПочта по протоколу IMAP разработчики получают ошибку: "Can not authenticate to IMAP server: AUTHENTICATE failed". В этой статье мы подробно разберем причины возникновения этой проблемы и рассмотрим несколько практических способов ее решения.
Для начала проанализируем, как почтовые клиенты (например, Microsoft Outlook) подключаются к общим ящикам по протоколу IMAP. Чтобы авторизоваться в общем ящике, почтовому серверу необходимо передать учетные данные делегата (пользователя, у которого есть права) и указать, к какому именно общему ящику мы хотим подключиться. Обычно используется следующий синтаксис для имени пользователя (логина):
ИмяПользователяДелегата\ИмяОбщегоЯщика
Например, если у пользователя mailer@firma.com есть права на ящик petrov@firma.com, то в качестве логина в почтовом клиенте указывается строка:
mailer@firma.com\petrov
При попытке перенести этот синтаксис в код 1С и настроить объект ИнтернетПочтовыйПрофиль мы сталкиваемся с системным ограничением:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.firma.com";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательIMAP = "mailer@firma.com\petrov"; // Ошибка авторизации!
Профиль.ПарольIMAP = "ПарольПользователяMailer";
Почему же этот код вызывает ошибку аутентификации? Дело в том, что внутренние почтовые библиотеки платформы 1С (в частности, библиотека libetpan, используемая начиная с версии платформы 8.3.11) некорректно обрабатывают символ обратного слэша (\). В некоторых случаях он воспринимается как служебный экранирующий символ, в других — просто отсекается или некорректно кодируется при передаче команды AUTHENTICATE на сервер Exchange. В результате сервер отвергает попытку подключения.
Давайте рассмотрим эффективные методы обхода этого ограничения — от простых изменений синтаксиса до современных протоколов авторизации.
Не все знают, что Microsoft Exchange поддерживает несколько альтернативных вариантов разделителей для авторизации в общих ящиках. Если библиотека платформы 1С "спотыкается" на обратном слэше (\), мы можем заменить его на другие символы, которые корректно передаются в IMAP-сессии.
Разберем, какие варианты синтаксиса логина можно использовать в свойстве ПользовательIMAP:
Профиль.ПользовательIMAP = "mailer@firma.com/petrov";
Или в полном формате с указанием доменов:
Профиль.ПользовательIMAP = "mailer@firma.com/petrov@firma.com";
Профиль.ПользовательIMAP = "mailer@firma.com|petrov";
Профиль.ПользовательIMAP = "domain/mailer/petrov";
Использование прямого слэша / решает проблему с авторизацией IMAP в 1С в 90% случаев, так как этот символ не экранируется библиотеками платформы и успешно распознается сервером Exchange.
Если изменить синтаксис в кодовой базе 1С по каким-то причинам не удается, или почтовый сервер упорно отклоняет любые попытки авторизации под делегированной учетной записью, можно прибегнуть к административным настройкам на стороне сервера Microsoft Exchange.
Рассмотрим два варианта, которые могут реализовать ваши системные администраторы:
Профиль.ПользовательIMAP = "petrov@firma.com"; // Напрямую общий ящик
Профиль.ПарольIMAP = "НовыйЗаданныйПарольЯщика";
Современные требования к безопасности диктуют отказ от базовой авторизации (логин/пароль) в пользу токенов доступа. Microsoft активно отключает базовую авторизацию для Exchange Online (Office 365) и рекомендует использовать протокол OAuth 2.0.
Фирма 1С добавила встроенную поддержку OAuth 2.0 для протокола IMAP начиная с версии платформы 8.3.13. Давайте разберем, как это работает и почему это решает проблему общего ящика.
При использовании OAuth 2.0 авторизация происходит не по паролю пользователя, а по специальному временному токену доступа (Access Token), который 1С получает от службы авторизации (например, Azure Active Directory). При этом права доступа к общему ящику делегируются на уровне самого токена.
Проанализируем пример настройки профиля в 1С с использованием токена:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "outlook.office365.com";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
// В качестве пользователя указываем адрес самого ОБЩЕГО ящика!
Профиль.ПользовательIMAP = "petrov@firma.com";
// Указываем, что авторизация будет выполняться по токену
Профиль.АутентификацияПоТокену = ИспользованиеАутентификацииИнтернетПочтыПоТокену.Использовать;
// Передаем предварительно полученный Access Token основного пользователя (mailer@firma.com)
// У которого есть права доступа на ящик petrov@firma.com
Профиль.ТокенДоступа = ПолучитьТокенДоступаOAuth2();
При такой схеме почтовый сервер Exchange валидирует токен доступа, видит, что он выдан доверенному пользователю mailer@firma.com, проверяет его права на общий ящик petrov@firma.com и успешно открывает IMAP-сессию. Символы слэша в логине больше вообще не используются, что исключает любые ошибки синтаксического разбора.
Если вы работаете с инфраструктурой Microsoft Exchange, использование старых протоколов семейства IMAP/POP3 постепенно становится "бутылочным горлышком" производительности и безопасности. Крупные компании и опытные интеграторы рекомендуют уходить от объекта ИнтернетПочта в сторону веб-служб.
Рассмотрим две альтернативные технологии доступа к почте напрямую из 1С:
EWS — это мощный SOAP-интерфейс, предоставляемый серверами Exchange (как локальными, так и облачными). Работа с ним в 1С строится через HTTP-запросы с помощью объекта HTTPСоединение.
Преимущества EWS для общего ящика:
Если ваша почта размещена в облаке Office 365, лучшим выбором будет использование REST API Microsoft Graph. Для чтения писем из общего ящика достаточно отправить простой HTTP-запрос GET к конечной точке:
https://graph.microsoft.com/v1.0/users/petrov@firma.com/messages
При этом авторизация выполняется по протоколу OAuth 2.0 на уровне приложения, зарегистрированного в Azure AD, что исключает необходимость передачи пользовательских паролей в коде 1С.
Подведем итоги нашего анализа проблемы работы с общими почтовыми ящиками Exchange в 1С:
Профиль.ПользовательIMAP = "mailer@firma.com/petrov".АутентификацияПоТокену и ТокенДоступа объекта ИнтернетПочтовыйПрофиль.