为了验证电子邮件地址,我们正在转发MailAddress Class。但是,根据MailAddress类,此电子邮件 a @ bbb..com 地址似乎有效。
MSDN声明这是有效的电子邮件地址:
MailAddress类支持以下邮件地址格式:
- user @ host的简单地址格式。如果未设置DisplayName,则这是生成的邮件地址格式。
- “显示名称”的标准引用显示名称格式。如果设置了DisplayName,则这是生成的格式。
- 如果不包含这些名称,则会在“显示名称”user @ host的主机名周围添加尖括号。
- 如果不包含显示名称,则会在DisplayName周围添加引号用于显示名称。
- DisplayName支持Unicode字符。属性。
- 带引号的用户名。例如,“用户名”@host。
- 用户名中的连续点和尾随点。例如,user ... name .. @ host。
- 括号内的域名文字。例如,。
- 评论。例如,(评论)“显示名称”(评论)<(评论)用户(评论)@(评论)域(评论)>(评论)。传输前删除注释。
取自https://msdn.microsoft.com/en-us/library/system.net.mail.mailaddress%28v=vs.110%29.aspx。
请注意,7个子弹接近此问题,但它表示连续的点可以显示在域中的用户名中。
http://isemail.info(http://isemail.info/a@bbb..com)等其他资源声明这不是有效的电子邮件地址。
您认为应该是正确的行为?这是一个poc。
//C# Example
var emailAddress = @"a@bbb..com";
Func<string,bool> validEmail = (email)=>
{
try
{
var address = new System.Net.Mail.MailAddress(email);
return true;
}catch (Exception ex)
{
return false;
}
};
Assert.IsTrue(validEmail(emailAddress));
//using NUnit.Framework
//O2Ref:nunit.framework.dll
答案 0 :(得分:2)
我认为(我在本文件https://www.cs.tut.fi/~jkorpela/rfc/822addr.html的帮助下对RFC822的个人解释)地址
a@bbb..com
根据RFC 822特别是其LEXICAL TOKENS定义
无效您将地址的域部分定义为
domain = sub-domain *("." sub-domain)
sub-domain = domain-ref / domain-literal
domain-ref = atom
atom = 1*<any CHAR except specials, SPACE and CTLs>
specials = "(" / ")" / "<" / ">" / "@" ; Must be in quoted-
/ "," / ";" / ":" / "\" / <"> ; string, to use
/ "." / "[" / "]" ; within a word.
domain-literal = "[" *(dtext / quoted-pair) "]"
dtext = <any CHAR excluding "[", ; => may be folded
"]", "\" & CR, & including
linear-white-space>
linear-white-space = 1*([CRLF] LWSP-char) ; semantics = SPACE
; CRLF => folding
quoted-pair = "\" CHAR ; may quote any char
CHAR = <any ASCII character> ; ( 0-177, 0.-127.)
所以点字符是特殊的,需要在引号中,否则它是&#39;域中定义的分隔符&#39;部分。
根据@dkarp:
"."
表示它是一个字面点,而不是另一个ABNF制作。因此,domain
通常atom
由点分隔,而atom
s在一行中至少有一个非specials
个字符。