用Java验证电子邮件

时间:2008-09-30 15:59:47

标签: java email verify

有没有办法在Java代码中验证电子邮件地址是否有效。通过有效,我不仅仅意味着它的格式正确(someone@domain.subdomain),但这是一个真正有效的电子邮件地址。

我几乎可以肯定,没有100%可靠的方法可以做到这一点,因为这种技术将成为垃圾邮件制造者的梦想。但也许有一些技术可以提供一些关于地址是否“真实”的有用指示。

9 个答案:

答案 0 :(得分:51)

这就是我所拥有的。要检查地址是否是有效格式,这里有一个正则表达式,它验证它几乎是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

这个,我也在'网上找到了。它来自this link

如果这两个都通过,你很有可能拥有一个有效的地址。至于如果它是自己的地址(不仅仅是域名),它还没有完整等等......你真的无法检查它。

请注意,第二项检查是时间密集型。它可能需要几毫秒到> 30秒(如果DNS没有响应并超时)。对于大量的人来说,尝试和实时运行并不是一件好事。

希望这有帮助。

修改

我想指出,至少代替正则表达式,有更好的方法来检查基本有效性。 Don和Michael指出Apache Commons有一些东西,我最近发现你可以在InternetAddress上使用.validate()让Java检查地址是否真的是RFC-8222,这肯定比我的正则表达式更准确。

答案 1 :(得分:3)

您无法真正确认是否存在电子邮件,请参阅我对此处非常相似问题的回答:Email SMTP validator

答案 2 :(得分:2)

如果不发送电子邮件,可能很难获得100%,但如果您在主机上执行DNS查找,至少应该告诉您它是一个可行的目标系统。

答案 3 :(得分:2)

Apache commons也提供email validator class,您可以使用它。只需将您的电子邮件地址作为参数传递给isValid方法。

答案 4 :(得分:1)

对主机名执行DNS查找以查看是否存在。理论上,您也可以启动与邮件服务器的连接,看看它是否告诉您收件人是否存在,但我认为许多服务器假装他们知道地址,然后拒绝该电子邮件。

答案 5 :(得分:1)

您可以确定的唯一方法是实际发送邮件并将其读取。

让您的注册流程有一个步骤,要求回复仅在电子邮件中找到的信息。这是其他人所做的。

答案 6 :(得分:0)

我不是百分百确定,但是无法向邮件服务器发送 RCPT SMTP命令以确定收件人是否有效?它会比检查有效MX主机的建议更昂贵,但它也是最准确的。

答案 7 :(得分:-1)

如果您正在使用GWT,则无法使用InternetAddress,MBCook提供的模式非常可怕。

这是一个不太可怕的正则表达式(可能不那么准确):

public static boolean isValidEmail(String emailAddress) {
    return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\\.[a-z]+");
}

答案 8 :(得分:-2)

public static boolean isValidEmail(String emailAddress) {
    return emailAddress.contains(" ") == false && emailAddress.matches(".+@.+\\.[a-z]+");
}