При настройке рассылок или уведомлений из системы 1С программисты часто сталкиваются с ситуацией, когда код, успешно работающий с публичными сервисами (например, Mail.ru), отказывается функционировать в корпоративной среде с сервером MS Exchange. Ошибка SMTP error code 421 сигнализирует о том, что почтовый сервер принудительно разорвал соединение. Давайте подробно разберем, почему это происходит и как настроить систему для стабильной работы.
Код ответа 421 относится к категории временных ошибок (Transient Negative Completion). Он означает Service not available, closing transmission channel. В контексте работы с 1С это чаще всего указывает на то, что сервер защиты или сам почтовый агент (MTA) посчитал действия программы подозрительными или превышающими установленные лимиты. Разберем основные причины по шагам.
Самая распространенная ситуация при работе с внутренним сервером 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
Простое снятие лимитов на общих коннекторах может быть небезопасным. Правильным подходом будет создание отдельного коннектора получения специально для IP-адреса сервера 1С. Рассмотрим рекомендации системных администраторов:
Externally Secured (если 1С отправляет почту без логина/пароля внутри сети) или настройте стандартную проверку.MessageRateLimit.Выясним еще одну тонкую настройку Exchange — TarpitInterval. Это механизм, который намеренно задерживает ответ сервера на команды SMTP, если он подозревает, что отправитель — спам-бот. Если 1С отправляет письма быстро, а сервер отвечает с задержкой в 5 секунд на каждое RCPT TO, объект ИнтернетПочта может закрыть соединение по внутреннему таймауту, либо сервер сам разорвет связь.
Проверим значение этого параметра:
Get-ReceiveConnector "ИмяКоннектора" | select TarpitInterval
Для надежной работы автоматизированных рассылок рекомендуется установить этот интервал в значение 00:00:00.
Если ошибка 421 возникает при работе с внешними сервисами через Интернет, причина чаще всего кроется в безопасности учетной записи. Рассмотрим современные требования Mail.ru и Rambler. Обычный пароль от почтового ящика в коде 1С больше не работает.
Выполним следующие действия для исправления:
ИнПр.ПарольSMTP.
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "my_mail@mail.ru";
Профиль.ПарольSMTP = "тот_самый_пароль_приложения";
Проанализируем ситуацию, когда настройки сервера верны, но ошибка сохраняется. Часто виновником выступает антивирус (например, Avast, Касперский или встроенные средства защиты Windows), установленный на сервере 1С. Функция "Экран почты" перехватывает исходящий трафик по портам 25, 465 или 587.
Когда 1С отправляет большой пакет данных (письмо с вложением), антивирус блокирует поток для сканирования. Почтовый сервер, не получая данных в течение определенного времени, принудительно закрывает сессию с кодом 421. Для решения проблемы попробуйте добавить процессы rphost.exe (для серверной версии) или 1cv8.exe (для файловой) в исключения антивируса.
В редких случаях ошибка вызвана некорректным размером MTU (Maximum Transmission Unit) в сетевом канале между 1С и почтовым сервером. Если пакет данных превышает размер, допустимый на каком-либо промежуточном узле (особенно актуально для VPN-туннелей), соединение будет "зависать" на этапе передачи тела письма и обрываться сервером по таймауту сессии. Попробуйте проконсультироваться с сетевым администратором для проверки фрагментации пакетов.
Чтобы избежать "зависания" сессий и корректно обрабатывать ошибку 421, придерживайтесь следующих правил при написании модулей рассылки:
Подключиться() один раз перед началом цикла отправки.Приостановить(1)) между письмами.Отключиться() в блоке Наконец или при возникновении ошибки, чтобы освободить слот подключения на сервере.Рассмотрим пример правильной структуры кода:
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Для Каждого Письмо Из МассивПисем Цикл
Попытка
Почта.Послать(Письмо);
Исключение
// Здесь ловим 421 ошибку
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
Прервать;
КонецПопытки;
КонецЦикла;
Почта.Отключиться();
Следуя этим инструкциям, вы сможете эффективно диагностировать и устранить разрывы канала при отправке почты, обеспечив надежную доставку уведомлений из ваших решений на базе 1С.