Как настроить подключение к общему почтовому ящику (Shared Mailbox) Microsoft Exchange по IMAP в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 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. В результате сервер отвергает попытку подключения.

Давайте рассмотрим эффективные методы обхода этого ограничения — от простых изменений синтаксиса до современных протоколов авторизации.


Способ 1. Использование альтернативного синтаксиса разделителей (без изменения кода платформы)

Не все знают, что Microsoft Exchange поддерживает несколько альтернативных вариантов разделителей для авторизации в общих ящиках. Если библиотека платформы 1С "спотыкается" на обратном слэше (\), мы можем заменить его на другие символы, которые корректно передаются в IMAP-сессии.

Разберем, какие варианты синтаксиса логина можно использовать в свойстве ПользовательIMAP:

  1. Прямой слэш (слеш): Самый надежный и часто используемый обходной путь. Заменяем обратный слэш на прямой. Профиль.ПользовательIMAP = "mailer@firma.com/petrov"; Или в полном формате с указанием доменов: Профиль.ПользовательIMAP = "mailer@firma.com/petrov@firma.com";
  2. Вертикальная черта (pipe): Некоторые версии Exchange также корректно обрабатывают символ вертикального разделителя. Профиль.ПользовательIMAP = "mailer@firma.com|petrov";
  3. Формат с указанием NT-домена: Если используется локальный Exchange-сервер внутри Active Directory, можно попробовать указать домен с прямым слэшем: Профиль.ПользовательIMAP = "domain/mailer/petrov";

Использование прямого слэша / решает проблему с авторизацией IMAP в 1С в 90% случаев, так как этот символ не экранируется библиотеками платформы и успешно распознается сервером Exchange.


Способ 2. Настройка авторизации на стороне сервера Exchange

Если изменить синтаксис в кодовой базе 1С по каким-то причинам не удается, или почтовый сервер упорно отклоняет любые попытки авторизации под делегированной учетной записью, можно прибегнуть к административным настройкам на стороне сервера Microsoft Exchange.

Рассмотрим два варианта, которые могут реализовать ваши системные администраторы:

  1. Задание пароля для учетной записи общего ящика. Хотя по умолчанию учетная запись общего ящика в Active Directory отключена и не имеет пароля, администратор безопасности может принудительно задать для нее сложный пароль в AD, оставив саму учетную запись отключенной для интерактивного входа в Windows. При этом для протокола IMAP базовая авторизация станет доступна. В коде 1С это позволит подключаться напрямую к целевому ящику без использования учетной записи делегата:
    
    Профиль.ПользовательIMAP = "petrov@firma.com"; // Напрямую общий ящик
    Профиль.ПарольIMAP = "НовыйЗаданныйПарольЯщика";
    
    Важно: Данный метод может противоречить внутренним регламентам безопасности вашей компании, так как Microsoft рекомендует держать учетные записи общих ящиков без паролей.
  2. Авторизация по IP-адресу без пароля (Релей/Relay). Этот способ упомянут в исходном обсуждении на форуме. Если сервер приложений 1С находится внутри защищенного контура компании, системные администраторы могут настроить на Exchange специальный коннектор приема (Receive Connector). Этот коннектор позволяет определенному IP-адресу (серверу 1С) подключаться к почтовым ящикам по протоколам IMAP/SMTP без прохождения процедуры авторизации (Anonymous/Integrated Windows Authentication). Это полностью снимает проблему подбора логина и пароля в коде 1С, но требует высокого уровня доверия к сети, где работает сервер приложений 1С.

Способ 3. Переход на современную авторизацию OAuth 2.0 (Платформа 1С 8.3.13 и выше)

Современные требования к безопасности диктуют отказ от базовой авторизации (логин/пароль) в пользу токенов доступа. 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-сессию. Символы слэша в логине больше вообще не используются, что исключает любые ошибки синтаксического разбора.


Способ 4. Отказ от IMAP в пользу современных API (Microsoft Graph или EWS)

Если вы работаете с инфраструктурой Microsoft Exchange, использование старых протоколов семейства IMAP/POP3 постепенно становится "бутылочным горлышком" производительности и безопасности. Крупные компании и опытные интеграторы рекомендуют уходить от объекта ИнтернетПочта в сторону веб-служб.

Рассмотрим две альтернативные технологии доступа к почте напрямую из 1С:

1. Exchange Web Services (EWS)

EWS — это мощный SOAP-интерфейс, предоставляемый серверами Exchange (как локальными, так и облачными). Работа с ним в 1С строится через HTTP-запросы с помощью объекта HTTPСоединение.

Преимущества EWS для общего ящика:

2. Microsoft Graph API

Если ваша почта размещена в облаке 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С:

← На главную