Java中的EmailAddress验证

时间:2011-08-24 03:06:27

标签: apache-commons javax.mail

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

我想知道在正确性方面挑选一个是否有任何优势,或者两者都很好?我知道InternetAddress在某些情况下不能有效处理非ascii字符的事实。

3 个答案:

答案 0 :(得分:16)

您可以使用Apache Commons Validator库中的EmailValidator

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电子邮件地址验证方法 What is the best Java email address validation method?

答案 1 :(得分:1)

对于像电子邮件地址格式那样完善的东西,两种方法之间的差异是微不足道的。再说,五十年前,人们从未看到过需要使用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 :(得分:0)

我刚测试过,显然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));

    }

}

输出:

EmailValidator持续时间:1195

网络地址持续时间:67

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