Как отправить электронную почту с поддержкой TLS/SSL из обычных форм 1С 8.2?

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

При работе с устаревшими конфигурациями на базе обычных форм (например, 1С:Управление торговлей 10.3) программисты часто сталкиваются с невозможностью отправки писем через современные почтовые сервисы, такие как Microsoft Office 365, Google или Mail.ru. Проблема проявляется в виде ошибки: SMTP error code 451 5.7.3 STARTTLS is required to send mail. Выясним причину этой ситуации и разберем подробные сценарии ее решения.

Почему возникает ошибка STARTTLS в старых версиях 1С?

Проанализируем техническую сторону вопроса. Платформа 1С:Предприятие версии 8.2 и ранние релизы 8.3 (работающие в режиме совместимости с 8.2) используют встроенный объект ИнтернетПочта, который нативно не поддерживает протокол шифрования TLS (Transport Layer Security) версии 1.2 и выше. Современные почтовые серверы из соображений безопасности давно отказались от работы по незащищенным каналам.

Рассмотрим ситуацию: вы указываете в коде ИспользоватьSSLIMAP = Истина или пытаетесь менять порты, но объект ИнтернетПочтовыйПрофиль все равно не может инициировать защищенное соединение на этапе SMTP-авторизации. Это происходит потому, что в старой архитектуре платформы методы работы с SSL/TLS были жестко ограничены. Посмотрим, как мы можем обойти это ограничение, используя системные возможности Windows и альтернативные подходы.

Решение 1: Использование системного объекта CDO.Message (COM-объект Windows)

Одним из самых надежных способов отправки почты в обход ограничений платформы 1С является использование библиотеки Collaboration Data Objects (CDO), которая встроена в операционную систему Windows. Этот объект умеет работать с TLS и корректно передавать данные на сервер Outlook или Gmail.

Разберем по шагам, как реализовать отправку через CDO в программном коде 1С:


// Создаем основные объекты CDO
Письмо = Новый COMОбъект("CDO.Message");
Конфигурация = Новый COMОбъект("CDO.Configuration");

// Устанавливаем параметры конфигурации
Схема = "http://schemas.microsoft.com/cdo/configuration/";
Поля = Конфигурация.Fields;

// 1 - отправка через локальный SMTP, 2 - через удаленный
Поля.Item(Схема + "sendusing").Value = 2; 
Поля.Item(Схема + "smtpserver").Value = "outlook.office365.com";
Поля.Item(Схема + "smtpserverport").Value = 587; // Порт для TLS
Поля.Item(Схема + "smtpauthenticate").Value = 1; // Тип аутентификации (обычная)
Поля.Item(Схема + "sendusername").Value = "your_login@outlook.com";
Поля.Item(Схема + "sendpassword").Value = "your_password";
Поля.Item(Схема + "smtpusessl").Value = Истина; // Включаем шифрование

Поля.Update();

// Настраиваем параметры самого письма
Письмо.Configuration = Конфигурация;
Письмо.From = "your_login@outlook.com";
Письмо.To = "recipient@mail.ru";
Письмо.Subject = "Тестовое сообщение из 1С через CDO";
Письмо.TextBody = "Текст вашего сообщения";

// Если нужно добавить вложение:
// Письмо.AddAttachment("C:\temp\report.pdf");

Попытка
    Письмо.Send();
    Сообщить("Письмо успешно отправлено!");
Исключение
    Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;

Важно помнить: при использовании Office 365 или Gmail обычного пароля от учетной записи может быть недостаточно, если включена двухфакторная аутентификация. В этом случае необходимо создать в личном кабинете почтового сервиса специальный "Пароль приложения".

Решение 2: Использование утилиты Stunnel (SSL-туннелирование)

Проанализируем ситуацию, когда мы не хотим переписывать код во всех модулях системы. В этом случае нам поможет утилита Stunnel. Она выступает в роли локального прокси-сервера: 1С отправляет письмо на localhost без шифрования, а Stunnel "оборачивает" трафик в SSL/TLS и пересылает его реальному почтовому серверу.

Рассмотрим алгоритм настройки этого метода:

  1. Скачиваем и устанавливаем Stunnel на сервер (или клиентский ПК).
  2. В файле конфигурации stunnel.conf прописываем секцию для SMTP:
    
    [smtp-tls]
    client = yes
    accept = 127.0.0.1:25
    connect = outlook.office365.com:587
    protocol = smtp
    
  3. В коде 1С в объекте ИнтернетПочтовыйПрофиль указываем:
    • АдресСервераSMTP = "127.0.0.1"
    • ПортSMTP = 25
    • Шифрование SSL в самой 1С отключаем (оно будет добавлено утилитой).

Этот "костылевариант" хорош тем, что он требует минимального вмешательства в конфигурацию 1С и позволяет использовать стандартный объект ИнтернетПочта.

Решение 3: Отправка через PowerShell

Современные версии Windows имеют встроенный инструмент PowerShell, который отлично справляется с задачами сетевого взаимодействия. Мы можем вызвать скрипт PowerShell прямо из 1С, передав ему параметры письма.

Посмотрим на пример формирования такой команды:


ТекстСкрипта = "
$EmailFrom = 'my@outlook.com'
$EmailTo = 'client@gmail.com'
$Subject = 'Тема письма'
$Body = 'Текст сообщения'
$SMTPServer = 'outlook.office365.com'
$SMTPClient = New-Object Net.Mail.SmtpClient($SMTPServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential('my@outlook.com', 'password');
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
";

// Сохраняем скрипт во временный файл .ps1 или запускаем напрямую
КомандаЗапуска = "powershell -ExecutionPolicy Bypass -Command  ""& {" + ТекстСкрипта + "}""";
ЗапуститьПриложение(КомандаЗапуска, , Истина);

Использование ЗапуститьПриложение с параметром ОжидатьЗавершения = Истина позволяет нам контролировать процесс отправки. Это наиболее современный подход для систем, где установка стороннего ПО (типа Stunnel) запрещена политиками безопасности.

Решение 4: Использование внешних консольных утилит (SendEmail)

Существует проверенная временем крошечная утилита SendEmail.exe (не путать с одноименными аналогами). Она поддерживает TLS и позволяет отправлять письма одной строкой команды.

Разберем пример вызова:


ПутьКУтилите = "C:\tools\sendEmail.exe";
Параметры = "-f my@outlook.com -t recipient@mail.ru -u 'Тема' -m 'Текст письма' -s outlook.office365.com:587 -o tls=yes -xu my@outlook.com -xp my_password";

ЗапуститьПриложение(ПутьКУтилите + " " + Параметры, , Истина);

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

Важные настройки на стороне почтовых сервисов

Даже самый правильный код может не сработать, если почтовый сервис блокирует внешние подключения. Выясним, на что нужно обратить внимание:

  1. SMTP AUTH: В консоли администрирования Microsoft 365 (Admin Center) необходимо зайти в настройки активных пользователей, выбрать нужный ящик и в разделе "Почтовые приложения" (Mail apps) убедиться, что галочка "Authenticated SMTP" включена.
  2. Разрешение доступа менее защищенным приложениям: Для Gmail необходимо либо включить эту опцию (устаревает), либо использовать пароли приложений.
  3. Брандмауэр: Убедитесь, что порты 587 и 465 открыты на вашем сервере для исходящих соединений.

Подведем итоги

Мы проанализировали проблему отсутствия TLS в 1С 8.2 и рассмотрели четыре различных способа ее решения. Для долгосрочной стабильной работы рекомендуем использовать CDO или PowerShell, так как они используют системные библиотеки Windows и не требуют установки дополнительного программного обеспечения. Если же требуется максимально быстрое решение без изменения логики формирования писем в коде — выбирайте Stunnel.

Совместное использование этих инструментов позволит вашей доработанной УТ 10.3 успешно взаимодействовать с любыми современными почтовыми серверами, обеспечивая надежную доставку уведомлений и документов вашим клиентам.

← На главную