2010-08-04 54 views
9

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

+8

从技术上讲,'test'可能是本地网络中的有效主机名,所以我认为它是正确的。 – 2010-08-04 14:26:21

+1

您可以发布您的代码吗? var_dump(filter_var('test @ test。',FILTER_VALIDATE_EMAIL)); 对我而言返回false! – Youssef 2010-08-04 14:31:52

+1

test @ test没有点也返回false – Youssef 2010-08-04 14:33:19

回答

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 [email protected] 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这个Bug修正。

+1

这个bug的票据被标记为固定的PHP5.3.3和PHP5.2.14 – Gordon 2010-08-04 14:48:24

+0

很棒的Artefacto。所以我认为规则已经改变了?这为什么改变了?我希望他们能解释他们在filter_var文档中检查的内容。那么这会在5.3.3之前返回true,在5.3.3之后会返回false?我使用的系统是5.2.12 – Metropolis 2010-08-04 14:49:31

+0

@Metro它检查电子邮件是否符合Internet标准。 “测试@测试”之前被允许的事实是一个错误。 – Artefacto 2010-08-04 14:52:56

5

这是一个有效的电子邮件地址。它不会在互联网上工作(至少不是在今天),但是对于本地地址来说,这没问题。

我会假设开发人员正在采取明智的方法来检查电子邮件地址,而不是建立自己的系统,只要引入新的TLD就会保证系统过时。我们有足够的电子邮件地址语法检查程序,拒绝[email protected]原样。

+1

您是否认为RFC 5321的第2.3.5节不适用? – Artefacto 2010-08-04 14:43:59

1

不,test可以是本地/内部网络域,这样就可以工作。我喜欢它在开发时正确验证[email protected]

正常的nonexistentdomain.foo会有同样的问题。如果您想测试是否有东西可以交给主机,请使用getmxrr(并且它失败时会回退到gethostbyname())。

+0

那么最好是允许本地地址?或者,如果我不想允许像test @ test这样的东西,我应该使用getmxrr吗? – Metropolis 2010-08-04 14:41:11

+0

不是使用checkdnsrr检查会更好吗?因为如果他们的服务器关闭了,或者其他的东西,那么getmxrr将返回false。对? – Metropolis 2010-08-04 14:44:25

+1

如果您希望/希望处理这些地址,您将允许本地地址(主要在已知的IP范围内)。你确实可以使用checkdnsrr('hostname','ANY'),对我来说不会发生(尽管检查MX或A记录(如果没有定义MX,应该是后备)将更加可靠:注册的域可能没有A&MX记录,导致它们无法投递)。 checkdnsrr/gethostbyname/getmxrr都使用相同的机制afaik,所以如果DNS服务器关闭或速度慢,它将失败/对所有选项都很慢。 – Wrikken 2010-08-04 15:03:38

3

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的域名的电子邮件地址:

文斯@人工智能

保罗@ IO

根@公里

Joost的@ TK

管理员@ TT

hostmaster @ ua

示例电子邮件地址的来源s:Tony Finch – TLDs with MXs

相关问题