电子邮件地址验证 [重复]
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:希望以下文档对您有所帮助:
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。
谨慎使用,如果您发送大量请求,雅虎服务器可能会阻止您。此外,强烈建议将其与其他人描述的正则表达式一起使用。
【讨论】:
以上是关于电子邮件地址验证 [重复]的主要内容,如果未能解决你的问题,请参考以下文章