Java中有哪些好的电子邮件地址验证库?有任何替代公共验证器的方法吗?


当前回答

尽管有许多替代Apache commons的方法,但它们的实现充其量只是基本的(就像Apache commons的实现本身一样),在其他情况下甚至是完全错误的。

我也会远离所谓的简单的“非限制性”正则表达式;没有这样的事。例如,@根据上下文被允许多次使用,你怎么知道需要的那个在那里?简单的正则表达式无法理解它,即使电子邮件应该是有效的。任何更复杂的东西都很容易出错,甚至包含隐藏的性能杀手。你要怎么维护这样的东西?

我所知道的唯一一个全面的RFC兼容的基于regex的验证器是email-rfc2822-validator,它的“精炼”regex适当地命名为Dragons.java。它只支持较旧的RFC-2822规范,尽管它足够满足现代需求(RFC-5322在日常使用范围之外的地方更新了它)。

但真正需要的是一个词法分析器,它可以正确地解析字符串,并根据RFC语法将其分解为组件结构。EmailValidator4J在这方面似乎很有前途,但仍然很年轻,而且有局限性。

另一种选择是使用webservice,比如Mailgun经过实战测试的验证webservice或Mailboxlayer API(只使用第一个谷歌结果)。它不是严格的RFC兼容,但是对于现代需求来说已经足够好了。

其他回答

下面是我的实用方法,我只需要使用RFC中允许的字符合理地区分blah@domain地址。地址必须事先转换为小写。

public class EmailAddressValidator {

    private static final String domainChars = "a-z0-9\\-";
    private static final String atomChars = "a-z0-9\\Q!#$%&'*+-/=?^_`{|}~\\E";
    private static final String emailRegex = "^" + dot(atomChars) + "@" + dot(domainChars) + "$";
    private static final Pattern emailPattern = Pattern.compile(emailRegex);

    private static String dot(String chars) {
        return "[" + chars + "]+(?:\\.[" + chars + "]+)*";
    }

    public static boolean isValidEmailAddress(String address) {
        return address != null && emailPattern.matcher(address).matches();
    }

}

尽管有许多替代Apache commons的方法,但它们的实现充其量只是基本的(就像Apache commons的实现本身一样),在其他情况下甚至是完全错误的。

我也会远离所谓的简单的“非限制性”正则表达式;没有这样的事。例如,@根据上下文被允许多次使用,你怎么知道需要的那个在那里?简单的正则表达式无法理解它,即使电子邮件应该是有效的。任何更复杂的东西都很容易出错,甚至包含隐藏的性能杀手。你要怎么维护这样的东西?

我所知道的唯一一个全面的RFC兼容的基于regex的验证器是email-rfc2822-validator,它的“精炼”regex适当地命名为Dragons.java。它只支持较旧的RFC-2822规范,尽管它足够满足现代需求(RFC-5322在日常使用范围之外的地方更新了它)。

但真正需要的是一个词法分析器,它可以正确地解析字符串,并根据RFC语法将其分解为组件结构。EmailValidator4J在这方面似乎很有前途,但仍然很年轻,而且有局限性。

另一种选择是使用webservice,比如Mailgun经过实战测试的验证webservice或Mailboxlayer API(只使用第一个谷歌结果)。它不是严格的RFC兼容,但是对于现代需求来说已经足够好了。

Apache Commons通常被认为是一个可靠的项目。但是请记住,如果你想确保它是一个真实的电子邮件,并且所有者希望它在你的网站上使用,你仍然需要发送一封验证邮件到这个地址。

编辑:有一个错误,它对域名的限制太大,导致它不接受来自新顶级域名的有效电子邮件。 此错误已于03/Jan/15 02:48在common -validator版本1.4.1中解决

我只是想知道为什么没有人从Hibernate Validator的附加约束中想出@Email。验证器本身就是EmailValidator。

public class Validations {

    private Pattern regexPattern;
    private Matcher regMatcher;

    public String validateEmailAddress(String emailAddress) {

        regexPattern = Pattern.compile("^[(a-zA-Z-0-9-\\_\\+\\.)]+@[(a-z-A-z)]+\\.[(a-zA-z)]{2,3}$");
        regMatcher   = regexPattern.matcher(emailAddress);
        if(regMatcher.matches()) {
            return "Valid Email Address";
        } else {
            return "Invalid Email Address";
        }
    }

    public String validateMobileNumber(String mobileNumber) {
        regexPattern = Pattern.compile("^\\+[0-9]{2,3}+-[0-9]{10}$");
        regMatcher   = regexPattern.matcher(mobileNumber);
        if(regMatcher.matches()) {
            return "Valid Mobile Number";
        } else {
            return "Invalid Mobile Number";
        }
    }

    public static void main(String[] args) {

        String emailAddress = "suryaprakash.pisay@gmail.com";
        String mobileNumber = "+91-9986571622";
        Validations validations = new Validations();
        System.out.println(validations.validateEmailAddress(emailAddress));
        System.out.println(validations.validateMobileNumber(mobileNumber));
    }
}