Java InternetAddress未正确验证电子邮件
我有一个方法来验证emailAddressJava InternetAddress未正确验证电子邮件,java,Java,我有一个方法来验证emailAddress public boolean isValidEmailAddress(String email) { boolean result = true; try { InternetAddress emailAddr = new InternetAddress(java.net.IDN.toASCII(email)); emailAddr.validate();
public boolean isValidEmailAddress(String email) {
boolean result = true;
try {
InternetAddress emailAddr = new InternetAddress(java.net.IDN.toASCII(email));
emailAddr.validate();
} catch (AddressException ex) {
result = false;
}
return result;
}
我编写了一个单元测试,它接受abce@cdf,它不是在找.com什么的
Assert.assertEquals(
new CustomRuleEmailService().isValidEmailAddress("abc@cdf"),
false
);
返回
true
而不是false
当您检查JavaDoc中的InternetAddress.validate()
时,您可以看到:
验证此地址是否符合RFC 822的语法规则
在wiki中,电子邮件地址描述为:
电子邮件地址通常被认为由两部分组成
带有at标志(@),尽管技术规范在RFC中有详细说明
822和随后的RFC更广泛
所以当
foo@server
从技术上讲是一个合法的电子邮件地址,将地址限制在“真实域”下是完全可行的
现在“真实域”的定义是不平凡且不断变化的,所以我不会试图自己编写一个,而是依赖现有的代码
例如,Guava提供了一个InternetDomainName
类,该类提供了一个可接受foo.com
、foo.bar.com
和example.accounter
的类,但拒绝foo。这不是TLD
或只是foo
也对问题和可能的解决方案有很好的解释。为什么会这样?电子邮件本质上是user@server服务器可能是本地网络上的一个服务器,它只能通过主机名而不是完整的域名来识别。继续进行简单的
regex
验证。试试这个publicstaticfinal模式VALID\u EMAIL\u ADDRESS\u REGEX=Pattern.compile(“^[A-Z0-9.\u%+-]+@[A-Z0-9.-+\.[A-Z]{2,6}$”,模式不区分大小写)代码>abce@cdf
无效。这里没有需要解决的问题。正如@KonradBotor已经说过的:电子邮件地址是user@server,以便user@192.168.1.1也是valid@PhillAlexakis:.accountary
是您的正则表达式将拒绝的有效TLD。此外,本地化TLD的代码编码版本太长,您选择的字符组将禁止使用非编码版本。我想说的是,互联网在不断发展,像这样的正则表达式方法在某种程度上总是会有缺陷。