【问题标题】:Notes Formula Language "@ValidateInternetAddress" Failing to Validate Properly?注释 公式语言“@ValidateInternetAddress”无法正确验证?
【发布时间】:2012-09-12 05:26:42
【问题描述】:

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

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

目前,如果用户输入以下任何输入,验证会抛出错误消息:

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

然而,如果用户输入 test@test,表单会验证这是一个有效的电子邮件地址格式。

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

【问题讨论】:

  • 我只测试了@ValidateInternetAddress 函数,你是对的,“test@example”确实返回了一个空字符串,它表示一个有效的地址。我查看了tools.ietf.org/html/rfc821,但找不到任何地址格式规范。我假设理论上可能存在使用该格式的有效地址。 RFC 821 已被 RFC 2821 取代,但我认为 Notes 公式语言没有更新。
  • 我会使用 Javascript 正则表达式来检查地址,将其放在字段的 onBlur 事件上(正如您所说,这是一个 Web 应用程序)。即使 regexp 也不是 100% 可靠的,那里有一些非常不寻常的地址,但您应该能够涵盖大多数情况。
  • 很遗憾,我们无法将 js 引入这种遗留形式。
  • 这似乎是@ValidateInternetAddress 公式的问题。请参阅:www-10.lotus.com/ldd/nd6forum.nsf/…lekkimworld.com/2007/06/20/…
  • 我想那是一个错误。我不认为你可以期望它得到修复,但提交 PMR 可能不会对你造成伤害。为什么不能引入Javascript?特别是正如您所说,这是一个网络表单。只需将代码添加到 onBlur 并在地址无效时向用户显示一条消息。与您尝试使用@Formula 所做的没有什么不同,只是另一种语言......

标签: email lotus-notes email-validation lotus-formula rfc822


【解决方案1】:

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

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

RFC-821:3.7。域

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

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

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,我不会感到惊讶。

我猜理论上@ValidateInternetAddress 可以进行 DNS 调用以检查它是否可以将“测试”解析为 TLD,但该函数的文档只说它检查地址的语法,并且 TLD 的存在是语义问题,而不是语法问题。

【讨论】:

  • 谢谢。这正是我无法找到的信息。
  • 我确实花了太多时间研究 RFC,但很高兴它对您有所帮助 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多