2

因为在电子邮件地址的本地部分中可能有变音符号(例如öäü),所以我需要将它们转换为 ascii,因为 Zend-Mail 无法处理它 - 它总是抛出无效的标头异常。

所以有这个 php-function idn_to_ascii将域名转换为 IDNA ASCII 格式。问题是我不确定如何正确使用它。

让我们使用这个电子邮件地址:testö@domain.com

// doesn't work (unknown error):
idn_to_ascii('testö@domain.com') --> xn--test@domain-ufb.com

如果我只是转换电子邮件地址的本地部分,它似乎可以工作:

idn_to_ascii('testö') --> xn--test-8qa@domain.com

但是如果域部分也包含变音符号怎么办?
例如 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

我现在很困惑:|
有人有这方面的经验吗?最糟糕的是:我什至无法测试它,因为我没有 Umlate 的电子邮件地址。

4

3 回答 3

1

自 2017 年 4 月 26 日起,由于电子邮件地址的本地部分 ( ) 可能使用以下任何 ASCII 字符,testö@domain.com因此无效:testö

  • 大写和小写英文字母(az、AZ)
  • 数字 0 到 9
  • 人物 !# $ % & ' * + - / = ? ^ _ ` { | } ~
  • 特点 。(点、句号、句号)只要它不是第一个或最后一个字符,并且它不连续出现两次或多次。

RFC 5322第 3.2.3 节

于 2017-04-26T15:19:57.307 回答
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";
}
于 2017-12-03T09:41:02.913 回答
0

一些更简单的东西:

function email_to_ascii($email) {
    $explode = explode('@', $email);
    return $explode[0].'@'.idn_to_ascii($explode[1]);
}
于 2022-02-24T16:47:06.337 回答