Как организовать массовую отправку почты из 1С и правильно проверять ошибки отправки

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

Массовая рассылка почты из 1С — это задача, с которой сталкивается практически каждый разработчик при автоматизации бизнес-процессов. Однако стандартный подход «отправить в цикле» часто приводит к проблемам: рассылка прерывается на некорректном адресе, соединение с сервером разрывается, а бухгалтер не понимает, кто из контрагентов получил письмо, а кто нет. В этой статье мы подробно разберем, как построить отказоустойчивую систему отправки почты, актуальную для 2024 года.

Анализ проблемы прерывания рассылки

Рассмотрим стандартную ситуацию: код перебирает список контрагентов и вызывает метод РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение. Если у одного из контрагентов адрес указан неверно (например, отсутствует символ @ или доменная точка), платформа может сгенерировать исключение. Если этот вызов не обернут в блок Попытка...Исключение, выполнение всего кода прекращается, и остальные 99 из 100 писем не уходят. Наша задача — сделать процесс непрерывным и информативным.

Шаг 1: Предварительная валидация email-адресов

Первое, что мы должны сделать — проверить синтаксическую корректность адреса перед попыткой отправки. Это позволит отсечь заведомо ложные данные, не нагружая почтовый сервер. В конфигурациях на базе БСП (например, «Бухгалтерия предприятия 3.0») для этого есть готовый инструмент.

Проанализируем пример кода для проверки адреса:


// Используем стандартную функцию БСП
АдресЭлектроннойПочты = СтрокаКонтрагента.Email;
Если НЕ РаботаСАдресамиЭлектроннойПочты.АдресСоответствуетШаблону(АдресЭлектроннойПочты) Тогда
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Некорректный адрес у контрагента: " + СтрокаКонтрагента.Наименование);
    Продолжить; // Переходим к следующему контрагенту
КонецЕсли;

Важный нюанс: функция АдресСоответствуетШаблону проверяет только формат записи (наличие @, допустимых символов и домена). Она не гарантирует, что такой ящик существует в реальности, но защищает от падения системы при попытке отправить письмо на «битую» строку.

Шаг 2: Работа с объектом ИнтернетПочта и обработка ошибок

Метод ИнтернетПочта.Послать() является основным для отправки сообщений. Однако программисты часто сталкиваются с тем, что он не возвращает ожидаемое «Соответствие» с ошибками. Выясним причину: современная спецификация SMTP позволяет серверам принимать письмо «условно», а сообщать об ошибке (например, переполнен ящик) уже после разрыва сессии в виде ответного письма (NDR).

Чтобы массовая рассылка не «падала», мы должны реализовать следующий алгоритм в цикле:

  1. Подключиться к почтовому серверу один раз перед началом цикла.
  2. Внутри цикла использовать блок Попытка.
  3. В блоке Исключение анализировать состояние подключения.

Рассмотрим программную реализацию повышенной надежности:


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

Для Каждого Письмо Из МассивПисем Цикл
    // Перед каждой отправкой проверяем линк (доступно с 8.3.10)
    Если НЕ Почта.ПроверитьВозможностьОтправки() Тогда
         // Если связь разорвана сервером, пробуем переподключиться
         Попытка
             Почта.Подключиться(Профиль);
         Исключение
             Прервать; // Если сервер недоступен, прекращаем цикл
         КонецПопытки;
    КонецЕсли;

    Попытка
        Почта.Послать(Письмо);
        // Фиксируем успешную отправку в логе или регистре
    Исключение
        ТекстОшибки = ИнформацияОбОшибке().Описание;
        // Записываем ошибку для конкретного контрагента, не прерывая цикл
        ЗаписатьЛогОтправки(Письмо.Получатели[0].Адрес, ТекстОшибки);
    КонецПопытки;
КонецЦикла;

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

Шаг 3: Обход ограничений почтовых сервисов (Anti-spam)

В 2024 году популярные сервисы (Yandex, Mail.ru, Gmail) жестко ограничивают скорость отправки. Если ваша обработка попытается «выстрелить» 500 писем за одну секунду, сервер примет первые 20-30, а остальные заблокирует, разорвав соединение с ошибкой «Too many connections» или «Rate limit exceeded».

Разберем способы борьбы с этой проблемой:

Шаг 4: Проверка существования домена (MX-записи)

Если вам критически важно минимизировать количество возвратов (Bounce rate), можно пойти дальше и проверить существование почтового сервера получателя. Проанализируем ситуацию: если в адресе указано user@gmail-wrong.com, отправка на несуществующий домен может привести к временной блокировке вашего IP-адреса.

Для проверки можно использовать системную утилиту nslookup, вызывая ее через ЗапуститьПриложение, чтобы найти MX-запись домена. Если записей нет — адрес гарантированно не существует.

Рекомендации по архитектуре системы рассылки

Для профессиональной реализации массовой отправки в 1С рекомендуем создать вспомогательный Регистр сведений "ОчередьОтправкиПочты" со следующими ресурсами:

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

Такой подход позволит вам не просто «отправлять почту», а контролировать доставку на каждом этапе. Если в процессе рассылки на 50-м письме пропал интернет, при следующем запуске регламентного задания система продолжит работу именно с этого места, не дублируя письма первым 49 адресатам.

Подведем итог: качественная отправка и получение почтовых сообщений в 1С сегодня — это не просто вызов одной функции, а комбинация предварительной проверки синтаксиса БСП, грамотной обработки исключений с контролем состояния объекта ИнтернетПочта и соблюдения лимитов почтовых провайдеров.

← На главную