Java InternetAddress未正确验证电子邮件

Java InternetAddress未正确验证电子邮件,java,Java,我有一个方法来验证emailAddress public boolean isValidEmailAddress(String email) { boolean result = true; try { InternetAddress emailAddr = new InternetAddress(java.net.IDN.toASCII(email)); emailAddr.validate();

我有一个方法来验证emailAddress

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的代码编码版本太长,您选择的字符组将禁止使用非编码版本。我想说的是,互联网在不断发展,像这样的正则表达式方法在某种程度上总是会有缺陷。