我正在研究检查
String
是否是有效电子邮件地址的最佳方法。我现在专注于两个选项,即使用 javax.mail.internet.InternetAddress
;或者使用 Apache Commons EmailValidator
,它内部使用复杂的正则表达式解析器。
我想知道在正确性方面选择其中之一是否有任何优势,或者两者都很好?我知道
InternetAddress
在某些情况下不能有效地处理非 ASCII 字符。
已关闭问题什么是最好的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 所示:
此实现不能保证捕获电子邮件地址中所有可能的错误。
对于像电子邮件地址格式这样成熟的东西,两种方法之间的差异微乎其微。话又说回来,五十年前,人们从未见过需要使用 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
似乎是某种注释,或“待办事项”)
我刚刚测试过它,显然 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 倍的时间: