При работе с устаревшими конфигурациями на базе обычных форм (например, 1С:Управление торговлей 10.3) программисты часто сталкиваются с невозможностью отправки писем через современные почтовые сервисы, такие как Microsoft Office 365, Google или Mail.ru. Проблема проявляется в виде ошибки: SMTP error code 451 5.7.3 STARTTLS is required to send mail. Выясним причину этой ситуации и разберем подробные сценарии ее решения.
Проанализируем техническую сторону вопроса. Платформа 1С:Предприятие версии 8.2 и ранние релизы 8.3 (работающие в режиме совместимости с 8.2) используют встроенный объект ИнтернетПочта, который нативно не поддерживает протокол шифрования TLS (Transport Layer Security) версии 1.2 и выше. Современные почтовые серверы из соображений безопасности давно отказались от работы по незащищенным каналам.
Рассмотрим ситуацию: вы указываете в коде ИспользоватьSSLIMAP = Истина или пытаетесь менять порты, но объект ИнтернетПочтовыйПрофиль все равно не может инициировать защищенное соединение на этапе SMTP-авторизации. Это происходит потому, что в старой архитектуре платформы методы работы с SSL/TLS были жестко ограничены. Посмотрим, как мы можем обойти это ограничение, используя системные возможности 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 обычного пароля от учетной записи может быть недостаточно, если включена двухфакторная аутентификация. В этом случае необходимо создать в личном кабинете почтового сервиса специальный "Пароль приложения".
Проанализируем ситуацию, когда мы не хотим переписывать код во всех модулях системы. В этом случае нам поможет утилита Stunnel. Она выступает в роли локального прокси-сервера: 1С отправляет письмо на localhost без шифрования, а Stunnel "оборачивает" трафик в SSL/TLS и пересылает его реальному почтовому серверу.
Рассмотрим алгоритм настройки этого метода:
stunnel.conf прописываем секцию для SMTP:
[smtp-tls]
client = yes
accept = 127.0.0.1:25
connect = outlook.office365.com:587
protocol = smtp
ИнтернетПочтовыйПрофиль указываем:
АдресСервераSMTP = "127.0.0.1"ПортSMTP = 25Этот "костылевариант" хорош тем, что он требует минимального вмешательства в конфигурацию 1С и позволяет использовать стандартный объект ИнтернетПочта.
Современные версии 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) запрещена политиками безопасности.
Существует проверенная временем крошечная утилита 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";
ЗапуститьПриложение(ПутьКУтилите + " " + Параметры, , Истина);
Преимущество: утилита не требует установки, достаточно просто положить исполняемый файл в сетевую папку или в каталог базы данных.
Даже самый правильный код может не сработать, если почтовый сервис блокирует внешние подключения. Выясним, на что нужно обратить внимание:
Мы проанализировали проблему отсутствия TLS в 1С 8.2 и рассмотрели четыре различных способа ее решения. Для долгосрочной стабильной работы рекомендуем использовать CDO или PowerShell, так как они используют системные библиотеки Windows и не требуют установки дополнительного программного обеспечения. Если же требуется максимально быстрое решение без изменения логики формирования писем в коде — выбирайте Stunnel.
Совместное использование этих инструментов позволит вашей доработанной УТ 10.3 успешно взаимодействовать с любыми современными почтовыми серверами, обеспечивая надежную доставку уведомлений и документов вашим клиентам.