为什么filter_var($ email,FILTER_VALIDATE_EMAIL)允许test @ test?

时间:2010-08-04 14:25:11

标签: php email-validation

我刚刚设置了一个表单的验证,我决定尝试使用filter_var函数来检查我的电子邮件地址的有效性。我无法找到filter_var实际允许的任何地方(因为文档很简单),我发现它允许一个像test @ test这样的电子邮件地址。在域中是否必须有.com,.net等...

4 个答案:

答案 0 :(得分:18)

这种行为在四月左右发生了变化。请参阅bug #49576revision 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())。