При интеграции механизмов отправки почты из 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. Класс 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. Код возврата: " + КодВозврата;
КонецЕсли;
Этот способ позволяет оперативно наладить отправку сообщений, передавая параметры адресатов, тему и пути к файлам вложений через параметры вызова.
Существует распространенное заблуждение, что SSL-прокси stunnel не поддерживает явное шифрование. Это не так: утилита имеет встроенный механизм согласования STARTTLS для протокола SMTP.
Разберем по шагам схему работы:
127.0.0.1:2525) по обычному открытому протоколу без SSL.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);
Почта.Послать(Письмо);
Почта.Отключиться();
Проанализируем работу встроенного механизма 1С при прямой отправке. Для успешного соединения напрямую с smtp.office365.com необходимо учитывать несколько ключевых нюансов платформы:
Профиль.ИспользоватьSSLSMTP = Истина может заставить платформу ожидать Implicit SSL, что приведет к ошибке. Если сервер инициирует STARTTLS, платформа современных релизов выполняет согласование автоматически, если шифрование не навязывается жестко на транспортном уровне сокета.Для массовых рассылок (например, расчетных листков сотням сотрудников) прямое подключение из 1С к облачному серверу создает значительные задержки. Рекомендуется развернуть локальную службу релея (IIS SMTP Service на Windows Server или Postfix на Linux):
localhost:25 моментально и без задержек на шифрование.В современных политиках безопасности 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.