При переходе конфигураций с платформы 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");
Сообщение.Тема = "Тестовое сообщение";
Сообщение.Тексты.Добавить("Проверка отправки: " + ТекущаяДата(), ТипТекстаПочтовогоСообщения.ПростойТекст);
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
При выполнении метода Послать() возникает ошибка отсутствия адреса сервера. Проанализируем причину такого поведения. Текст ошибки является следствием того, что внутреннее сетевое соединение с почтовым сервером было аварийно разорвано еще на этапе согласования параметров сессии. Объект ИнтернетПочта теряет контекст соединения и возвращает общую неинформативную ошибку.
Выясним, что происходит на сетевом уровне при взаимодействии 1С и почтового сервера:
EHLO.STARTTLS.ИспользоватьSSLSMTP установлено значение Ложь. Свойство ИспользоватьSSLSMTP отвечает исключительно за неявный SSL (Implicit SSL/SMTPS, порт 465), но не блокирует явный переход на TLS поверх открытого порта 25.Рассмотрим самое простое административное решение, если отправка выполняется внутри доверенной корпоративной сети. Администратор почтового сервиса может отключить выдачу команды STARTTLS в списке возможностей (capabilities) для внутренних клиентов или определенных IP-адресов.
Когда сервер в ответ на EHLO перестает возвращать строку 250 STARTTLS, платформа 1С 8.3 не пытается переключиться на защищенный канал и успешно передает команды авторизации (AUTH LOGIN или AUTH PLAIN) и само письмо в открытом виде.
Если отключить STARTTLS на сервере невозможно или требуется сохранить шифрование канала, необходимо обеспечить успешное прохождение валидации TLS-сертификата платформой 1С. Разберем по шагам, как настроить доверие к сертификату на сервере, где выполняется код 1С:
.cer / .crt и импортируем его в системное хранилище «Доверенные корневые центры сертификации» (Trusted Root Certification Authorities) учетной записи локального компьютера или пользователя, от имени которого запущена служба сервера 1С:Предприятия (обычно usr1cv8)./usr/local/share/ca-certificates/ или /etc/pki/ca-trust/source/anchors/) и выполняем обновление хранилища командой update-ca-certificates или update-ca-trust.После установки доверия платформа успешно выполнит TLS-хэндшейк и отправит почту по зашифрованному каналу.
Если импорт сертификатов в систему затруднен, платформа 1С предоставляет штатный механизм отключения проверки валидности сертификатов для конкретных почтовых хостов через конфигурационный файл conf.cfg.
Рассмотрим порядок настройки:
conf.cfg в каталоге установки платформы (в подпапке conf каталога 1С:Предприятия).IgnoreInternetMailServerCertificateVerificationList, указав адрес нужного почтового сервера:
IgnoreInternetMailServerCertificateVerificationList=smtp.ukbp.lan
Если требуется указать несколько серверов, их имена перечисляются через точку с запятой. После сохранения изменений в файле платформа перестанет блокировать отправку писем при обнаружении несоответствий в TLS-сертификатах указанного узла.
Проанализируем альтернативный вариант, когда почтовый сервер поддерживает полноценное защищенное подключение. Вместо порта 25 с согласованием через STARTTLS надежнее сразу использовать выделенный порт SMTPS. Для этого в коде 1С достаточно скорректировать настройки профиля:
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Ложь;
В этом случае шифрование устанавливается с первого байта подключения, что исключает сбои протокола согласования открытого текста и TLS.
Если прямой доступ к почтовому серверу скорректировать нельзя, а перенастройка conf.cfg нежелательна, можно развернуть локальный промежуточный почтовый релей (на базе Postfix, встроенной службы IIS или утилиты stunnel). В этом случае 1С отправляет письмо на localhost:25 без авторизации и шифрования, а локальный сервис безопасно перенаправляет почту на целевой почтовый сервер организации.