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

时间:2015-04-07 23:54:22

标签: c# validation email

为了验证电子邮件地址,我们正在转发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.infohttp://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

1 个答案:

答案 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个字符。