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 CommonsEmailValidator
,它在内部使用复杂的正则表达式解析器
我想知道,在正确性方面,选择一个比另一个有什么好处,或者两者都好?我知道,在某些情况下,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)
*/
(XXXXXX
似乎是某种注释,或“待办事项”)您可以使用来自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(电子邮件)代码>我的坏,根据这是有效的电子邮件,