我刚刚设置了一个表单的验证,我决定尝试使用filter_var函数来检查我的电子邮件地址的有效性。我无法找到filter_var实际允许的任何地方(因为文档很简单),我发现它允许一个像test @ test这样的电子邮件地址。在域中是否必须有.com,.net等...
答案 0 :(得分:18)
这种行为在四月左右发生了变化。请参阅bug #49576和revision 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.
changelog提到了PHP 5.3.3和PHP 5.2.14的这个错误修复。
答案 1 :(得分:5)
这是一个有效的电子邮件地址。它不会在互联网上起作用(至少,不是今天),但对于本地地址来说这很好。
我认为开发人员正在采取合理的方法来检查电子邮件地址,而不是建立自己的系统,一旦引入新的TLD,该系统就会保证过时。我们有足够的电子邮件地址语法检查程序拒绝foo@example.museum
。
答案 2 :(得分:4)
test @ test在语法上是有效的。
来自RFC 5321:
如果在电子邮件地址中单独使用顶级域名,则使用单个字符串而不带任何点。
只有这样才会说:
仅允许使用可解析的完全限定域名(FQDN) 在SMTP中使用域名时。换句话说,名字可以 被解析为MX RR或地址(即A或AAAA)RR(如上所述) 在第5节中是允许的,CNAME RR的目标也是允许的 反过来,解决了MX或地址RR。本地昵称或 不得使用不合格的名称。
这不一定排除仅限TLD的域名。实际上,运行以下代码:
checkdnsrr('ua', 'MX') // Returns true
getmxrr('ua', $array) // Returns true
仅限TLD的域名(可以)有MX记录且 正在使用中:http://www.to/就是一个例子。这里有一些有效的TLD域名电子邮件地址:
文斯@ AI
保罗@ IO
根@公里
的Joost @ TK
管理员@ TT
hostmaster @ UA
示例电子邮件地址来源:Tony Finch – TLDs with MXs
答案 3 :(得分:1)
不,test
可以是本地/内部网络域,因此可行。我喜欢它在开发时正确验证wrikken@localhost
。
普通nonexistentdomain.foo
会遇到同样的问题。如果您想测试某些内容是否可以分发给某个主机,请使用getmxrr
(并且它将无法回退到gethostbyname()
)。