Рекомендации по реализации поддержки кириллических адресов электронной почты в CMS 1С-Битрикс

Как известно, система управления контентом 1С-Битрикс «Управление сайтом» (далее - CMS 1С-Битрикс) пока не поддерживает обработку интернационализированных адресов электронной почты (далее – EAI-адресов), в том числе содержащих кириллические символы.

Интернационализированный адрес электронной почты или EAI-адрес – это адрес электронной почты, содержащий символы из таблицы Unicode либо в доменной части (например, info@поддерживаю.рф), либо в локальной части (например, тест@cctld.ru), либо в обеих частях адреса электронной почты (например, тест@поддерживаю.рф).

Таким образом ввести адрес электронной почты, содержащий Unicode символы, на сайте под управлением CMS 1С-Битрикс нельзя:

В публичной части:

  • при использовании компонента подписки на новости (bitrix:sender.subscribe);
  • при использовании компонента формы обратной связи (bitrix:main.feedback);

В административной части:

  • при создании и редактировании пользователя.

Первая причина этого – функция-валидатор check_email() из /bitrix/modules/main/tools.php, которая содержит регулярное выражение не пропускающее нелатинские символы как в локальной части e-mail (до знака @), так и в доменной части (после знака @).

Внутри этой функции предусмотрено три проверки на базе regex-выражений. Для обеспечения работы с кириллическими EAI-адресами одну из них (на общую длину e-mail адреса) нужно отключить (закомментировать), а две другие - дополнить русским алфавитом.

Функцию check_email(), к сожалению, нельзя переопределить и единственное, что можно сделать в этой ситуации – закомментировать ее в tools.php и определить ее заново у себя – например, в /bitrix/php_interface/init.php. При этом после каждого обновления CMS придется повторять такую операцию.

Вторая причина - функция bxmail(), которая не умеет работать с EAI адресами. Проблема, во-первых, в том, что в коде CEvent происходит преобразование всех Unicode-полей письма, включая поле “to” в заголовочный UTF-8 (начинающийся с маркера '=?UTF-8?B?'). Во-вторых, не происходит преобразования доменного имени в Punycode. А функция mail() , оберткой для которой служит bxmail(), с таким форматом “to” работать не может.

Для решения этой проблемы проще всего воспользоваться встроенной в CMS 1C-Bitrix функцией custom_mail(), которая вызывается bxmail() вместо mail(), если определена.

В custom_mail() мы реализуем:

  • проверку и расшифровку ошибочно закодированного в заголовочный UTF-8 поля to;
  • проверку и перевод доменного имени в Punycode в доменной части e-mail, в случае наличия в нем кириллических символов;
  • финальный вызов mail() с исправленными параметрами.

На эту доработку обновление CMS не повлияет. Если вам необходимо, чтобы CMS 1C-Bitrix поддерживал и другие EAI-адреса, помимо кириллических, эти наборы символов придется добавить в регулярные выражения в check_email() и custom_mail(), проверяющие факт использования Unicode.