Как исправить ошибку SMTP 421 при отправке почты из 1С:УПП в клиент-серверном режиме

Программист 1С v8.3 (Обычные формы)
← На главную

В процессе работы с конфигурацией Управление производственным предприятием (УПП) 1.3 на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда отправка почты отлично работает в фоновых заданиях, но выдает критическую ошибку при попытке пользователя отправить письмо интерактивно. Ошибка выглядит следующим образом: Ошибка при вызове метода контекста (Подключиться): Сервис отключен с разрывом канала (SMTP error code 421 SMTP connection broken (reply)).

В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем разницу в выполнении кода на клиенте и сервере, и внедрим надежное решение, которое позволит отправлять сообщения с вложениями без сбоев.

Выясняем причину: почему на сервере работает, а на клиенте — нет?

Разберем ситуацию: регламентное задание выполняется непосредственно на сервере 1С под учетной записью службы. Интерактивное же действие выполняется в контексте «толстого» или «тонкого» клиента на рабочей станции пользователя. Ошибка SMTP 421 сигнализирует о том, что почтовый сервер принудительно разорвал соединение. Рассмотрим основные причины такого поведения:

  1. Сетевые ограничения и файерволы: На компьютерах пользователей часто установлены антивирусы или системы защиты (например, Kaspersky Endpoint Security), которые блокируют или «прослушивают» порты 25, 465 или 587. Почтовый сервер может расценить такое вмешательство как некорректное и оборвать сессию.
  2. Различия в реализации SSL/TLS: Платформа 1С при выполнении кода на стороне клиента и на стороне сервера может использовать разные библиотеки для работы с защищенным соединением. Сервер 1С чаще всего настроен корректно для работы с протоколами TLS 1.2/1.3, в то время как клиентская машина может иметь устаревшие настройки безопасности Windows.
  3. Лимиты соединений: Почтовые серверы ограничивают количество одновременных подключений с одного IP-адреса. Если в компании используется терминальный сервер или единый шлюз, множество клиентских попыток могут блокироваться, в то время как одно серверное соединение проходит успешно.

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

Шаг 1: Перенос логики отправки в серверный модуль

Для начала рассмотрим, как изменить структуру вызовов. Если код отправки находится в общем модуле ЭлектроннаяПочта, нам нужно убедиться, что он выполняется именно на сервере. Рассмотрим по шагам:

Создадим новый общий модуль (например, ДополнительныеПроцедурыСервер) или отредактируем существующий. В свойствах модуля обязательно должны быть установлены флаги: Сервер и Вызов сервера. Флаг Клиент должен быть снят.

Вынесем процедуру подключения и отправки в этот модуль. Пример кода функции-обертки:


Функция ОтправитьСообщениеНаСервере(Профиль, Сообщение) Экспорт
    Почта = Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Сообщение);
        Почта.Отключиться();
        Возврат Истина;
    Исключение
        ЗаписьЖурналаРегистрации("Отправка почты", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
КонецФункции

Шаг 2: Решение проблемы с вложениями через временное хранилище

Просто вызвать серверную функцию из клиентской формы недостаточно, если в письме есть вложения. Если вы укажете путь к файлу типа C:\Users\Admin\Documents\Report.pdf, серверный код не сможет его найти, так как он будет искать файл на диске сервера, а не вашего компьютера.

Проанализируем правильный алгоритм передачи данных между клиентом и сервером:

  1. На клиенте считываем файл в объект ДвоичныеДанные.
  2. Помещаем эти данные во Временное хранилище и получаем уникальный адрес.
  3. Передаем этот адрес на сервер.
  4. На сервере извлекаем данные и добавляем их в объект ИнтернетПочтовоеСообщение.

Рассмотрим пример реализации на стороне клиента:


// Код в форме или клиентском модуле
ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла, УникальныйИдентификатор);

СтруктураВложения = Новый Структура;
СтруктураВложения.Вставить("Данные", АдресХранилища);
СтруктураВложения.Вставить("ИмяФайла", "Отчет.pdf");

// Вызываем наш серверный модуль
Результат = ДополнительныеПроцедурыСервер.ОтправитьПисьмоСВложениями(Профиль, Тема, Текст, Получатель, СтруктураВложения);

Теперь разберем, как сервер должен обработать это вложение:


Функция ОтправитьПисьмоСВложениями(Профиль, Тема, Текст, Получатель, СтруктураВложения) Экспорт
    Сообщение = Новый ИнтернетПочтовоеСообщение;
    Сообщение.Тема = Тема;
    Сообщение.Получатели.Добавить(Получатель);
    
    // Работа с текстом
    ТекстПисьма = Сообщение.Тексты.Добавить(Текст);
    ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
    
    // Извлекаем вложение из временного хранилища
    ДанныеИзХранилища = ПолучитьИзВременногоХранилища(СтруктураВложения.Данные);
    Если ТипЗнч(ДанныеИзХранилища) = Тип("ДвоичныеДанные") Тогда
        Сообщение.Вложения.Добавить(ДанныеИзХранилища, СтруктураВложения.ИмяФайла);
    КонецЕсли;

    // Далее подключаемся и отправляем через ИнтернетПочта
    // ...
КонецФункции

Шаг 3: Настройка защищенного соединения и таймаутов

Помимо переноса кода на сервер, стоит обратить внимание на параметры самого объекта ИнтернетПочтовыйПрофиль. Ошибка 421 часто возникает, если сервер ожидает шифрования, а клиент его не инициирует вовремя.

Рекомендуется явно указывать использование SSL и увеличивать время ожидания. Посмотрим на настройки для популярных сервисов:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "my@mail.ru";
Профиль.ПарольSMTP = "my_password";

// Важные параметры для стабильности:
Профиль.ИспользоватьЗащищенноеСоединениеSMTP = Истина;
Профиль.ТолькоЗащищеннаяАвторизацияSMTP = Ложь;
Профиль.ВремяОжидания = 120; // Увеличиваем до 2 минут

Важный нюанс: В некоторых случаях (особенно со старыми корпоративными почтовыми серверами) помогает метод "авторизация POP3 перед SMTP". Хотя это считается устаревшим, включение порта 110 и предварительное подключение по POP3 может "открыть" IP-адрес для отправки сообщений.

Заключение

Подведем итоги нашего исследования. Если вы столкнулись с ошибкой SMTP 421 в 1С:УПП, не спешите менять настройки совместимости всей конфигурации.

Основные правила стабильной отправки:

Следуя этим шагам, мы обеспечим надежную работу почтового модуля в клиент-серверной архитектуре 1С.

← На главную