EmailAddressAttribute允许结尾的点

.NET 4.6.1中的EmailAddressAttribute允许结尾点。 这意味着关注电子邮件:someone@google.com。 已validation。 对于Microsoft,此电子邮件有效。 但是,例如,对于PayPal,电子邮件无效。

那么有人知道,电子邮件末尾的点是否有效?

好吧,因为我没有找到任何相关的文档,我检查了EmailAddressAttribute的来源,看看是否有任何评论解释是否

someone@google.com

被认为是有效的,但我没有找到关于此的评论。

我找到的是这个正则表达式,用于确定地址是否无效:

 ^((([az]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([az]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)* (\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]| [\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09 \x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)* (\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([az]|\d| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([az]|\d| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([az]|\d|-|\.|_|~| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([az]|\d| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([az]| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([az]| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([az]|\d|-|\.|_|~| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([az]| [\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$ 

这显然很长​​。 然而,有趣的部分是最后的一小部分:

 \.? 

这意味着匹配0和1“。” 人物

因此,我觉得它是故意构建的,以句点结尾的电子邮件地址被认为是有效的,虽然我没有找到任何外部资源来确定任何电子邮件提供商是否实际允许以句点结尾的电子邮件地址。

对于validation,我建议不要仅仅依赖于EmailAddressAttribute ,而是要创建自己的validation器(因为EmailAddressAttributesealed ,你不能派生自己的属性),这看起来有点像这样:

 public bool IsValidEmailAddress(string email) { var emailValidator = new EmailAddressAttribute(); return emailValidator.IsValid(email) && !String.EndsWith("."); } 

在上面的代码中,该属性用于提供基本的检查实现,并且!String.EndsWith(".")负责错误地确定为具有尾随句点的有效的电子邮件地址。


TL; DR:明确的答案似乎是Yannick Meeus写的:

尾随期是合法的,但有效性由邮件提供商定义。

因此,微软似乎已经符合规则,即使实际上只有少数(没有?)邮件提供商允许一个尾随时期。 所以你必须决定你是否也确认正式规则并允许尾随“。” 或者如果你想要排除它(如上面的示例代码所示)。

关于这是合法的还是有效的,有很多竞争信息。 这是两种不同的观点,我将尝试解释一下为什么。

电子邮件地址部分由RFC 5322 – 互联网邮件格式描述,该格式以极其详细的方式解释电子邮件格式。

在3.4.1节- Addr-spec中 ,解释了电子邮件地址格式。 我是为了简洁而解释,但一般格式是:

本地部分@域名

使用local-name描述为以下dot-atom / quoted-string / obs-local-part和域之一,描述为dot-atom / domain-literal / obs-domain

所以它是一个域名,在RFC 1034 – 域名 – 概念和设施中描述 。

域名可以是不明确的或明确的,其由尾随点的不存在或存在来定义。 不保证模糊域名可以解析到一个位置,但是大多数(如果不是全部的话)DNS搜索列表会在幕后附加一段时间(如果不存在),但这是生活质量的改进。 明确的域名必须包含一个尾随句点,它基本上是DNS中的终止字符。

Thomas Flinkow已经提到了源代码的样子,我只是想给出一些背景知识 – 历史上 – 正则表达式可能就是这样。 尾随期是合法的,但有效性由邮件提供商定义。