use*_*635 4 c# email-validation
.NET 4.6.1中的EmailAddressAttribute允许在末尾加点。这意味着以下电子邮件地址:someone@google.com。已验证。对于Microsoft,此电子邮件有效。但是,例如,对于PayPal,电子邮件无效。
那么有人知道吗,电子邮件末尾的点是否有效?
关于这是合法的还是有效的,有很多竞争性信息。这是两种不同的观点,我将尝试解释一下原因。
电子邮件地址由RFC 5322-Internet邮件格式部分描述,该文档以非常详细的方式说明了电子邮件格式。
在3.4.1-Addr-spec部分中,说明了电子邮件地址格式。我为简洁起见,但一般格式为:
local-part @ domain
其中local-name被描述为以下内容之一dot-atom / quoted-string / obs-local-part,domain被描述为dot-atom / domain-literal / obs-domain。
因此,这是一个域名,在RFC 1034-域名-概念和设施中进行了描述。
域名可以是模棱两可的,也可以由结尾点的不存在来定义。不保证模棱两可的域名可以解析到一个位置,但是大多数(如果不是全部的话)DNS搜索列表如果不存在,则会在幕后附加一个句号,但这是生活质量的提高。明确的域名必须包含一个后缀,基本上是DNS中的终止字符。
托马斯·弗林科(Thomas Flinkow)已经提到了源代码的样子,我只是想提供一些背景信息,以说明为什么-从历史上看,正则表达式可能就是这样。尾随期是合法的,但有效性由邮件提供商定义。
好吧,由于我没有找到任何相关文档,因此我检查了的源,EmailAddressAttribute以查看是否有任何评论解释了
someone@google.com。
被认为是有效的,但我没有对此发表评论。
我找到的是这个正则表达式,用于确定地址是否无效:
^((([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])))\.?$
Run Code Online (Sandbox Code Playgroud)
这显然很长。然而,有趣的部分是最后的这一小部分:
\.?
Run Code Online (Sandbox Code Playgroud)
表示0到1“之间的匹配。字符。
因此,我觉得这是有意建立在以句点结尾的电子邮件地址中的,尽管我没有发现任何外部资源来确定任何电子邮件提供商是否实际上允许以句点结尾的电子邮件地址。
对于验证,我建议您不要仅依赖于EmailAddressAttribute,而是要创建自己的验证器(因为EmailAddressAttribute是,sealed并且您不能派生自己的属性),看起来可能像这样:
public bool IsValidEmailAddress(string email)
{
var emailValidator = new EmailAddressAttribute();
return emailValidator.IsValid(email) && !String.EndsWith(".");
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,该属性用于提供基本的检查实现,并!String.EndsWith(".")处理被误认为有效的电子邮件地址,该电子邮件地址具有尾随时间段。
TL; DR:确切的答案似乎是Yannick Meeus写的:
尾随期是合法的,但有效性由邮件提供商定义。
因此,即使在实践中,只有极少数(没有?)邮件提供商允许使用跟踪期限,因此Microsoft似乎已经遵守了规则。因此,您必须决定是否也要确认正式规则并允许在结尾加上“”。或者您要排除它(如上面的示例代码所示)。
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |