验证Java中的电子邮件
有什么方法可以用Java代码验证电子邮件地址是否有效。有效,我不仅意味着它的格式正确([email protected]),而且它是一个真实的活动电子邮件地址。
我几乎可以肯定,没有100%可靠的方法可以做到这一点,因为这种技术将成为垃圾邮件制造者梦the以求的东西。但是也许有些技术可以提供有关地址是否为"真实"的有用指示。
解决方案
如果不发送电子邮件,可能很难获得100%,但是如果我们在主机上进行DNS查找,至少应该告诉我们这是一个可行的目标系统。
在主机名上进行DNS查找,以查看该主机名是否存在。从理论上讲,我们还可以启动与邮件服务器的连接,并查看它是否告诉我们收件人是否存在,但是我认为许多服务器会假装自己知道地址,然后仍然拒绝电子邮件。
这是我的周围。要检查地址是否为有效格式,下面是一个正则表达式,用于验证它是否接近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验证程序