我只是为一个表单设置验证,我决定尝试使用 filter_var 函数来检查我的电子邮件地址的有效性。我无法找到 filter_var 实际上在任何地方允许的内容(因为文档非常简单),我发现它允许使用像 test@test 这样的电子邮件地址。域中不是必须有.com、.net 等吗?
4 回答
这种行为在四月左右的某个地方发生了变化。请参阅错误 #49576和修订版 297350。
那封电子邮件确实是无效的,或者至少 PHP 开发人员是这样理解的。消息来源携带此通知:
/*
* The regex below is based on a regex by Michael Rushton.
* However, it is not identical. I changed it to only consider routeable
* addresses as valid. Michael's regex considers a@b a valid address
* which conflicts with section 2.3.5 of RFC 5321 which states that:
*
* Only resolvable, fully-qualified domain names (FQDNs) are permitted
* when domain names are used in SMTP. In other words, names that can
* be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed
* in Section 5) are permitted, as are CNAME RRs whose targets can be
* resolved, in turn, to MX or address RRs. Local nicknames or
* unqualified names MUST NOT be used.
更新日志提到了这个针对 PHP 5.3.3 和 PHP 5.2.14的错误修复。
这是一个有效的电子邮件地址。它不会在 Internet 上工作(至少,现在不行),但对于本地地址来说没问题。
我认为开发人员正在采取明智的方法来检查电子邮件地址,而不是为自己构建一个保证在引入新 TLD 后就会过时的系统。我们有足够的电子邮件地址语法检查器可以拒绝foo@example.museum
原样。
test@test 在语法上是有效的。
来自 RFC 5321:
在电子邮件地址中单独使用顶级域的情况下,使用单个字符串,不带任何点。
只有在这之后它才说:
在 SMTP 中使用域名时,仅允许可解析的完全限定域名 (FQDN)。换句话说,可以解析为 MX RR 或地址(即 A 或 AAAA)RR(如第 5 节中所述)的名称是允许的,其目标可以依次解析为 MX 或地址 RR 的 CNAME RR 也是如此. 不得使用本地昵称或非限定名称。
这不一定排除仅限 TLD 的域名。实际上,运行以下代码:
checkdnsrr('ua', 'MX') // Returns true
getmxrr('ua', $array) // Returns true
仅限 TLD 的域名(可以)具有 MX 记录并正在使用中:http ://www.to/就是一个示例。以下是一些有效的仅限 TLD 的域名电子邮件地址:
文斯@ai
保罗@io
根@km
joost@tk
管理员@tt
主持人@ua
示例电子邮件地址的来源:Tony Finch – TLDs with MXs
不,test
可以是本地/内部网络域,这样就可以了。例如,我喜欢它wrikken@localhost
在开发时正确验证。
正常人nonexistentdomain.foo
也会有同样的问题。如果您想测试某些东西是否可以交付给主机,请使用getmxrr
(失败的则回退到 gethostbyname()
)。