验证Java中的电子邮件

时间:2020-03-06 14:55:50  来源:igfitidea点击:

有什么方法可以用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验证程序