email — PHP как использовать idn_to_ascii для почтовых адресов

поскольку Umlaute (например, öäü) можно разместить в локальной части адреса электронной почты, мне нужно преобразовать их в ascii, потому что Zend-Mail не может его обработать — он всегда выдает недопустимое исключение заголовка.

Так что есть эта php-функция idn_to_ascii который преобразует доменные имена в формат IDNA ASCII. Проблема в том, что я не уверен, как правильно его использовать.

Давайте возьмем этот адрес электронной почты: testö@domain.com

// doesn't work (unknown error):
idn_to_ascii('testö@domain.com') --> [email protected]

Если я просто конвертирую локальную часть адреса электронной почты, она, кажется, будет работать:

idn_to_ascii('testö') --> [email protected]

Но что, если и доменная часть содержит Umlaute?
например testö@domainö.com

я должен сделать что-то подобное?

idn_to_ascii('testö').'@'.idn_to_ascii('domainö.com')

Также на php-homepage кто-то написал комментарий, что вы должны пропустить высокоуровневую часть домена (а официальная документация неверна):
посмотреть здесь

idn_to_ascii('domainö') // right
idn_to_ascii('domainö.com') // wrong

Я так запутался сейчас: |
У кого-то есть опыт в этом? И хуже всего то, что я даже не могу проверить это, потому что у меня нет адреса электронной почты с Umlaute.

2

Решение

По состоянию на 26 апреля 2017 года testö@domain.comневерно, потому что местная часть (testö) адреса электронной почты может использовать любой из следующих символов ASCII:

  • Прописные и строчные буквы английского алфавита (a-z, A-Z)
  • Цифры от 0 до 9
  • Персонажи ! # $% & ‘* + — / =? ^ _ `{| } ~
  • Символ . (точка, точка, точка) при условии, что это не первый или последний символ, а также при условии, что он не появляется два или более раз подряд.

RFC 5322 Раздел 3.2.3

0

Другие решения

Попробуйте что-то вроде этого:

function emailToAscii($email) {

$explodedMail = explode('@', $email);

$mailName = idn_to_ascii(array_first($explodedMail));

$mailDomain = last($explodedMail);

$explodedDomain = explode('.', $mailDomain);

$secondLvlDomain = idn_to_ascii(array_first($explodedDomain));

$firstLvlDomain = idn_to_ascii(last($explodedDomain));

return "$mailName@$secondLvlDomain.$firstLvlDomain";
}
0

По вопросам рекламы [email protected]