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

8
为了验证电子邮件地址,我们依赖于MailAddress Class。然而,根据MailAddress类,这个电子邮件a@bbb..com地址似乎是有效的。
MSDN指出以下是有效的电子邮件地址:
MailAddress类支持以下邮件地址格式:
  • 用户@主机的简单地址格式。如果未设置DisplayName,则生成此邮件地址格式。
  • "显示名称"的标准引号显示名称格式。如果设置了DisplayName,则生成该格式。
  • 如果未包括,则在“显示名称”user@host的用户名、主机名周围添加尖括号。
  • 如果未包括,则在display name的DisplayName周围添加引号。
  • 在DisplayName属性中支持Unicode字符。
  • 带引号的用户名。例如,“用户名”@主机。
  • 用户名称中的连续和尾随点。例如,user...name..@host。
  • 括号域文字。例如,<[IPv6:2001:db8::1]>。
  • 注释。例如,(comment)"display name"(comment)<(comment)user(comment)@(comment)domain(comment)>(comment)。传输前会删除注释。
请注意,第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

4
解析电子邮件地址很困难。 - Daniel A. White
5
从用户体验的角度来看,这个问题已经得到解决,方法是不过于严格地验证电子邮件地址,而是向该地址发送确认电子邮件。也许这种方法对你有用? - Keith Payne
1
@MichaelHidalgo 如果没有确认邮件,就无法进行电子邮件验证。您在后端可以验证的唯一事情是电子邮件是否具有有效的格式。虽然a@a是有效的格式-但有强有力的证据表明,这个电子邮件不会通过验证电子邮件检查。 - dognose
也许这篇MSDN文章如何:验证字符串是否为有效的电子邮件格式也会有所帮助(文章中的一个示例:Invalid: js@proseware..com)。 - keenthinker
@Zee:因为RFC中描述的语法不是一个正则语言。请参见使用正则表达式验证电子邮件地址 - Daniel Pryden
显示剩余6条评论
1个回答

2

我认为(在阅读此文档https://www.cs.tut.fi/~jkorpela/rfc/822addr.html的帮助下,对RFC822进行了个人解释),该地址

a@bbb..com

根据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.)

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

根据 @dkarp 的说法:

"." 表示它是一个字面上的点,而不是另一个 ABNF 生成式。因此,一个 domain 通常是由点号分隔的 atom 组成的,而 atom 至少是一行中的一个非 specials 字符。


1
所以点字符是一个特殊的字符,需要用引号括起来,否则它将被视为“domain”部分中定义的分隔符。在这个部分上不对。"."表示它是一个字面上的点,而不是另一个ABNF产生式。因此,一个domain通常是由点分隔的atom组成的,而atom是至少一个非specials字符连续出现的。 - dkarp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接