有什么方法可以在 Java 代码中验证电子邮件地址是否有效。有效,我不仅仅意味着它的格式正确(someone@domain.subdomain),而是它是一个真正的活动电子邮件地址。
我几乎可以肯定,没有 100% 可靠的方法可以做到这一点,因为这样的技术将是垃圾邮件发送者的梦想。但也许有一些技术可以提供一些有用的指示来判断地址是否“真实”。
这是我周围的东西。要检查地址是否是有效格式,这里有一个正则表达式,它验证它几乎是 rfc2822(它没有捕捉到一些奇怪的极端情况)。去年在网上找到的。
private static final Pattern rfc2822 = Pattern.compile(
"^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$"
);
if (!rfc2822.matcher(email).matches()) {
throw new Exception("Invalid address");
}
这将处理简单的语法(大部分)。我知道的另一项检查将让您检查域是否有 MX 记录。它看起来像这样:
Hashtable<String, String> env = new Hashtable<String, String>();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
DirContext ictx = new InitialDirContext(env);
Attributes attrs = ictx.getAttributes(domainName, new String[] {"MX"});
Attribute attr = attrs.get("MX");
if (attr == null)
// No MX record
else
// If attr.size() > 0, there is an MX record
这个,我也是在网上查到的。它来自这个链接。
如果这两个都通过,那么您很有可能获得一个有效的地址。至于地址是否是自己的(不仅仅是域),它不是完整的,等等......你真的无法检查。
请注意,第二次检查是时间密集型的。它可能需要几毫秒到大于 30 秒的时间(如果 DNS 没有响应并超时)。这不是尝试为大量人实时运行的东西。
希望这可以帮助。
编辑
我想指出,至少代替正则表达式,有更好的方法来检查基本有效性。Don 和 Michael 指出 Apache Commons 有一些东西,我最近发现你可以在 InternetAddress 上使用 .validate() 让 Java 检查地址是否真的是 RFC-8222,这肯定比我的正则表达式更准确。
您无法真正验证电子邮件是否存在,请在此处查看我对非常相似问题的回答:电子邮件 SMTP 验证器
如果不发送电子邮件,可能很难获得 100%,但如果您在主机上进行 DNS 查找,至少应该告诉您它是一个可行的目标系统。
Apache commons 也提供了一个电子邮件验证器类,您可以使用它。只需将您的电子邮件地址作为参数传递给 isValid 方法。
对主机名进行 DNS 查找以查看是否存在。从理论上讲,您也可以启动与邮件服务器的连接,看看它是否告诉您收件人是否存在,但我认为许多服务器假装他们知道一个地址,然后无论如何都会拒绝电子邮件。
您可以确定的唯一方法是实际发送邮件并阅读。
让您的注册过程有一个步骤,需要回复仅在电子邮件中找到的信息。这就是其他人所做的。
我不是 100% 确定,但是否可以向邮件服务器发送RCPT SMTP 命令以确定收件人是否有效?检查有效的 MX 主机会比上面的建议更昂贵,但它也是最准确的。
如果您使用 GWT,则不能使用 InternetAddress,而且 MBCook 提供的模式非常可怕。
这是一个不那么可怕的正则表达式(可能不那么准确):
public static boolean isValidEmail(String emailAddress) {
return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\\.[a-z]+");
}
public static boolean isValidEmail(String emailAddress) {
return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\\.[a-z]+");
}