При организации рассылок из систем на базе 1С разработчики и администраторы часто сталкиваются со сбоями доставки писем. Одной из наиболее распространенных и коварных проблем является ошибка «SMTP error code 501 5.1.3 Bad recipient address syntax». Она возникает непосредственно в процессе диалога почтового клиента 1С с сервером отправки (SMTP-сервером) и полностью блокирует отправку сообщения. В этой статье мы подробно разберем, почему возникает эта ошибка, как программно очистить базу от невалидных адресов и какие современные методы существуют для проверки существования почтовых ящиков.
Эта ошибка возвращается почтовым сервером в ответ на команду RCPT TO, когда синтаксис переданного адреса получателя не соответствует международным стандартам RFC. Давайте проанализируем основные практические причины, по которым некорректные адреса попадают в базу 1С:
;), копируя их из Microsoft Outlook. Однако большинство почтовых серверов и стандартный объект платформы ИнтернетПочта требуют строгого разделения адресов. При передаче строки вида address1@mail.ru; address2@mail.ru почтовый сервер пытается распарсить ее как один адрес и возвращает ошибку 501.info@mаil.ru, где буква «а» русская), но SMTP-сервер считает его недопустимым.\r\n) или неразрывные пробелы (U+00A0)."Иван" <ivan@domain.com>) непосредственно в поле адреса получателя команды RCPT TO. Некоторые строгие почтовые серверы требуют передачи исключительно «чистого» адреса вида ivan@domain.com.Рассмотрим, как правильно решать проблему некорректного синтаксиса с использованием встроенных инструментов Библиотеки стандартных подсистем (БСП). В современных конфигурациях нет необходимости писать сложные регулярные выражения вручную. Разберем по шагам основные функции, которые помогут нам автоматизировать проверку.
Для разбора строки, содержащей список email-адресов с произвольными разделителями, и приведения их к правильному формату используем функцию ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(). Проанализируем пример ее использования:
// Пример очистки и разбора строки адресов получателей
СтрокаПолучателей = "ivanov@mail.ru; petrov@yandex.ru, некорректный_адрес, sidorov@gmail.com";
МассивАдресов = ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(СтрокаПолучателей);
Для Каждого ТекАдрес Из МассивАдресов Цикл
// Функция БСП возвращает структуру с полями "Адрес" и "Представление"
Если ПустаяСтрока(ТекАдрес.Адрес) Тогда
Продолжить;
КонецЕсли;
// Проверим адрес на соответствие базовым требованиям формата
Если РаботаСПочтовымиСообщениямиКлиентСервер.АдресЭлектроннойПочтыСоответствуетТребованиям(ТекАдрес.Адрес) Тогда
Сообщить("Адрес валиден для отправки: " + ТекАдрес.Адрес);
Иначе
Сообщить("Найден некорректный адрес: " + ТекАдрес.Адрес);
КонецЕсли;
КонецЦикла;
Если нам требуется очистить базу данных от опечаток, связанных с использованием кириллических символов вместо латинских, мы можем написать простую вспомогательную функцию проверки. Посмотрим на пример реализации поиска недопустимых символов:
// Функция проверки наличия недопустимых символов (включая кириллицу) в email
Функция АдресСодержитЗапрещенныеСимволы(Знач ПочтовыйАдрес) Экспорт
// Переводим в нижний регистр для удобства
АдресНРег = НРег(СокрЛП(ПочтовыйАдрес));
// Проверяем наличие русских букв
Для Поз = 1 По СтрДлина(АдресНРег) Цикл
КодСимвола = КодСимвола(АдресНРег, Поз);
// Коды русских букв 'а'-'я' и 'ё' в Юникоде
Если (КодСимвола >= 1072 И КодСимвола <= 1103) Или КодСимвола = 1105 Тогда
Возврат Истина; // Найден русский символ
КонецЕсли;
КонецЦикла;
// Проверка на пробелы внутри адреса
Если Найти(АдресНРег, " ") > 0 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Часто разработчики ищут способы скриптовой проверки реального существования ящика без фактической отправки письма (так называемый метод SMTP-рукопожатия или пинга почтового сервера). Метод заключается в подключении к почтовому серверу получателя, выполнении команд HELO, MAIL FROM и последующей передаче RCPT TO. Если сервер возвращает код 250 OK, соединение разрывается, а адрес считается существующим.
Однако в современных реалиях этот способ практически полностью утратил эффективность по следующим причинам:
250 OK на этапе проверки получателя. Сервер принимает письмо в любом случае, а если адресата не существует, оно тихо удаляется внутри системы либо на него генерируется стандартный отчет о недоставке (NDR).451 Try again later). Легитимный почтовый сервер повторит попытку отправки через несколько минут, а простой скрипт-валидатор посчитает адрес недействительным.Для обеспечения гигиены базы контактов и минимизации процента отказов (Bounce Rate) при массовых рассылках из 1С используются два эффективных профессиональных подхода.
Существуют специализированные облачные сервисы, которые аккумулируют информацию об активности почтовых ящиков, проверяют домены по MX-записям, выявляют одноразовые почты и спам-ловушки. Интеграция с такими сервисами из 1С реализуется через отправку простых HTTP-запросов перед записью email-адреса в карточку контрагента.
Разберем пример отправки JSON-запроса к условному сервису валидации из среды 1С:
// Пример интеграции с внешним сервисом валидации адресов
Функция ПроверитьАдресЧерезВнешнийСервис(Знач EmailАдрес)
ТокенАвторизации = "your_api_token_here";
АдресЗапроса = "api.emailvalidator.ru";
HTTPСоединение = Новый HTTPСоединение(АдресЗапроса, 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
// Формируем GET-запрос с параметрами проверки
Запрос = Новый HTTPЗапрос("/v1/validate?email=" + EmailАдрес);
Запрос.Заголовки.Вставить("Authorization", "Bearer " + ТокенАвторизации);
Попытка
Ответ = HTTPСоединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
// Читаем ответ сервера
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
РезультатЗапроса = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Анализируем статус валидации, возвращенный сервисом
Возврат РезультатЗапроса.status = "deliverable";
Иначе
ЗаписатьЛогСобытия("Ошибка API валидации почты: Код " + Ответ.КодСостояния);
Возврат Истина; // В случае сбоя API пропускаем адрес, чтобы не блокировать работу
КонецЕсли;
Исключение
ЗаписатьЛогСобытия("Не удалось связаться с сервером валидации: " + ОписаниеОшибки());
Возврат Истина;
КонецПопытки;
КонецФункции
Самый надежный способ очистки базы, применяемый профессиональными рассыльщиками: отправка писем с последующей фиксацией возвратов. Когда письмо не доставляется из-за отсутствия ящика, принимающий почтовый сервер отправляет обратно техническое сообщение — NDR (Non-Delivery Report). Мы можем настроить 1С на автоматический разбор таких писем.
Рассмотрим по шагам логику этого процесса:
Return-Path (например, bounce-parser@yourdomain.com).Посмотрим на пример кода регламентного задания 1С для работы с почтовым ящиком возвратов:
// Подключение к почтовому ящику возвратов по IMAP
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.yourdomain.com";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.Пользователь = "bounce-parser@yourdomain.com";
Профиль.Пароль = "StrongPassword123";
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
// Запрашиваем только непрочитанные сообщения
ПараметрыОтбора = Новый Структура("НеПрочитанные", Истина);
МассивПисем = Почта.ПолучитьПочту(ПараметрыОтбора);
Для Каждого Письмо Из МассивПисем Цикл
// Анализируем тему и текст письма на наличие маркеров возврата (NDR)
Если Найти(ВРег(Письмо.Тема), "DELIVERY FAILURE") > 0
Или Найти(ВРег(Письмо.Тема), "UNDELIVERABLE") > 0 Тогда
// Извлекаем адрес несостоявшегося получателя из текста отчета о недоставке
НерабочийАдрес = НайтиАдресВТекстеВозврата(Письмо.Тексты[0].Текст);
Если ЗначениеЗаполнено(НерабочийАдрес) Тогда
// Блокируем рассылки на этот адрес в нашей информационной базе
ЗаблокироватьАдресВБазеДанных(НерабочийАдрес);
КонецЕсли;
КонецЕсли;
// Помечаем письмо как прочитанное или удаляем его
Почта.УстановитьПризнакПрочтения(Письмо);
КонецЦикла;
Почта.Отключиться();
Исключение
ЗаписатьЛогСобытия("Ошибка обработки ящика возвратов: " + ОписаниеОшибки());
Если Почта.Подключено() Тогда
Почта.Отключиться();
EndIf;
КонецПопытки;
Регулярная очистка базы с использованием встроенных механизмов синтаксической проверки БСП в сочетании с обработкой писем-возвратов (Bounce Management) полностью решает проблему ошибок отправки, исключает появление системных сбоев SMTP error code 501 и сохраняет высокую репутацию ваших почтовых доменов.