При интеграции систем или настройке автоматических рассылок мы часто сталкиваемся с нестандартными форматами данных. Рассмотрим ситуацию: у нас есть почтовый адрес с кириллическим доменом (например, multuk@почта.рф). При попытке отправить письмо на такой email стандартными средствами 1С, почтовый SMTP-сервер справедливо отклоняет запрос и возвращает ошибку: SMTP error code 501 5.1.3 Bad recipient address syntax.
Давайте разберем по шагам, почему возникает эта ошибка, выясним причину такого поведения серверов и проанализируем доступные пути решения проблемы как для текущих версий платформы, так и для будущих релизов.
Исторически протоколы передачи электронной почты (SMTP, POP3, IMAP) создавались с расчетом на использование исключительно латинского алфавита и базовых символов (кодировка ASCII). Когда появились национальные домены (такие как .рф, .бел и другие), старые почтовые сервера оказались не готовы корректно обрабатывать кириллические символы в адресах. Именно поэтому сервер сообщает о неверном синтаксисе адресата — он просто не может прочитать символы, выходящие за рамки стандартной латиницы.
Если мы используем платформу версии ниже 8.3.27, нам необходимо самостоятельно подготовить email-адрес перед его передачей почтовому серверу. Посмотрим на механизм под названием Punycode. Это стандартизированный метод преобразования Unicode-строк (в нашем случае — кириллицы) в ограниченный набор символов ASCII, который понятен любому SMTP-серверу.
При использовании этого метода кириллический домен почта.рф преобразуется в строку вида xn--80a1acny.xn--p1ai. Если мы запишем адрес как multuk@xn--80a1acny.xn--p1ai, то письмо успешно отправится.
Проанализируем, какими способами мы можем выполнить конвертацию домена в Punycode внутри 1С:
MSScriptControl.ScriptControl для вызова готовых JavaScript-функций, которые выполнят преобразование доменного имени.Рассмотрим пример того, как логически должна выглядеть подготовка адреса в коде:
// Пример логики подготовки адреса перед отправкой
АдресПолучателя = "multuk@почта.рф";
ЧастиАдреса = СтрРазделить(АдресПолучателя, "@");
Если ЧастиАдреса.Количество() = 2 Тогда
ИмяПользователя = ЧастиАдреса[0];
ДоменноеИмя = ЧастиАдреса[1];
// Проверяем наличие не-ASCII символов и конвертируем
Если СодержитКириллицу(ДоменноеИмя) Тогда
ДоменPunycode = СконвертироватьДоменВПьюникод(ДоменноеИмя); // Ваша функция конвертации
ГотовыйАдрес = ИмяПользователя + "@" + ДоменPunycode;
Иначе
ГотовыйАдрес = АдресПолучателя;
КонецЕсли;
КонецЕсли;
Выше мы разобрали ситуацию, когда кириллица находится только в доменной части (после символа @). Но давайте проанализируем ситуацию, если кириллица содержится и в имени почтового ящика (например, директор@почта.рф).
В этом случае конвертация одного лишь домена в Punycode не спасет ситуацию. Для поддержки национальных алфавитов в локальной части email-адреса применяется расширение протокола SMTPUTF8. В отличие от заблуждений, встречающихся на форумах (где советуют использовать кодировку UTF-7), современные стандарты предписывают использовать именно UTF-8. Кодировка UTF-7 исторически применялась только для кириллических имен папок на IMAP-серверах (например, для папки "Отправленные"), но не для самих email-адресов.
Важное ограничение: Чтобы письмо успешно ушло на адрес с кириллическим логином, ваш исходящий SMTP-сервер и принимающий сервер получателя должны обязательно поддерживать расширение SMTPUTF8. Если сервер его не поддерживает, он отклонит письмо даже при корректном Punycode-домене.
Теперь обратим внимание на отличные новости для разработчиков. Начиная с версии платформы 1С:Предприятие 8.3.27, реализована нативная поддержка интернационализированных почтовых адресов (стандарт EAI — Email Address Internationalization).
Что это означает на практике?
ИнтернетПочта, ИнтернетПочтовоеСообщение) будут корректно и автоматически обрабатывать национальные домены при взаимодействии с серверами по протоколам SMTP, IMAP и POP3.Таким образом, если вы столкнулись с проблемой отправки почты на домены .рф, наиболее правильным стратегическим решением будет планирование обновления платформы до версии 8.3.27 и выше. А до момента обновления используйте программную конвертацию доменной части в Punycode-формат.