Почему в 1С 8.3 возникает ошибка «Данная операция не может быть выполнена, так как адрес SMTP сервера не указан» при отправке почты без SSL?

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

При переходе конфигураций с платформы 1С:Предприятие 8.2 на 8.3 разработчики нередко сталкиваются с ситуацией, когда ранее работавший программный код отправки писем через локальный почтовый сервер перестает функционировать. При этом генерируется исключение, текст которого сбивает с толку: «Данная операция не может быть выполнена, так как адрес SMTP сервера не указан», хотя адрес сервера в свойствах профиля задан корректно.

Разберем, почему возникает такое поведение платформы, как устроена работа объекта ИнтернетПочта при взаимодействии с современными почтовыми серверами и какие существуют способы решения данной проблемы.

Анализ типового сценария ошибки

Посмотрим на пример стандартного кода отправки почтового сообщения, который вызывает сбой на платформе 8.3:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.ukbp.lan";
Профиль.ПортSMTP = 25;
Профиль.ПользовательSMTP = "helpdesk";
Профиль.ПарольSMTP = "1234";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.Таймаут = 90;

Почта = Новый ИнтернетПочта;

Попытка
    Почта.Подключиться(Профиль);
    
    Сообщение = Новый ИнтернетПочтовоеСообщение;
    Сообщение.Отправитель = "helpdesk@ukbp.lan";
    Сообщение.Получатели.Добавить("abc@ukbp.lan");
    Сообщение.Тема = "Тестовое сообщение";
    Сообщение.Тексты.Добавить("Проверка отправки: " + ТекущаяДата(), ТипТекстаПочтовогоСообщения.ПростойТекст);
    
    Почта.Послать(Сообщение);
    Почта.Отключиться();
Исключение
    Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;

При выполнении метода Послать() возникает ошибка отсутствия адреса сервера. Проанализируем причину такого поведения. Текст ошибки является следствием того, что внутреннее сетевое соединение с почтовым сервером было аварийно разорвано еще на этапе согласования параметров сессии. Объект ИнтернетПочта теряет контекст соединения и возвращает общую неинформативную ошибку.

Механизм возникновения проблемы: поведение STARTTLS в платформе 8.3

Выясним, что происходит на сетевом уровне при взаимодействии 1С и почтового сервера:

  1. Клиент 1С подключается к SMTP-серверу по стандартному порту 25 и отправляет команду приветствия EHLO.
  2. В ответ почтовый сервер возвращает список поддерживаемых расширений, среди которых присутствует команда STARTTLS.
  3. Платформа 1С 8.3 по умолчанию работает в режиме так называемого Opportunistic TLS. Если сервер сообщает о поддержке шифрования, платформа автоматически пытается повысить уровень безопасности и инициирует защищенное TLS-рукопожатие, даже если в свойстве ИспользоватьSSLSMTP установлено значение Ложь. Свойство ИспользоватьSSLSMTP отвечает исключительно за неявный SSL (Implicit SSL/SMTPS, порт 465), но не блокирует явный переход на TLS поверх открытого порта 25.
  4. Если почтовый сервер использует самоподписанный (self-signed) сертификат, либо сертификат с истекшим сроком или несовпадающим именем узла (CN/SAN), встроенный механизм валидации сертификатов платформы 1С 8.3 отклоняет такое соединение и немедленно сбрасывает TCP-сокет.

Способ 1. Отключение анонсирования STARTTLS на стороне почтового сервера

Рассмотрим самое простое административное решение, если отправка выполняется внутри доверенной корпоративной сети. Администратор почтового сервиса может отключить выдачу команды STARTTLS в списке возможностей (capabilities) для внутренних клиентов или определенных IP-адресов.

Когда сервер в ответ на EHLO перестает возвращать строку 250 STARTTLS, платформа 1С 8.3 не пытается переключиться на защищенный канал и успешно передает команды авторизации (AUTH LOGIN или AUTH PLAIN) и само письмо в открытом виде.

Способ 2. Добавление сертификата почтового сервера в доверенные

Если отключить STARTTLS на сервере невозможно или требуется сохранить шифрование канала, необходимо обеспечить успешное прохождение валидации TLS-сертификата платформой 1С. Разберем по шагам, как настроить доверие к сертификату на сервере, где выполняется код 1С:

  1. Для ОС Windows: Экспортируем корневой или самоподписанный сертификат почтового сервера в формате .cer / .crt и импортируем его в системное хранилище «Доверенные корневые центры сертификации» (Trusted Root Certification Authorities) учетной записи локального компьютера или пользователя, от имени которого запущена служба сервера 1С:Предприятия (обычно usr1cv8).
  2. Для ОС Linux: Помещаем файл сертификата в директорию доверенных сертификатов дистрибутива (например, /usr/local/share/ca-certificates/ или /etc/pki/ca-trust/source/anchors/) и выполняем обновление хранилища командой update-ca-certificates или update-ca-trust.

После установки доверия платформа успешно выполнит TLS-хэндшейк и отправит почту по зашифрованному каналу.

Способ 3. Отключение проверки сертификатов через conf.cfg

Если импорт сертификатов в систему затруднен, платформа 1С предоставляет штатный механизм отключения проверки валидности сертификатов для конкретных почтовых хостов через конфигурационный файл conf.cfg.

Рассмотрим порядок настройки:

  1. Находим файл conf.cfg в каталоге установки платформы (в подпапке conf каталога 1С:Предприятия).
  2. Добавляем параметр IgnoreInternetMailServerCertificateVerificationList, указав адрес нужного почтового сервера:

IgnoreInternetMailServerCertificateVerificationList=smtp.ukbp.lan

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

Способ 4. Переход на явный порт SMTPS (порт 465)

Проанализируем альтернативный вариант, когда почтовый сервер поддерживает полноценное защищенное подключение. Вместо порта 25 с согласованием через STARTTLS надежнее сразу использовать выделенный порт SMTPS. Для этого в коде 1С достаточно скорректировать настройки профиля:


Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;

В этом случае шифрование устанавливается с первого байта подключения, что исключает сбои протокола согласования открытого текста и TLS.

Способ 5. Использование локального SMTP-релея

Если прямой доступ к почтовому серверу скорректировать нельзя, а перенастройка conf.cfg нежелательна, можно развернуть локальный промежуточный почтовый релей (на базе Postfix, встроенной службы IIS или утилиты stunnel). В этом случае 1С отправляет письмо на localhost:25 без авторизации и шифрования, а локальный сервис безопасно перенаправляет почту на целевой почтовый сервер организации.

← На главную