【问题标题】:Is it "a@bbb..com" a valid email address?, According to MailAddress class it is“a@bbb..com”是一个有效的电子邮件地址吗?根据 MailAddress 类它是
【发布时间】:2015-06-12 18:03:06
【问题描述】:

为了验证电子邮件地址,我们转发MailAddress Class。但是,根据 MailAddress 类,这个电子邮件 a@bbb..com 地址似乎是有效的。

MSDN 声明这是有效的电子邮件地址:

MailAddress 类支持以下邮件地址格式:

  • user@host 的简单地址格式。如果未设置 DisplayName,则这是生成的邮件地址格式。
  • “显示名称”的标准引用显示名称格式。如果设置了 DisplayName,则这是生成的格式。
  • 在用户名和主机名周围添加尖括号,如果不包括这些,则为“显示名称”user@host。
  • 如果未包含引号,则在 DisplayName 周围添加引号以表示显示名称。
  • DisplayName 支持 Unicode 字符。财产。
  • 带引号的用户名。例如,“用户名”@host。
  • 用户名中的连续点和尾随点。例如,用户...名称..@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

【问题讨论】:

  • 解析电子邮件地址很困难。
  • @DanielA.White 绝对:)
  • 为什么不使用正则表达式?
  • 从用户体验的角度解决了这个问题,方法是不非常严格地验证电子邮件地址,而是向该地址发送确认电子邮件。也许这种方法对您有用?
  • @MichaelHidalgo 没有确认邮件就无法进行电子邮件验证。您唯一可以在后端验证的是电子邮件是否具有有效的格式。虽然a@a 是一种有效格式 - 有强有力的证据表明此电子邮件不会通过验证电子邮件检查。

标签: c# validation email


【解决方案1】:

我认为(我个人借助本文档 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.)

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

根据@dkarp:

"." 表示它是一个文字点,而不是另一个 ABNF 产品。所以domain 一般是atoms 用点分隔,atoms 至少是一行非specials 字符。

【讨论】:

  • “所以点字符是特殊的,需要用引号括起来,否则它是“域”部分中定义的分隔符” 没有在这部分。 "." 表示它是一个文字点,而不是另一个 ABNF 产品。所以domain一般是atoms用点分隔,atoms是至少一个非specials的连续字符。
猜你喜欢
  • 2011-11-02
  • 2011-03-28
  • 2013-09-05
  • 2015-11-20
  • 2011-01-12
  • 1970-01-01
  • 2017-07-23
  • 2011-07-27
  • 2021-12-06
相关资源
最近更新 更多