在 Java 中验证电子邮件
有没有办法在Java代码中验证电子邮件地址是否有效。通过有效,我不仅意味着它采用正确的格式(someone@domain.subdomain),而且这是一个真正有效的电子邮件地址。
我几乎可以肯定,没有100%可靠的方法来做到这一点,因为这样的技术将是垃圾邮件发送者梦想的东西。但也许有一些技术可以给出一些关于地址是否“真实”的有用指示。
有没有办法在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,这当然比我的正则表达式更准确。