Как исправить ошибку «Сервис отключен с разрывом канала (SMTP error code 421)» при отправке почты из 1С?

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

При настройке рассылок или уведомлений из системы 1С программисты часто сталкиваются с ситуацией, когда код, успешно работающий с публичными сервисами (например, Mail.ru), отказывается функционировать в корпоративной среде с сервером MS Exchange. Ошибка SMTP error code 421 сигнализирует о том, что почтовый сервер принудительно разорвал соединение. Давайте подробно разберем, почему это происходит и как настроить систему для стабильной работы.

Анализируем природу ошибки 421

Код ответа 421 относится к категории временных ошибок (Transient Negative Completion). Он означает Service not available, closing transmission channel. В контексте работы с 1С это чаще всего указывает на то, что сервер защиты или сам почтовый агент (MTA) посчитал действия программы подозрительными или превышающими установленные лимиты. Разберем основные причины по шагам.

Причина 1: Ограничение интенсивности отправки (MessageRateLimit) в MS Exchange

Самая распространенная ситуация при работе с внутренним сервером MS Exchange — это срабатывание защиты от спама. По умолчанию сервер ограничивает количество писем, которые один клиент (IP-адрес) может отправить в минуту. Если ваша обработка в 1С пытается отправить, например, 60 писем подряд, сервер может оборвать канал на 51-м сообщении.

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


ИнПр = Новый ИнтернетПочтовыйПрофиль;
ИнПр.АдресСервераSMTP = "exchange.company.ru";
ИнПр.ПортSMTP = 25;
ИнПр.ПользовательSMTP = "robot@company.ru";
ИнПр.ПарольSMTP = "password";
ИнПр.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
ИнПр.Таймаут = 30;

Если при выполнении метода Соед.Послать(Письмо) в цикле возникает ошибка 421, необходимо проверить настройки коннектора получения на стороне сервера Exchange. Рассмотрим, как это сделать с помощью Exchange Management Shell.

Сначала проверим текущие лимиты для всех коннекторов:

Get-ReceiveConnector | fl name, MessageRatelimit

Если вы видите низкое значение (например, 5 или 20), это и есть причина разрыва канала. Чтобы снять ограничения для внутренних рассылок, можно установить безлимитный режим для конкретного коннектора:

Set-ReceiveConnector "ИмяСервера\ИмяКоннектора" -MessageRateLimit unlimited

Причина 2: Использование выделенного коннектора для сервера 1С

Простое снятие лимитов на общих коннекторах может быть небезопасным. Правильным подходом будет создание отдельного коннектора получения специально для IP-адреса сервера 1С. Рассмотрим рекомендации системных администраторов:

  1. Создайте новый коннектор на сервере Exchange.
  2. В настройках области действия (Scoping) укажите только IP-адрес вашего сервера 1С.
  3. В настройках аутентификации разрешите Externally Secured (если 1С отправляет почту без логина/пароля внутри сети) или настройте стандартную проверку.
  4. Для этого коннектора установите высокий параметр MessageRateLimit.

Причина 3: Параметр TarpitInterval и задержки ответов

Выясним еще одну тонкую настройку Exchange — TarpitInterval. Это механизм, который намеренно задерживает ответ сервера на команды SMTP, если он подозревает, что отправитель — спам-бот. Если 1С отправляет письма быстро, а сервер отвечает с задержкой в 5 секунд на каждое RCPT TO, объект ИнтернетПочта может закрыть соединение по внутреннему таймауту, либо сервер сам разорвет связь.

Проверим значение этого параметра:

Get-ReceiveConnector "ИмяКоннектора" | select TarpitInterval

Для надежной работы автоматизированных рассылок рекомендуется установить этот интервал в значение 00:00:00.

Причина 4: Специфика работы с публичными сервисами (Mail.ru, Rambler)

Если ошибка 421 возникает при работе с внешними сервисами через Интернет, причина чаще всего кроется в безопасности учетной записи. Рассмотрим современные требования Mail.ru и Rambler. Обычный пароль от почтового ящика в коде 1С больше не работает.

Выполним следующие действия для исправления:

  1. Зайдите в настройки безопасности почтового ящика через веб-интерфейс.
  2. Найдите раздел "Пароли для внешних приложений".
  3. Сгенерируйте специальный пароль для 1С (это длинный код из 16 символов).
  4. Используйте этот код в свойстве ИнПр.ПарольSMTP.
  5. Убедитесь, что используете правильный порт (465 для SSL) и включили шифрование:

Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "my_mail@mail.ru";
Профиль.ПарольSMTP = "тот_самый_пароль_приложения";

Причина 5: Антивирусная проверка трафика

Проанализируем ситуацию, когда настройки сервера верны, но ошибка сохраняется. Часто виновником выступает антивирус (например, Avast, Касперский или встроенные средства защиты Windows), установленный на сервере 1С. Функция "Экран почты" перехватывает исходящий трафик по портам 25, 465 или 587.

Когда 1С отправляет большой пакет данных (письмо с вложением), антивирус блокирует поток для сканирования. Почтовый сервер, не получая данных в течение определенного времени, принудительно закрывает сессию с кодом 421. Для решения проблемы попробуйте добавить процессы rphost.exe (для серверной версии) или 1cv8.exe (для файловой) в исключения антивируса.

Причина 6: Сетевые настройки и MTU

В редких случаях ошибка вызвана некорректным размером MTU (Maximum Transmission Unit) в сетевом канале между 1С и почтовым сервером. Если пакет данных превышает размер, допустимый на каком-либо промежуточном узле (особенно актуально для VPN-туннелей), соединение будет "зависать" на этапе передачи тела письма и обрываться сервером по таймауту сессии. Попробуйте проконсультироваться с сетевым администратором для проверки фрагментации пакетов.

Рекомендации по написанию надежного кода в 1С

Чтобы избежать "зависания" сессий и корректно обрабатывать ошибку 421, придерживайтесь следующих правил при написании модулей рассылки:

  1. Не подключайтесь в цикле: Вызывайте метод Подключиться() один раз перед началом цикла отправки.
  2. Используйте паузы: Если сервер имеет жесткие лимиты, добавьте небольшую задержку (Приостановить(1)) между письмами.
  3. Корректное завершение: Всегда вызывайте Отключиться() в блоке Наконец или при возникновении ошибки, чтобы освободить слот подключения на сервере.

Рассмотрим пример правильной структуры кода:


Почта = Новый ИнтернетПочта;
Попытка
    Почта.Подключиться(Профиль);
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Для Каждого Письмо Из МассивПисем Цикл
    Попытка
        Почта.Послать(Письмо);
    Исключение
        // Здесь ловим 421 ошибку
        Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
        Прервать; 
    КонецПопытки;
КонецЦикла;

Почта.Отключиться();

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

← На главную