При выполнении массовой рассылки писем из конфигурации «1С:Управление торговлей» (или совмещенных решений, таких как «БИТ.CRM») часто возникает ситуация, когда отправка первых нескольких писем проходит успешно, но затем процесс прерывается с ошибкой «Ошибка отправки SMTP. Превышено количество попыток отправки». Проанализируем причины этой проблемы и разберем практические варианты её решения.
Рассмотрим, почему почтовый сервер или промежуточные сервисы начинают отклонять отправку сообщений после успешного старта:
ИнтернетПочта: Если рассылка 3000 писем выполняется в одном едином цикле через одно непрерывное TCP-соединение, почтовый сервер разрывает связь по таймауту или при превышении порога допустимых операций.В модуле «БИТ.CRM» существует штатный инструмент «Задания на рассылку», который из коробки умеет делить сообщения на порции и делать паузы между сериями писем. Однако стандартный интерфейс может не содержать удобного отбора контрагентов, из-за чего адресатов приходится добавлять вручную.
Рассмотрим наиболее эффективное решение этой проблемы без изменения основной конфигурации — создание внешнего расширения или обработки, которая заполняет табличную часть адресатов по произвольному отбору из УТ. В этом случае мы используем штатный механизм отправки с задержками, избавляя пользователей от рутинного ввода.
Если рассылка выполняется стандартными средствами 1С через объект ИнтернетПочта, организуем отправку сообщения порциями с обязательным закрытием соединения и паузой между блоками. Это позволяет обнулить счетчик команд SMTP-сессии на сервере.
Разберем пример кода, где отправка разбивается на пачки с паузой с помощью функции Приостановить():
// Пример логики отправки сообщений порциями
Профиль = Новый ИНТЕРНЕТПочтовыйПрофиль;
// Заполнение параметров профиля (SMTP-сервер, порт, логин, пароль)
Почта = Новый ИнтернетПочта;
Счетчик = 0;
РазмерПакета = 15; // Отправляем по 15 писем за сессию
Для Каждого Письмо Из МассивПисем Цикл
// Подключаемся к серверу перед началом пачки
Если НЕ Почта.Подключено() Тогда
Почта.Подключить(Профиль);
КонецЕсли;
Почта.Послать(Письмо);
Счетчик = Счетчик + 1;
// При достижении лимита пачки закрываем сессию и делаем паузу
Если Счетчик % РазмерПакета = 0 Тогда
Почта.Отключиться();
Приостановить(5); // Пауза 5 секунд
КонецЕсли;
КонецЦикла;
Если Почта.Подключено() Тогда
Почта.Отключиться();
КонецЕсли;
Для исключения зависаний пользовательского сеанса и жесткого контроля частоты отправки организуем очередь сообщений. Разберем по шагам, как устроена такая схема:
Такой подход полностью снимает проблему блокировок по IP и позволяет отправлять тысячи писем постепенно, в фоновом режиме.
Если менять программный код в 1С нежелательно, можно переложить задачу управления очередью на сетевую инфраструктуру: