我并不是在询问完整的电子邮件验证。
我只想知道电子邮件地址的用户名和服务器部分允许使用哪些字符。这可能过于简单化,也许电子邮件地址可以采取其他形式,但我不在乎。我只问这个简单的表格:user-name@server(例如。wild.wezyr@best-server-ever.com)以及两部分中允许的字符。
我并不是在询问完整的电子邮件验证。
我只想知道电子邮件地址的用户名和服务器部分允许使用哪些字符。这可能过于简单化,也许电子邮件地址可以采取其他形式,但我不在乎。我只问这个简单的表格:user-name@server(例如。wild.wezyr@best-server-ever.com)以及两部分中允许的字符。
当前回答
这件事读得很好。
摘录:
These are all valid email addresses!
"Abc\@def"@example.com
"Fred Bloggs"@example.com
"Joe\\Blow"@example.com
"Abc@def"@example.com
customer/department=shipping@example.com
\$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com
其他回答
许多人已经试图回答这个问题。许多人也表示,许多答案已经过时。这是我的答案,就2022年的情况而言。
这个问题的答案显然不像提出的那么简单。当涉及到邮箱名称的命名时,所提出的标准(具体来说,在本文中为<用户名>),以及对这些RFC的解释非常多。
对于<用户名>部分,通用验收指导小组在这里的一个名为UASG-028的文档中提出了一个详细的指南,说明了电子邮件ID本地部分的组成。
对于<server>部分,此处提到的所有字符“应用程序的Unicode代码点和国际化域名(IDNA)”的字符状态为“PVALID”。此外,状态为“CONTEXTJ”和“CONTEXTO”的字符在某些上下文条件下有效。
答案是(几乎)全部(7位ASCII)。如果包含规则“…在某些/任何/无条件下允许…”
仅通过查看RFC 5322第17页顶部“域文本”部分中允许文本的几种可能包含规则之一,我们就可以发现:
dtext = %d33-90 / ; Printable US-ASCII
%d94-126 / ; characters not including
obs-dtext ; "[", "]", or "\"
本说明中仅有的三个缺失字符用于域文字[]中,以形成引号对\和空白字符(%d32)。使用整个范围32-126(十进制)。类似的要求显示为“qtext”和“ctext”。也允许/使用许多控制字符。RFC 5322第31页第4.1节中出现了一个此类控制字符列表,称为obs NO WS CTL。
obs-NO-WS-CTL = %d1-8 / ; US-ASCII control
%d11 / ; characters that do not
%d12 / ; include the carriage
%d14-31 / ; return, line feed, and
%d127 ; white space characters
如第3.5节开头所述,允许使用所有这些控制字符:
.... MAY be used, the use of US-ASCII control characters (values
1 through 8, 11, 12, and 14 through 31) is discouraged ....
因此,这样的包含规则“过于宽泛”。或者,在其他意义上,预期规则“过于简单化”。
在讨论电子邮件地址的有效本地部分时,公认的答案是维基百科的一篇文章,但维基百科并不是这方面的权威。
IETF RFC 3696是这一问题的权威,应在第3节中查阅。第5页对电子邮件地址的限制:
当代电子邮件地址由“本地部分”组成,与由at符号(“@”)表示的“域名部分”(完全限定的域名)。域部分的语法与前面的部分本节中确定的关于过滤和名称列表适用于电子邮件上下文中使用的域名好域名也可以替换为中的IP地址方括号,但除了测试和故障排除目的。本地部分可能使用所描述的引用约定出现在下面引用的表格在实践中很少使用,但却是必需的出于某些正当目的。因此,不应在过滤例程,但应改为传递到电子邮件系统以供目标主机评估。确切的规则是任何ASCII字符,包括控件字符,可以出现在引号中,也可以出现在带引号的字符串中。当报价为需要,反斜杠字符用于引用以下内容性格例如Abc公司\@def@example.com是电子邮件地址的有效形式。空白也可能出现,如中所示弗雷德\Bloggs@example.com反斜杠字符还可以用于引用自身。,乔\\Blow@example.com除了使用反斜杠字符引用外双引号字符可用于环绕字符串。例如"Abc@def“@example.com”“Fred Blogs”@example.com是上述前两个示例的替代形式。这些引用的表单很少被推荐,在实践中也不常见,但是必须由正在处理的应用程序支持电子邮件地址。特别是,引用的表格经常出现在与来自其他系统的转换相关联的地址上下文和背景;这些过渡要求仍然存在,因为接受用户提供的电子邮件地址的系统不能“知道”该地址是否与旧系统关联地址表格必须被接受并传递到电子邮件环境中。如果没有引号,本地部分可以由以下任意组合组成字母字符、数字或任何特殊字符! # $ % & ' * + - / = ? ^ _ ` . { | } ~句点(“.”)也可能出现,但不能用于开始或结束也不能出现两个或多个连续周期。换句话说,除了at符号(“@”)、反斜杠、双引号、逗号或方括号可能出现而不引用。如果排除了要显示字符,必须引用它们。表单,如用户+mailbox@example.com客户/部门=shipping@example.com$A12345@example.com!定义!xyz%abc@example.com_somename@example.com是有效的,并且很常见,但任何字符允许使用上面列出的。
正如其他人所做的,我提交了一个既适用于PHP又适用于JavaScript的正则表达式来验证电子邮件地址:
/^[a-z0-9!'#$%&*+\/=?^_`{|}~-]+(?:\.[a-z0-9!'#$%&*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-zA-Z]{2,}$/i
如维基百科链接所示
电子邮件地址的本地部分可以使用以下任意ASCII字符:大写和小写拉丁字母A至Z和A至Z;数字0至9;特殊字符!#$%&'*+-/=^_`{|}~;点前提是除非被引用,否则它不是第一个或最后一个字符,并且除非被引用(例如。John..Doe@example.com不允许,但允许使用“John…Doe”@example.com);空格和“(),:;<>@[\]字符允许有限制(它们只允许在带引号的字符串中,如下面的段落所述,此外,反斜杠或双引号前面必须有反斜杠);注释允许在本地部分的两端加括号;例如john.smith(注释)@example.com和(注释)john.smith@example.com都相当于john.smith@example.com.除上述ASCII字符外,RFC 6531允许使用U+007F以上的国际字符(编码为UTF-8),尽管邮件系统可能会限制在分配本地部分时使用哪些字符。带引号的字符串可以作为点分隔的实体存在于本地部分中,或者当最外面的引号是本地部分的最外面的字符时(例如,abc.“defghi”.xyz@example.com或“abcdefghixyz”@example.com。相反,abc“defghi”xyz@example.com不是;abc\“def\”也不是ghi@example.com). 但是,引号字符串和字符并不常用。RFC 5321还警告“希望接收邮件的主机应避免定义本地部分需要(或使用)引号字符串格式的邮箱”。本地邮局主管会受到特殊对待,不区分大小写,应转发给域电子邮件管理员。从技术上讲,所有其他本地部件都区分大小写,因此jsmith@example.com和JSmith@example.com指定不同的邮箱;然而,许多组织将大小写字母视为等同字母。尽管在技术上有效的特殊字符范围很广;在实践中,组织、邮件服务、邮件服务器和邮件客户端通常不接受所有这些。例如,Windows Live Hotmail仅允许使用字母数字、点(.)、下划线(_)和连字符(-)创建电子邮件地址。常见的建议是避免使用一些特殊字符,以避免电子邮件被拒绝的风险。
电子邮件地址的格式为:local-part@domain-part(最大值。64@255总共不超过256个字符)。
本地部分和域部分可以有不同的允许字符集,但这还不够,因为它有更多的规则。
通常,本地部分可以具有以下ASCII字符:
小写拉丁字母:abcdefghijklmnopqrstuvxyz,大写拉丁字母:EFGHIJKLMNOPQRSTUVWXYZ,数字:0123456789,特殊字符:!#$%&'*+-/=^_`{|}~,点:。(不是第一个或最后一个字符或重复,除非引用),空格标点,如:“(),:;<>@[\](有一些限制),comments:()(允许在括号内,例如(comment)john.smith@example.com).
域部分:
小写拉丁字母:abcdefghijklmnopqrstuvxyz,大写拉丁字母:EFGHIJKLMNOPQRSTUVWXYZ,数字:0123456789,连字符:-(不是第一个或最后一个字符),可以包含由方括号包围的IP地址:jsmith@[1992.2.1]或jsmith@[IPv6:2001:db8::1]。
这些电子邮件地址有效:
prettyandsimple@example.comvery.common@example.com一次性样式邮件+symbol@example.comother.email-with-dash@example.comx@example.com(一个字母局部)“非常不寻常”@example.com"very.unusual.@.unusual.com“@example.com”“非常.(),:;<>[]\”.very.\“非常@\\”非常\“不寻常”@strange.example.comexample-indeed@strange-example.comadmin@mailserver1(没有顶级域的本地域名)#!$%&'*+-/=?^_`{}|~@example.org"()<>[]:,;@\\"!#$%&'-/=?^_`{}|~.a“@example.org“”@example.org(引号之间的空格)example@localhost(从本地主机发送)example@s.solutions(请参阅Internet顶级域列表)user@comuser@localserver用户@[IPv6:2001:db8::1]
以下是无效的示例:
Abc.example.com(无@字符)A@b@c@example.com(引号外只允许有一个@)a“b(c)d,e:f;gi[j\k]”l@example.com(本地部分中的任何特殊字符都不允许在引号外)只是“不”right@example.com(带引号的字符串必须以点分隔,或者是构成局部部分的唯一元素)这是“不”\allowed@example.com(空格、引号和反斜杠只能存在于带引号的字符串中且前面有反斜杠)这个“仍然”不是\allowed@example.com(即使转义(前面有反斜杠),空格、引号和反斜杠仍必须包含在引号中)john..doe@example.com(@前双点);(附带警告:Gmail可以让它通过)john.doe@example..com(@后双点)带前导空格的有效地址带有尾随空格的有效地址
来源:维基百科的电子邮件地址
Perl的RFC2822正则表达式用于验证电子邮件:
(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
\t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
\t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\]
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
\t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)
RFC2822地址的完整正则表达式仅为3.7k。
另请参阅:PHP中的RFC 822电子邮件地址分析器。
电子邮件地址的正式定义如下:
RFC 5322(第3.2.3和3.4.1节,废弃RFC 2822)、RFC 5321、RFC 3696、,RFC 6531(允许的字符)。
相关:
正则表达式的真正威力