java - 在 Java 中验证电子邮件

标签 java email verify

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

我几乎可以肯定,没有 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

这个,我也是在网上找到的。它来自 this link .

如果这两个都通过,那么您很有可能获得一个有效的地址。至于地址是不是自己的(不只是域),是不是满的等等……你真的查不出来。

请注意,第二次检查耗时。它可能需要几毫秒到大于 30 秒的时间(如果 DNS 没有响应并超时)。这不是尝试为大量人实时运行的东西。

希望这会有所帮助。

编辑

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

关于java - 在 Java 中验证电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/153716/

相关文章:

考虑到 gmail 的 + 检查唯一电子邮件的算法

java - 使用两个列表和数据库放入 HashMap

java - 为什么这个线程代码不能在 GUI 中正常工作? [Java Swing] [线程]

java - 用于解析未知长度消息的分隔符(最佳实践?)java

php - 无法使用 PHP 连接到 IMAP

android - 是否可以通过 Android 电子邮件客户端中的视口(viewport)调整图像大小?

java - 使用 @Responsebody 返回列表或从 spring Controller 返回 ModelAndView 哪个更好

email - 如何在 Go 中为电子邮件创建嵌套的多部分/MIME 信封?

vb.net - "Pinging"使用 VB.Net 编码的电子邮件地址

Python 客户端 - SSL 库 - 证书验证失败