Apache commons Java中的电子邮件地址验证

Apache commons Java中的电子邮件地址验证,apache-commons,jakarta-mail,Apache Commons,Jakarta Mail,我正在研究检查字符串是否为有效电子邮件地址的最佳方法。我现在专注于两个选项,即使用javax.mail.internet.InternetAddress;或者使用Apache CommonsEmailValidator,它在内部使用复杂的正则表达式解析器 我想知道,在正确性方面,选择一个比另一个有什么好处,或者两者都好?我知道,在某些情况下,InternetAddress不能有效地处理非ascii字符。对于电子邮件地址格式这样公认的格式,这两种方法之间的差异很小。50年前,人们再也没有看到用4位

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


我想知道,在正确性方面,选择一个比另一个有什么好处,或者两者都好?我知道,在某些情况下,
InternetAddress
不能有效地处理非ascii字符。

对于电子邮件地址格式这样公认的格式,这两种方法之间的差异很小。50年前,人们再也没有看到用4位数来编码年份的必要,所以

使用ApacheCommons中的正则表达式的唯一“陷阱”是其验证电子邮件地址的功能不是“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
XXX
似乎是某种注释,或“待办事项”)

您可以使用来自Apache Commons验证程序库的:

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

EmailValidator validator = EmailValidator.getInstance();
if (validator.isValid(email)) {
   // is valid, do something
} else {
   // is invalid, do something
}
isValid方法检查字段是否具有有效的电子邮件地址

根据这个问题,这是最好的Java电子邮件地址验证方法

我刚刚对它进行了测试,显然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 = "test@testy.com";
    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));

    }

}
package com.avaya.oss.server.errors;
导入javax.mail.internet.AddressException;
导入javax.mail.internet.InternetAddress;
导入org.apache.commons.validator.EmailValidator;
公共类TestValidationTypes{
静态字符串电子邮件=”test@testy.com";
静态int最大值=10000;
公共静态void main(字符串[]args)引发AddressException{
长启动=System.currentTimeMillis();
对于(int i=0;i
输出: 电子邮件验证程序持续时间:1195

互联网访问持续时间:67


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

我会使用ApacheCommons,因为我看不出正则表达式验证器有任何问题。除了使用正则表达式之外,我不知道还有什么更好的方法来验证电子邮件地址。是吗?看看谢谢你的链接。您如何知道库在内部没有使用正则表达式来验证电子邮件地址?如果不是,那真的比使用正则表达式好吗?validate()方法没有说明如何执行验证;它只是说“检查了许多规则,但不是所有与RFC 822相关的规则”。我的问题很简单——选择其中一个是否存在任何陷阱?没有任何陷阱,因为我确信两者都能适当地完成任务(验证电子邮件地址)。
user@localhost
被认为是有效的<代码>bla@bla
被认为是有效的<代码>某人@[10.10.1.5]也被视为有效。我想你会想治疗他们。所以我认为花20倍的时间是值得的。对于那些在这几年后遇到困难的人来说,这比这两种选择都要快,也更正确。另外,它是可自定义的,因此您可以使用域文本(如user@localhost)无效。此验证程序允许此电子邮件:##$$$$$%&&***SomeE@scom.com用这个代码<代码>EmailValidator.getInstance(false).isValid(电子邮件)我的坏,根据这是有效的电子邮件,