有没有适用于电子邮件地址验证的PHP库?

8

我需要验证我的用户的电子邮件地址。不幸的是,制作一个符合标准的验证器很难。

这里有一个正则表达式的例子,试图符合标准。

是否有一个 PHP 库(最好是开源的)可以验证电子邮件地址?


我们是在讨论电子邮件还是电子邮件地址? - Sietse
我的意思是电子邮件地址。我已经更正了我的问题以反映这一点。谢谢。 - MrValdez
7个回答

16
你有没有看过PHP的filter_函数?它们虽然不完美,但在我的经验中它们做得相当不错。
使用示例(返回布尔值): filter_var($someEmail, FILTER_VALIDATE_EMAIL);

我正在编写一个简单的(非企业级)应用程序,需要一个基本的验证器。虽然FILTER_VALIDATE_EMAIL似乎没有完全实现规范 - 例如,在http://code.iamcal.com/php/rfc822/rfc822.phps上它无法通过一些测试 - 但对于我目前的需求来说,它似乎已经“足够好了”。谢谢! - Jon Schneider

12

据我所知,验证电子邮件的唯一好方法是发送一封电子邮件,并查看用户是否使用此电子邮件中的链接返回到网站。这就是许多网站所做的。

正如您通过链接到著名的巨型正则表达式所指出的那样,验证所有形式的电子邮件地址都很难,几乎是不可能的。即使对于微不足道的样式电子邮件(我发现太多网站拒绝将大写字母用于电子邮件地址!而且大多数旧的正则表达式拒绝超过4个字母的顶级域名!),也很容易做错。

据我所知,“Jean-Luc B. O'Grady"@example.com和e=m.c^2@[82.128.45.117]都是有效的地址...而I-Made-It-Up@Absurd-Domain-Name.info可能是无效的。

因此,我只需检查我们是否有某些东西,一个独特的@,其他内容,并继续使用它:它会捕捉大多数用户错误(例如空字段或用户名而不是电子邮件地址)
如果用户想提供虚假地址,它只会给出看起来正确的随机内容(see@on.tv或bill.gates@microsoft.com)。没有验证器会捕捉拼写错误(jhon.b@example.com而不是john.b@example.com)。

如果真的想针对完整的RFC验证电子邮件,我建议使用正则表达式围绕@分割,然后分别检查本地名称和域名。从其他情况分离以“开始的本地名称。等。从其他情况分离以[开头的域名。将问题分解为更小的特定域,并仅在定义良好、更简单的情况下使用正则表达式。
当然,这个建议可以应用于许多正则表达式用途...


这是一个有效的答案,也是我通常会做的。但是对于这个特定的客户,我需要一种检查电子邮件是否有效的方法。电子邮件验证的替代方法是要求用户输入两次电子邮件,我强烈反对这样做。希望我能说服他们不要这样做。 - MrValdez
双重输入有什么问题吗?这是一种快速、廉价和简单的方式,可以确保用户在输入电子邮件地址时没有打错。如果您真的需要验证电子邮件地址是否具有有效格式,Dominic 的答案(和链接网站)似乎包含了我看过的最全面的信息。 - afrazier
2
@afrazier:“双重输入有什么问题吗?” 嗯,如果像我这样的人,他们会将第一次输入复制/粘贴到第二次输入中,那么好处就无效了... - PhiLho

10
[更新] 我已经整理了关于电子邮件地址验证的所有信息,网址为:http://isemail.info。现在它不仅可以验证电子邮件地址,还可以诊断其中的问题。我同意这里很多评论,验证只是解决方案的一部分;请参见我的文章http://isemail.info/about
我现在已经从Cal Henderson、Dave Child、Phil Haack、Doug Lovell和RFC 3696中整理了测试用例。总共有158个测试地址。
我对所有我能找到的验证器运行了所有这些测试。比较结果在这里:http://www.dominicsayers.com/isemail
我会尽力让这个页面保持最新状态,因为人们正在改进他们的验证器。感谢Cal、Dave和Phil在编制这些测试和对我的验证器进行建设性批评方面的帮助和合作。
特别是人们应该注意RFC 3696的勘误表。其中三个规范示例实际上是无效地址。地址的最大长度为254或256个字符,而不是320个字符。

感谢您的付出,有真实的数据可以使用,而不仅仅是猜测,这太棒了。您能否还包括此页面提到的其他库? - Anirvan

8

Cal Henderson(来自Flickr)编写了一个符合RFC822标准的电子邮件地址匹配器,并解释了RFC以及使用RFC匹配电子邮件地址的代码。我已经使用它有一段时间了,没有任何投诉。

RFC822(1982年发布)定义了互联网文本消息(电子邮件)地址的格式,您可以通过谷歌搜索找到RFC - 在线上有许多副本。它们有点简略和奇怪的格式,但是通过一些努力,我们可以明白它们的意图。

... 更新 ...

正如Porges在评论中指出的那样,链接上的库已过时,但该页面有一个更新版本的链接


值得注意的是,RFC822已经非常古老了,正如引用所指出的那样。事实上,取代822(2822)的RFC也已经过时了,这表明它有多么过时 :) 目前关于电子邮件地址的RFC是5322,发布于本回答的月份! - porges

5

我在几个项目中使用了它的前身,到目前为止还没有遇到任何问题。我建议你去试试。 - Lasar
这个链接仍然有效,但也许是时候进行更新了?它可能已经移动到其他地方,比如GitHub。但是请不要包含“编辑:”、“更新:”或类似的内容——答案应该看起来像是今天写的一样。 - Peter Mortensen

1

Zend_Validate 包含一个电子邮件验证器。

有很多正则表达式可以用来验证 - 从非常基本的到非常高级的都有。 你真的应该选择与你的应用程序中有效电子邮件的重要性相匹配的东西。


0
我建议查看Zend_Validate_EmailAddress的源代码[source]。
一旦您解决了依赖关系,您可以简单地执行以下操作:
$mail_validator = new Zend_Validate_EmailAddress();
$mail_validator->isValid($address);   // returns true or false

最好的方法是通过svn external将完整的Zend库引入您的项目,并将包含路径指向它...
但是,您也可以只下载必要的文件(1,2,3,4,5,6),并将它们全部包含进来(删除require_once调用)。

我尝试了,但不幸的是它没有起作用,我也在这里发布了,你能帮帮我吗?? https://stackoverflow.com/questions/73750016/getting-error-while-using-zend-email-validation-php-fatal-error-uncaught-erro - Mohib Salahuddin Ayubi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接