【问题标题】:Allow user@example or user@localhost in email validation?在电子邮件验证中允许 user@example 或 user@localhost?
【发布时间】:2010-09-10 04:03:15
【问题描述】:
我正在进行电子邮件验证检查,我们需要决定是否允许将 user@localhost 和 user@example(注意没有 .anything)验证为有效的电子邮件地址。这适用于一个开源项目,该项目在整个 Web 和 Intranet 上都有许多用例。
RFC 2822(Internet 消息格式标准)允许它,但 RFC 2821(SMTP 标准)说它应该失败。
想法?
【问题讨论】:
标签:
php
email
web-applications
【解决方案1】:
这取决于您的应用程序。如果你认为你的几个用户会有一个电子邮件@localhost,你不介意。那就去吧。
【解决方案2】:
让它成为一个可配置的选项,这样人们就可以自己决定。我个人默认会失败,因为我还没有遇到过一个案例 - 内部网或公共互联网 - 我已经有人使用了有效的 user@localhost 类型的地址。
【解决方案3】:
我会禁用它。很少有组织使用内部域,而那些通常使用“acme.localhost”或“intranet.com”或其他类似名称的组织。在 DNS 中进行了某种配置以使其正常工作。
无论如何,内部电子邮件几乎已经死了:随着即时通讯、Twitter 和 SMS 的出现,以及公司每个成员越来越多地使用外部电子邮件,您几乎完全有可能永远不会获得 TLD - 电子邮件中的无域。
对于确实需要它的人,他们总是可以自己调整正则表达式,因为他们足够精明,可以设置自定义主机名来处理内部电子邮件。
【解决方案4】:
好吧,如果您在内部使用 DNS,您可以随时进行 DNS 查找。
但如果使用 SMTP 会失败,那么我建议您确保不要包含它。
【解决方案5】:
我看到过 user@localhost 形式的电子邮件地址,通常是在查看邮件列表的存档时,以及从同一台机器托管和发布的管理员。所以它肯定会发生 - 我承认它打破了我的解析程序!所以现在我对电子邮件地址更加灵活了。
【解决方案6】:
看起来您似乎需要进行两次详细的快速检查:
<?php
function valid_email($email) {
// First, we check that there's one @ symbol, and that the lengths are right
if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
// Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
return false;
}
// take a given email address and split it into the username and domain.
list($userName, $mailDomain) = split("@", $email);
if (checkdnsrr($mailDomain, "MX")) {
// this is a valid email domain!
return true;
}
else {
// this email domain doesn't exist!
return false;
}
}
?>
(source 1, source 2)