根据 Apache 文档,他们的电子邮件验证遵循 RFC 822 规范。
EmailValidator 根据 RFC 822 标准提供电子邮件地址验证。 来源
但是,在本地运行一些测试时,我发现某些 TLD 被接受为域名。
test@test //invalid
[email protected] //valid
test@com //valid
test@comm //invalid
test@amsterdam //valid
test@brussels //valid
我想我在 RFC 中的某个地方读到
<local>@<domain>
是一个有效的电子邮件地址,但强烈建议不要使用(..因此应该被视为无效?)。所以我知道 test@test
无效,但 test@amsterdam
有效,因为 .amsterdam
是有效的 gTLD。
不确定这是否是一个错误或者是否是有意为之。从他们的实现和文档来看,不清楚什么应该是有效的,以及它是否 100% 符合 RFC 822 规范。
class Test {
EmailValidator validator = EmailValidator.getInstance(false, true);
@ParameterizedTest
@ValueSource(strings = {
"test@test",
"[email protected]",
"test@com",
"test@comm",
"test@amsterdam",
"test@brussels"
})
void emails(String email) {
System.out.printf("%-20s valid? %s%n", email, validator.isValid(email));
}
}
我似乎也不明白的是
allowLocal
构造函数中的参数 allowTld
和
EmailValidator
的作用
我想说这是故意的。您可以通过提供您提到的参数来调整验证。
根据 https://www.icann.org/en/announcements/details/new-gtld-dotless-domain-names-prohibited-30-8-2013-en 禁止无点域名。
作为参数的解释:
allowLocal
- 将允许本地域,例如 mail@somenotexistingtld
allowTld
- 将允许顶级域名,例如 mail@com
要获得真正准确的 RFC822 验证,您需要将两者设置为
true
。但在现实生活中,我想说的是,在大多数情况下,它们将被省略或设置为 false
。