11

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

4

4 回答 4

18

这种行为在四月左右的某个地方发生了变化。请参阅错误 #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的错误修复。

于 2010-08-04T14:40:50.940 回答
5

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

我认为开发人员正在采取明智的方法来检查电子邮件地址,而不是为自己构建一个保证在引入新 TLD 后就会过时的系统。我们有足够的电子邮件地址语法检查器可以拒绝foo@example.museum原样。

于 2010-08-04T14:28:09.727 回答
4

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

于 2010-08-14T10:14:18.050 回答
1

不,test可以是本地/内部网络域,这样就可以了。例如,我喜欢它wrikken@localhost在开发时正确验证。

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

于 2010-08-04T14:29:50.770 回答