При реализации механизмов массовой рассылки из 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда программный код отрабатывает без ошибок, счетчики показывают успешную отправку, но до адресатов доходит лишь часть сообщений. Особенно остро эта проблема проявляется при интеграции с сервисами Microsoft 365 (Office 365). Разберем детально, почему так происходит, и как оптимизировать код для стабильной доставки почты.
В типовом сценарии для экономии ресурсов и времени часто используется механизм Слепых копий (BCC). Рассмотрим стандартный подход: мы создаем один объект ИнтернетПочтовоеСообщение, добавляем в него несколько адресатов в коллекцию СлепыеКопии и отправляем пачкой по 5–10 адресов. На первый взгляд, это логично, однако именно здесь кроются основные технические риски.
Проанализируем основные причины «исчезновения» писем:
Одной из главных проблем является хранение нескольких email-адресов в одной строке через запятую в контактной информации 1С. Когда код выполняет НовоеПисьмо.СлепыеКопии.Добавить(Элемент.КакСвязаться), в объект передается строка вида "boss@mail.ru, secretary@mail.ru". Почтовый сервер воспринимает это не как двух получателей, а как один некорректный адрес. Выясним, как правильно обработать такие данные.
Рассмотрим пример кода, который разбивает строку на отдельные валидные адреса перед добавлением в сообщение:
// Разбиваем строку по запятым и точке с запятой
МассивАдресов = СтрРазделить(Элемент.КакСвязаться, ",;");
Для Каждого ТекущийАдрес Из МассивАдресов Цикл
ОчищенныйАдрес = СокрЛП(ТекущийАдрес);
Если НЕ ПустаяСтрока(ОчищенныйАдрес) Тогда
// Добавляем каждый адрес как отдельный элемент коллекции
НовоеПисьмо.СлепыеКопии.Добавить(ОчищенныйАдрес);
КонецЕсли;
КонецЦикла;
Такой подход гарантирует, что 1С передаст серверу четкий список получателей, что снижает риск отказа в обработке всего пакета данных.
Использование слепых копий для массовых рассылок — это «советский» метод, который современные спам-фильтры (Exchange Online Protection) часто помечают как подозрительный. Если ваша задача — гарантированная доставка, рассмотрим вариант персональной отправки каждому клиенту.
Преимущества персональной отправки:
Проанализируем пример кода для поштучной отправки с контролем соединения:
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Для Каждого Элемент Из Получатели Цикл
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = "info@mycompany.ru";
Сообщение.Тема = "Актуальные остатки";
// Добавляем только одного получателя
Сообщение.Получатели.Добавить(Элемент.Email);
Текст = Сообщение.Тексты.Добавить();
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
Текст.Текст = "Добрый день! Ваши данные во вложении.";
Попытка
Почта.Послать(Сообщение);
// Логируем успешную отправку в регистр или журнал
Исключение
Сообщить("Не удалось отправить на адрес " + Элемент.Email);
КонецПопытки;
КонецЦикла;
Почта.Отключиться();
Если мы отправляем письма слишком быстро, сервер может начать «молча» игнорировать запросы или возвращать ошибку 421 4.7.206 ADDB Submitter Rate Limit Exceeded. Чтобы этого избежать, нам нужно внедрить искусственные паузы в процесс отправки. Выясним, как это сделать в 1С.
Посмотрим на пример реализации паузы между отправками, чтобы не превышать лимит в 30 писем в минуту:
СчетчикПисем = 0;
Для Каждого Элемент Из Получатели Цикл
// Код формирования и отправки сообщения...
Почта.Послать(Сообщение);
СчетчикПисем = СчетчикПисем + 1;
// После каждого 20-го письма делаем паузу 60 секунд
Если СчетчикПисем % 20 = 0 Тогда
Сообщить("Техническая пауза для соблюдения лимитов сервера...");
// В управляемых формах можно использовать ожидание
// Или команду системы для задержки
КомандаСистемы("timeout /t 60 /nobreak", Ложь);
КонецЕсли;
КонецЦикла;
Обратите внимание, что значение Профиль.Таймаут (например, 999) отвечает лишь за время ожидания ответа от сервера, но не за частоту обращений. Настройка частоты должна регулироваться именно логикой вашего алгоритма.
Если письма все равно теряются, необходимо проверить настройки учетной записи Office 365. Важно убедиться, что параметр MessageCopyForSentItemsEnabled включен, иначе вы не увидите результаты работы 1С в папке «Отправленные» вашего Outlook.
Рекомендации по глубокой диагностике:
250 OK или сбрасывает соединение.Подведем итог: для стабильной работы почты из 1С необходимо отказаться от накопления адресов через запятую, перейти на поштучную отправку (или очень маленькие пачки BCC с проверенными адресами) и обязательно соблюдать временные интервалы, чтобы не попасть под санкции спам-фильтров почтового провайдера.