【问题标题】:PHP how to use idn_to_ascii for mail adressesPHP 如何使用 idn_to_ascii 获取邮件地址
【发布时间】:2017-09-24 02:10:19
【问题描述】:

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

所以有这个 php 函数 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 上有人写了一条评论说你必须跳过高级域部分(而且官方文档是错误的): see here

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

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

【问题讨论】:

  • 尽管有 16 票,但我不会太认真地对待用户评论。他似乎对基本文本编码的工作原理只有一个模糊的概念,所以我不相信更高级别的信息。
  • 请问你打算用这个做什么?utf-8 .com 到 ASCII 仍然是 .com 我想。
  • 正在寻找相同的答案,您能帮帮我吗?

标签: php email idn


【解决方案1】:

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

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

RFC 5322 3.2.3 节

【讨论】:

  • 事实上(和往常一样)有很多 RFC。根据Wikipedia,它根据 RFC 6530(提议的标准)有效。我不知道它有多广泛。
  • 据我所知它应该是有效的。 ZF3 Mail 验证器也说它是一个有效的邮件地址。最好不要在邮件地址的本地部分中使用变音符号。谷歌也不允许它和很多托管服务商
【解决方案2】:

试试这样的:

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";
}

【讨论】:

    猜你喜欢
    • 2012-12-26
    • 2011-03-27
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多