电子邮件地址验证 [重复]

Posted

技术标签:

【中文标题】电子邮件地址验证 [重复]【英文标题】:email address validation [duplicate] 【发布时间】:2010-11-04 18:11:24 【问题描述】:

可能的重复:Is there a php library for email address validation?How to check if an email address exists without sending an email?

大家好,

我怎样才能像雅虎一样向电子邮件提供商验证电子邮件地址?

场景:

asdfasdf@yahoo.com

我如何向 yahoo.com 验证上述电子邮件是否有效?

提前致谢。

---- PHP 规则----

【问题讨论】:

我认为这个问题的措辞有些误导​​。请注意,这是为了检查邮箱地址是否真实存在,而不仅仅是邮箱地址的格式。 是的,标题应该类似于“使用提供商或域或来源验证电子邮件的真实性” 对不起,我不知道那个词是什么... 以前有人问过这个问题:***.com/questions/565504/… 【参考方案1】:

验证电子邮件的唯一“正确”方法是实际尝试向该地址发送电子邮件,但大多数情况下正则表达式可以解决问题。

为了使问题复杂化,您可能只需要像这样的简单验证

^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]2,6$

或者像这样更复杂的一个

[a-z0-9!#$%&'*+/=?^_`|~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`|~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]2|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b

有一篇关于电子邮件验证的不错的文章here

【讨论】:

问题不在于电子邮件的格式。如果电子邮件地址在电子邮件提供商(如 yahoo.com)上有效,则验证来自电子邮件地址。 没关系...顺便感谢您的回复----PHP规则----【参考方案2】:

与服务器建立 SMTP 连接,并进行“发件人验证”查找:

telnet <Yahoo MX> 25
helo here.com
mail from: here@there.com
rcpt to: asdfasdf@yahoo.com
data

您将获得继续传输的代码,或者收到无效的收件人消息。

【讨论】:

我想您会发现这通常不起作用,因为垃圾邮件发送者会使用它来验证电子邮件地址。 实际上这很常见 - 很多邮件服务器(如 Exim) - 在接受新邮件之前使用它来验证发件人。我运行一个大型邮件平台,每条消息都以这种方式进行验证。 如果您这样做,请不要忘记按照 SMTP 标准的要求在电子邮件地址周围使用尖括号:mail from: cletus 是对的,大多数主要的邮件提供商(包括 yahoo、iirc)都会响应这样的任何请求,无论该电子邮件是否存在于该域下,总是得到肯定的结果或总是得到否定的结果.唯一可靠的方法是发送确认电子邮件。 赞成,因为到目前为止看来,发件人地址验证是(唯一!)正确答案。但是,我建议尝试找到一个库来执行 SAV,或者至少执行 SMTP。像上面这样的简单连接在很多情况下都会失败:你应该在启动“MAIL FROM”之前等待EHLO响应,如果你继续提交数据,很多邮件服务器会断开连接; “here.com”应该是您主机的正确 FQDN。不需要“DATA”——如果 RCPT TO 成功,地址就可以了。您应该缓存响应以避免服务器崩溃。【参考方案3】:

希望以下文档对您有所帮助:

Validate an E-Mail Address with PHP, the Right Way

【讨论】:

感谢您的链接先生... ---- PHP 规则 ---- 当心这篇文章!阅读 cmets!【参考方案4】:

通过 SOAP 调用、GET 或 POST 使用此免费 Web 服务。你需要做的就是给它一个电子邮件地址,它会返回一个布尔值,表示它是否是一个实际的、可交付的电子邮件地址:

http://www.webservicex.net/ValidateEmail.asmx?op=IsValidEmail

【讨论】:

哦,太好了,不道德的垃圾邮件发送者获取有效电子邮件地址的另一种方式。 我刚刚测试了该服务,它似乎可以工作。【参考方案5】:

查找该电子邮件地址的 MX 记录。

【讨论】:

【参考方案6】:

那里有许多垃圾邮件/垃圾邮件 (www.spam.la),可让您接收到任何地址的邮件。因此,我建议不要依赖通常意义上的“有效”电子邮件。也许OpenID 是一个选项?为了检查“有效”格式,您可以利用现有功能,如filter_var()/FILTER_VALIDATE_EMAIL。

【讨论】:

【参考方案7】:

以下正则表达式匹配电子邮件地址:

^([\w-\.]+)@((\[[0–9]1,3\.[0–9]1,3\.[0–9]1,3\.)|(([\w-]+\.)+))
([a-zA-Z]2,4|[0–9]1,3)(\]?)$

rashmipandit@gmail.com - 有效

rashmi.pandit@gmail.com - 有效

rashmi_pandit@gmail.com - 有效

rashmi.pandit@gmail - 无效

rashmi+pandit@gmail.com - 无效

如果您想按照 RFC 指南进行更复杂的操作,可以使用这个:

^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`\|~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`\|~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$

【讨论】:

这将拒绝有效的电子邮件地址,包括那些带有加号和下划线字符的地址。 _ 是允许的,第二种模式是根据 RFC 指南。【参考方案8】:

您可以向该地址发送电子邮件,并让用户通过单击链接进行验证。

【讨论】:

有时显而易见的解决方案是最好的 :) 正如在其他答案中所讨论的,任何其他(自动)方式都可能会立即被垃圾邮件发送者滥用,因此不会起作用。【参考方案9】:

上面的大多数答案都着眼于电子邮件地址的正则表达式检查。要实际查看电子邮件地址是否有效,您需要连接到 SMTP 服务器并向其发送命令。 All details and PHP code is available here。

谨慎使用,如果您发送大量请求,雅虎服务器可能会阻止您。此外,强烈建议将其与其他人描述的正则表达式一起使用。

【讨论】:

以上是关于电子邮件地址验证 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 jquery 验证电子邮件地址 [重复]

iOS中电子邮件地址的正则表达式验证并检查空白条目[重复]

C# MVC 4 应用程序中的电子邮件地址验证:使用或不使用正则表达式 [重复]

电子邮件地址的最大字符数限制 [重复]

检查电子邮件地址是不是存在[重复]

验证没有模型的电子邮件蛋糕 1.2 [重复]