EmailAddressAttribute允许末尾的点

时间:2018-03-07 13:39:14

标签: c# email-validation

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

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

2 个答案:

答案 0 :(得分:4)

好吧,既然我没有找到任何相关文档,我检查了source of the EmailAddressAttribute以查看是否有任何评论说明是否

  

someone@google.com。

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

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

Query query = mDbRefusers_chat.child("chatId");

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

^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\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)))@((([a-z]|\d|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$

表示匹配0和1"。"字符

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

对于验证,我建议不要仅仅依赖\.? ,而是制作自己的验证器(因为EmailAddressAttributeEmailAddressAttribute而你无法获得自己的属性) ,看起来有点像这样:

sealed

在上面的代码中,该属性用于提供基本的检查实现,public bool IsValidEmailAddress(string email) { var emailValidator = new EmailAddressAttribute(); return emailValidator.IsValid(email) && !String.EndsWith("."); } 负责将错误确定为有效且具有尾随句点的电子邮件地址。

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

  

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

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

答案 1 :(得分:4)

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

电子邮件地址部分由RFC 5322 - Internet Message Format描述,它以极其详细的方式解释了电子邮件格式。

3.4.1 - Addr-spec部分中,解释了电子邮件地址格式。我为了简洁起见,但一般格式是:

  

本地部分@域

将local-name描述为以下release/Branch_1之一,并将域描述为dot-atom / quoted-string / obs-local-part

所以它是一个域名,在RFC 1034 - Domain Names - Concepts And Facilities中描述。

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

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