Как настроить отправку почты из 1С через SMTP Office 365 с поддержкой Explicit TLS (STARTTLS)?

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

При интеграции механизмов отправки почты из 1С (например, для рассылки расчетных листков или уведомлений клиентам) через облачные сервисы Microsoft (Exchange Online / Office 365) разработчики часто сталкиваются с ошибками установки соединения. Проблема заключается в принципиальной разнице между режимами шифрования Implicit TLS (неявное шифрование) и Explicit TLS (явное шифрование, известное как STARTTLS).

Проанализируем природу проблемы: почтовые сервера Office 365 (smtp.office365.com) принимают подключения по портам 587 или 25 строго в соответствии с RFC 3207. Это означает, что клиент сначала обязан установить обычное текстовое TCP-соединение, затем подать команду STARTTLS, и только после подтверждения сервера инициировать процедуру рукопожатия TLS. В отличие от стандартного порта 465 (где шифруется абсолютно весь трафик с момента открытия сокета), попытка установить прямое SSL-соединение на порт 587 приводит к зависанию или разрыву по таймауту.

Разберем основные варианты решения этой задачи: от штатной настройки объектов платформы 1С до использования внешних утилит, скриптов и протоколов.

Вариант 1. Отправка писем через PowerShell и .NET (System.Net.Mail)

Если требуется гарантированно и быстро отправить сообщение в обход ограничений встроенного клиента 1С, рассмотрим вариант с вызовом внешнего скрипта PowerShell. Класс System.Net.Mail.SmtpClient платформы .NET полноценно и корректно реализует механизм STARTTLS при включении свойства EnableSsl на порту 587.

Посмотрим на пример формирования и запуска PowerShell-команды из кода 1С:


КомандаСкрипта = "powershell.exe -NoProfile -ExecutionPolicy Bypass -Command """ +
    "[System.Reflection.Assembly]::LoadWithPartialName('System.Net') | Out-Null; " +
    "$ОтКого = 'Admin@company.onmicrosoft.com'; " +
    "$Кому = 'user@company.com'; " +
    "$Сообщение = New-Object System.Net.Mail.MailMessage ($ОтКого, $Кому); " +
    "$Сообщение.Subject = 'Расчетный листок за месяц'; " +
    "$Сообщение.Body = 'Добрый день. Ваш расчетный листок во вложении.'; " +
    "$SMTPКлиент = New-Object System.Net.Mail.SmtpClient ('smtp.office365.com', 587); " +
    "$SMTPКлиент.Credentials = New-Object System.Net.NetworkCredential('Admin@company.onmicrosoft.com', 'ВашПароль'); " +
    "$SMTPКлиент.EnableSsl = $true; " +
    "$SMTPКлиент.Send($Сообщение);""";

ЗапуститьПриложение(КомандаСкрипта, , Истина, КодВозврата);

Если КодВозврата <> 0 Тогда
    ВызватьИсключение "Ошибка отправки письма через PowerShell. Код возврата: " + КодВозврата;
КонецЕсли;

Этот способ позволяет оперативно наладить отправку сообщений, передавая параметры адресатов, тему и пути к файлам вложений через параметры вызова.

Вариант 2. Проксирование трафика через утилиту stunnel с директивой protocol = smtp

Существует распространенное заблуждение, что SSL-прокси stunnel не поддерживает явное шифрование. Это не так: утилита имеет встроенный механизм согласования STARTTLS для протокола SMTP.

Разберем по шагам схему работы:

  1. 1С подключается к локальному порту stunnel (например, 127.0.0.1:2525) по обычному открытому протоколу без SSL.
  2. stunnel соединяется с smtp.office365.com:587, самостоятельно отправляет команду STARTTLS, поднимает защищенный канал TLS 1.2+ и прозрачно шифрует весь дальнейший обмен данными.

Для настройки отредактируем файл конфигурации stunnel.conf:


[smtp-o365]
client = yes
accept = 127.0.0.1:2525
connect = smtp.office365.com:587
protocol = smtp
sslVersion = TLSv1.2

Обратим внимание на директиву protocol = smtp: именно она активирует режим Explicit TLS со стороны клиента. В конфигурации 1С параметры объекта ИнтернетПочтовыйПрофиль настраиваются следующим образом:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "127.0.0.1";
Профиль.ПортSMTP = 2525;
Профиль.ПользовательSMTP = "Admin@company.onmicrosoft.com";
Профиль.ПарольSMTP = "ВашПароль";
Профиль.ИспользоватьSSLSMTP = Ложь;

Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.SMTP);
Почта.Послать(Письмо);
Почта.Отключиться();

Вариант 3. Особенности штатного объекта 1С ИнтернетПочта

Проанализируем работу встроенного механизма 1С при прямой отправке. Для успешного соединения напрямую с smtp.office365.com необходимо учитывать несколько ключевых нюансов платформы:

  1. Режим совместимости: В старых версиях платформы или конфигурациях с включенным режимом совместимости (8.2, ранние версии 8.3) согласование STARTTLS на уровне сокета может работать некорректно.
  2. Свойство ИспользоватьSSLSMTP: Для портов явного шифрования (587) принудительная установка Профиль.ИспользоватьSSLSMTP = Истина может заставить платформу ожидать Implicit SSL, что приведет к ошибке. Если сервер инициирует STARTTLS, платформа современных релизов выполняет согласование автоматически, если шифрование не навязывается жестко на транспортном уровне сокета.
  3. Протоколы ОС: Почтовые сервисы Microsoft блокируют устаревшие версии протоколов SSLv3, TLS 1.0 и TLS 1.1. Сервер, на котором развернут кластер 1С, должен поддерживать протокол TLS 1.2 на уровне криптопровайдера Windows / Linux.

Вариант 4. Настройка локального SMTP-релея (Relay)

Для массовых рассылок (например, расчетных листков сотням сотрудников) прямое подключение из 1С к облачному серверу создает значительные задержки. Рекомендуется развернуть локальную службу релея (IIS SMTP Service на Windows Server или Postfix на Linux):

  1. 1С отправляет все письма локально на localhost:25 моментально и без задержек на шифрование.
  2. Локальный релей помещает сообщения в очередь и передает их в Exchange Online по настроенному коннектору через безопасный канал TLS.
  3. В центре администрирования Exchange Online создается входящий коннектор (Inbound Connector) с привязкой к статическому публичному IP-адресу вашей организации, что исключает блокировки по лимитам авторизации.

Вариант 5. Использование Microsoft Graph API (REST)

В современных политиках безопасности Microsoft всё чаще отключается базовая аутентификация (Basic Auth) для SMTP AUTH в пользу протокола OAuth 2.0. Альтернативным и наиболее стабильным архитектурным решением является отправка почты через Microsoft Graph API с использованием стандартного объекта 1С HTTPСоединение.

Такой подход полностью исключает проблемы с портами SMTP, таймаутами STARTTLS и блокировками протоколов передачи, так как весь обмен выполняется по стандартному HTTPS-протоколу через метод POST https://graph.microsoft.com/v1.0/users/{id}/sendMail.

← На главную