Java中有哪些好的电子邮件地址验证库?有任何替代公共验证器的方法吗?
当前回答
Apache Commons通常被认为是一个可靠的项目。但是请记住,如果你想确保它是一个真实的电子邮件,并且所有者希望它在你的网站上使用,你仍然需要发送一封验证邮件到这个地址。
编辑:有一个错误,它对域名的限制太大,导致它不接受来自新顶级域名的有效电子邮件。 此错误已于03/Jan/15 02:48在common -validator版本1.4.1中解决
其他回答
尽管有许多替代Apache commons的方法,但它们的实现充其量只是基本的(就像Apache commons的实现本身一样),在其他情况下甚至是完全错误的。
我也会远离所谓的简单的“非限制性”正则表达式;没有这样的事。例如,@根据上下文被允许多次使用,你怎么知道需要的那个在那里?简单的正则表达式无法理解它,即使电子邮件应该是有效的。任何更复杂的东西都很容易出错,甚至包含隐藏的性能杀手。你要怎么维护这样的东西?
我所知道的唯一一个全面的RFC兼容的基于regex的验证器是email-rfc2822-validator,它的“精炼”regex适当地命名为Dragons.java。它只支持较旧的RFC-2822规范,尽管它足够满足现代需求(RFC-5322在日常使用范围之外的地方更新了它)。
但真正需要的是一个词法分析器,它可以正确地解析字符串,并根据RFC语法将其分解为组件结构。EmailValidator4J在这方面似乎很有前途,但仍然很年轻,而且有局限性。
另一种选择是使用webservice,比如Mailgun经过实战测试的验证webservice或Mailboxlayer API(只使用第一个谷歌结果)。它不是严格的RFC兼容,但是对于现代需求来说已经足够好了。
Les Hazlewood使用Java正则表达式编写了一个非常完整的符合RFC 2822的电子邮件验证器类。你可以在http://www.leshazlewood.com/?p=23上找到它。然而,它的彻底性(或Java RE实现)导致效率低下——阅读关于长地址解析时间的注释。
似乎没有任何完美的库或方法可以自己做到这一点,除非您必须有时间向电子邮件地址发送电子邮件并等待回复(尽管这可能不是一个选项)。我最终使用了这里的一个建议http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/,并调整了代码,使其可以在Java中工作。
public static boolean isValidEmailAddress(String email) {
boolean stricterFilter = true;
String stricterFilterString = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
String laxString = ".+@.+\\.[A-Za-z]{2}[A-Za-z]*";
String emailRegex = stricterFilter ? stricterFilterString : laxString;
java.util.regex.Pattern p = java.util.regex.Pattern.compile(emailRegex);
java.util.regex.Matcher m = p.matcher(email);
return m.matches();
}
另一种选择是使用Hibernate电子邮件验证器,使用注释@Email或以编程方式使用验证器类,例如:
import org.hibernate.validator.internal.constraintvalidators.hv.EmailValidator;
class Validator {
// code
private boolean isValidEmail(String email) {
EmailValidator emailValidator = new EmailValidator();
return emailValidator.isValid(email, null);
}
}
如果您希望验证电子邮件地址是否有效,那么VRFY将为您提供一些方法。我发现它对于验证内网地址(即内部站点的电子邮件地址)很有用。然而,它对互联网邮件服务器的用处不大(请参阅本页顶部的警告)
推荐文章
- .toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?
- Hibernate中不同的保存方法之间有什么区别?
- Java 8流和数组操作
- Java Regex捕获组
- Openssl不被视为内部或外部命令
- 如何添加自定义方法到Spring Data JPA
- 如何在Ubuntu中设置Java环境路径
- 无法执行dex:在Eclipse中超过GC开销限制
- 有人能解释一下JPA和Hibernate中的mappedBy吗?
- 是什么导致JNI调用变慢?
- Java中的&和&&有什么区别?
- 使用Java的Collections.singletonList()?
- Maven使用多个src目录编译
- 导入时无法解析符号
- 用谓词限制流