1

我们正在使用以下验证代码来检查由 Lotus Notes 驱动的 Web 表单上的有效电子邮件地址格式:

@If((@ValidateInternetAddress([Address821]; @ThisValue)!="" 
| @Contains(@ThisValue; "\"") | @Contains(@ThisValue; "'") 
| @Contains(@ThisValue; " ")); "Please include a valid email address."; "");

目前,如果用户输入以下任何输入,验证将引发错误消息:

  • 空场
  • " "、' 或 / 字符
  • 电子邮件的域部分:“test.com”
  • 只要 @

但是,如果用户输入test@test,则表单会将此验证为有效的电子邮件地址格式。

这种格式是否被认为是有效的“Address821”格式?或者表单是否将错误的格式验证为有效的电子邮件地址?

4

1 回答 1

1

是的,按照过去和当前的标准,它在技术上是有效的地址语法。

RFC 中的语言随着时间的推移而演变:

RFC-821:3.7。域

域是最近在 ARPA Internet 邮件系统中引入的概念。域的使用将地址空间从简单字符串主机名的平面全局空间更改为全局地址的层次结构根树。主机名由域和主机指示符替换,域和主机指示符是由句点分隔的域元素字符串序列,域元素按从最具体到最一般的顺序排列。

这不是很精确。它没有明确规定域名中必须有多个元素,但也没有明确禁止。但这已被淘汰:

RFC-2821:2.3.5 域

域(或域名)由一个或多个点分隔的
组件组成。... 如本文档和 [22] 中所述,域名是完整的、完全限定的名称(通常称为“FQDN”)。非 FQDN 形式的域名只不过是本地别名。本地别名不得出现在任何 SMTP 事务中。

这似乎是在说这是非法的,但实际上并不是这样。我将在下面进行解释,但首先让我们看一下旨在淘汰 2821 的标准草案,它澄清了很多事情:

RFC-5321 2.3.5 域名

域名(或通常只是一个“域”)由一个或多个组件组成,如果出现多个组件,则以点分隔。在电子邮件地址中单独使用顶级域的情况下,使用单个字符串,不带任何点。这使得在公共 Internet 上的 SMTP 事务中只出现完全限定域名的要求(下文将详细描述)在涉及顶级域的情况下尤为重要。... 如本文档和 RFC 1035 [2] 中所述,域名是完整的、完全限定的名称(通常称为“FQDN”)。非 FQDN 形式的域名只不过是本地别名。本地别名不得出现在任何 SMTP 事务中。

这清楚地表明,域名中不需要点,只要它是顶级域。

@ValidateInternetAddress 无法合理地知道“test”是否是有效的顶级域。即使 IBM 在已批准的公共 TLD 列表中进行了编程(恕我直言,这是一个坏主意,因为它可以而且确实会改变),您实际上可以在您自己的 DNS 中设置一个称为“测试”的私有 TLD。这与标准确实禁止的“本地别名”不同。没有针对实际 TLD 的规则。

就此而言,它甚至可以是一个公共 TLD。理论上,TLD 的所有者可以为 TLD 设置邮件服务器。即,President@US 或 Queen@UK。不太可能,但在这些情况下是可能的,但是随着所有新 TLD 的上线,如果某些注册商使用 info@domain,我不会感到惊讶。

I guess theoretically @ValidateInternetAddress could make the DNS call to check whether it can resolve "test" as a TLD, but the doc for that function only says that it checks the syntax of the address, and the existence of the TLD is a semantic issue, not a syntax issue.

于 2012-09-19T22:20:48.827 回答