Java 中的电子邮件地址验证

问题描述 投票:0回答:3

我正在研究检查

String
是否是有效电子邮件地址的最佳方法。我现在专注于两个选项,即使用
javax.mail.internet.InternetAddress
;或者使用 Apache Commons
EmailValidator
,它内部使用复杂的正则表达式解析器。

我想知道在正确性方面选择其中之一是否有任何优势,或者两者都很好?我知道

InternetAddress
在某些情况下不能有效地处理非 ASCII 字符。

apache-commons jakarta-mail
3个回答
31
投票

已关闭问题什么是最好的Java电子邮件地址验证方法?收到了几个答案,虽然一些人假装提供了最好的方法,但也有一些人提出了Apache Commons Validator。您可以使用此库中的EmailValidator,如下所示:

import org.apache.commons.validator.routines.EmailValidator;
...

EmailValidator validator = EmailValidator.getInstance();
if (validator.isValid(email)) {
   // is valid, do something
} else {
   // is invalid, do something
}

isValid
方法检查字符串是否是有效的电子邮件地址。

警告

截至 2024 年,从 Commons Validator 版本 1.6 甚至更早版本开始,包括最新版本 1.8.0,验证不够严格,至少如果您期望遵守 RFC 5321。所谓的“国际化电子邮件地址”仅根据拟议标准 RFC 6530 有效,例如

françois@lévêque.net
,也被报告为有效。正如 EmailValidator JavaDoc 所示:

此实现不能保证捕获电子邮件地址中所有可能的错误。


2
投票

对于像电子邮件地址格式这样成熟的东西,两种方法之间的差异微乎其微。话又说回来,五十年前,人们从未见过需要使用 4 位数字来编码年份,所以...

使用 Apache Commons 中的正则表达式的唯一“陷阱”是,其验证电子邮件地址的功能不是“Java 标准”。作为一名开发人员,这对您有何影响?取决于你有多偏执。

另一方面,标准 Java 实现的效率可能较低。您必须构造一个

InternetAddress
并验证它。查看 JavaMail 的源代码,我可以看到:

/**
 * Check that the address is a valid "mailbox" per RFC822.
 * (We also allow simple names.)
 *
 * XXX - much more to check
 * XXX - doesn't handle domain-literals properly (but no one uses them)
 */

XXX
似乎是某种注释,或“待办事项”)


2
投票

我刚刚测试过它,显然 InternetAddress 上的性能大大比使用 EmailValidator 更好

package com.avaya.oss.server.errors;

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

import org.apache.commons.validator.EmailValidator;

public class TestValidationTypes {

    static String email = "[email protected]";
    static int maxItr = 10000;

    public static void main(String[] args) throws AddressException {

        long start = System.currentTimeMillis();
        for (int i = 0; i < maxItr; i++) {
            EmailValidator.getInstance().isValid(email);
        }
        System.out.println("EmailValidator duration: " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        for (int i = 0; i < maxItr; i++) {
            InternetAddress internetAddress = new InternetAddress(email);
            internetAddress.validate();
        }
        System.out.println("InternetAdress duration: " + (System.currentTimeMillis() - start));

    }

}

输出:

电子邮件验证器持续时间:1195

互联网地址持续时间:67

结果是 EmailValidator 花费了约 20 倍的时间:

© www.soinside.com 2019 - 2024. All rights reserved.