我正在进行电子邮件验证检查,我们需要决定是否允许将 user@localhost 和 user@example(注意没有 .anything)验证为有效的电子邮件地址。这适用于一个开源项目,该项目在大型 Web 和 Intranet 上都有许多用例。
RFC 2822(互联网消息格式标准)允许它,但RFC 2821(SMTP 标准)说它应该失败。
想法?
我会禁用它。很少有组织使用内部域,而那些通常使用“acme.localhost”或“intranet.com”或其他类似名称的组织。他们使用 DNS 进行某种配置以使其正常工作。
无论如何,内部电子邮件几乎已经死了:随着即时消息、Twitter 和 SMS 的出现以及公司每个成员的外部电子邮件可用性的增加,您几乎完全有可能永远不会获得无 TLD 的域在一封电子邮件中。
对于确实需要它的人,他们总是可以自己调整正则表达式,因为他们足够精明,可以设置自定义主机名来处理内部电子邮件。
这取决于您的应用程序。如果你认为你的几个用户会有一个电子邮件@localhost,你不介意。然后去吧。
让它成为一个可配置的选项,这样人们就可以自己决定。我个人默认它是失败的,因为我还没有遇到过一个案例——内联网或公共互联网——我让有人使用了有效的 user@localhost 类型的地址。
看看这个,您似乎需要两个详细的快速检查:
<?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;
}
}
?>
好吧,如果您有 DNS 在内部工作,您总是可以只进行 DNS 查找。
但是,如果使用 SMTP 会失败,那么我建议确保您不包含它。
我见过 user@localhost 形式的电子邮件地址,通常是在查看邮件列表的存档时,并且管理员在同一台机器上托管和发布。所以它肯定会发生 - 我承认它打破了我的解析程序!所以现在我对电子邮件地址更加灵活了。