它是"@ bbb..com"有效的电子邮件地址吗?根据MailAddress类,它是

Mic*_*lgo 8 c# email validation

为了验证电子邮件地址,我们在MailAddress Class进行转发.但是,根据MailAddress类,这封电子邮件的@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 bullet接近此问题,但它表示连续点可以显示在域中不在域中的用户名中.

其他资源如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
Run Code Online (Sandbox Code Playgroud)

Mic*_*inc 2

我认为(我个人在本文档的帮助下对 RFC822 的解释https://www.cs.tut.fi/~jkorpela/rfc/822addr.html)地址

a@bbb..com
Run Code Online (Sandbox Code Playgroud)

根据RFC 822特别是其词汇标记定义无效

其中地址的域部分定义为

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.)
Run Code Online (Sandbox Code Playgroud)

因此点字符是一个特殊字符,需要用引号引起来,否则它是“域”部分中定义的分隔符。

根据@dkarp:

"."意味着它是一个字面上的点,而不是另一个 ABNF 产生式。所以adomain一般是atom用点分隔的s,并且s是连续atom至少一个非字符。specials