有没有办法在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,这肯定比我的正则表达式更准确。
如果没有发送电子邮件,那么很难达到100%的准确性,但是如果您在主机上进行DNS查找,这至少可以告诉您它是一个可行的目标系统。
对主机名进行DNS查找,以查看其是否存在。理论上,您也可以启动与邮件服务器的连接,并查看它是否告诉您收件人是否存在,但我认为许多服务器都会假装知道地址,然后无论如何都拒绝电子邮件。
我不是100%确定,但是发送一个RCPT SMTP命令到邮件服务器来确定收件人是否有效,这不是可能的吗?虽然检查有效MX主机的建议比上面的建议更昂贵,但它也是最准确的。
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]+");
}