Массовая рассылка почты из 1С — это задача, с которой сталкивается практически каждый разработчик при автоматизации бизнес-процессов. Однако стандартный подход «отправить в цикле» часто приводит к проблемам: рассылка прерывается на некорректном адресе, соединение с сервером разрывается, а бухгалтер не понимает, кто из контрагентов получил письмо, а кто нет. В этой статье мы подробно разберем, как построить отказоустойчивую систему отправки почты, актуальную для 2024 года.
Рассмотрим стандартную ситуацию: код перебирает список контрагентов и вызывает метод РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение. Если у одного из контрагентов адрес указан неверно (например, отсутствует символ @ или доменная точка), платформа может сгенерировать исключение. Если этот вызов не обернут в блок Попытка...Исключение, выполнение всего кода прекращается, и остальные 99 из 100 писем не уходят. Наша задача — сделать процесс непрерывным и информативным.
Первое, что мы должны сделать — проверить синтаксическую корректность адреса перед попыткой отправки. Это позволит отсечь заведомо ложные данные, не нагружая почтовый сервер. В конфигурациях на базе БСП (например, «Бухгалтерия предприятия 3.0») для этого есть готовый инструмент.
Проанализируем пример кода для проверки адреса:
// Используем стандартную функцию БСП
АдресЭлектроннойПочты = СтрокаКонтрагента.Email;
Если НЕ РаботаСАдресамиЭлектроннойПочты.АдресСоответствуетШаблону(АдресЭлектроннойПочты) Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Некорректный адрес у контрагента: " + СтрокаКонтрагента.Наименование);
Продолжить; // Переходим к следующему контрагенту
КонецЕсли;
Важный нюанс: функция АдресСоответствуетШаблону проверяет только формат записи (наличие @, допустимых символов и домена). Она не гарантирует, что такой ящик существует в реальности, но защищает от падения системы при попытке отправить письмо на «битую» строку.
Метод ИнтернетПочта.Послать() является основным для отправки сообщений. Однако программисты часто сталкиваются с тем, что он не возвращает ожидаемое «Соответствие» с ошибками. Выясним причину: современная спецификация SMTP позволяет серверам принимать письмо «условно», а сообщать об ошибке (например, переполнен ящик) уже после разрыва сессии в виде ответного письма (NDR).
Чтобы массовая рассылка не «падала», мы должны реализовать следующий алгоритм в цикле:
Попытка.Исключение анализировать состояние подключения.Рассмотрим программную реализацию повышенной надежности:
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Исключение
Сообщить("Ошибка подключения к серверу: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Для Каждого Письмо Из МассивПисем Цикл
// Перед каждой отправкой проверяем линк (доступно с 8.3.10)
Если НЕ Почта.ПроверитьВозможностьОтправки() Тогда
// Если связь разорвана сервером, пробуем переподключиться
Попытка
Почта.Подключиться(Профиль);
Исключение
Прервать; // Если сервер недоступен, прекращаем цикл
КонецПопытки;
КонецЕсли;
Попытка
Почта.Послать(Письмо);
// Фиксируем успешную отправку в логе или регистре
Исключение
ТекстОшибки = ИнформацияОбОшибке().Описание;
// Записываем ошибку для конкретного контрагента, не прерывая цикл
ЗаписатьЛогОтправки(Письмо.Получатели[0].Адрес, ТекстОшибки);
КонецПопытки;
КонецЦикла;
Почта.Отключиться();
В 2024 году популярные сервисы (Yandex, Mail.ru, Gmail) жестко ограничивают скорость отправки. Если ваша обработка попытается «выстрелить» 500 писем за одну секунду, сервер примет первые 20-30, а остальные заблокирует, разорвав соединение с ошибкой «Too many connections» или «Rate limit exceeded».
Разберем способы борьбы с этой проблемой:
Приостановить(1) внутри цикла после каждой отправки, учитывая настройку вариантов адресов для копий. Это замедлит процесс, но сделает его стабильным.Если вам критически важно минимизировать количество возвратов (Bounce rate), можно пойти дальше и проверить существование почтового сервера получателя. Проанализируем ситуацию: если в адресе указано user@gmail-wrong.com, отправка на несуществующий домен может привести к временной блокировке вашего IP-адреса.
Для проверки можно использовать системную утилиту nslookup, вызывая ее через ЗапуститьПриложение, чтобы найти MX-запись домена. Если записей нет — адрес гарантированно не существует.
Для профессиональной реализации массовой отправки в 1С рекомендуем создать вспомогательный Регистр сведений "ОчередьОтправкиПочты" со следующими ресурсами:
Такой подход позволит вам не просто «отправлять почту», а контролировать доставку на каждом этапе. Если в процессе рассылки на 50-м письме пропал интернет, при следующем запуске регламентного задания система продолжит работу именно с этого места, не дублируя письма первым 49 адресатам.
Подведем итог: качественная отправка и получение почтовых сообщений в 1С сегодня — это не просто вызов одной функции, а комбинация предварительной проверки синтаксиса БСП, грамотной обработки исключений с контролем состояния объекта ИнтернетПочта и соблюдения лимитов почтовых провайдеров.