我并不是在询问完整的电子邮件验证。
我只想知道电子邮件地址的用户名和服务器部分允许使用哪些字符。这可能过于简单化,也许电子邮件地址可以采取其他形式,但我不在乎。我只问这个简单的表格:user-name@server(例如。wild.wezyr@best-server-ever.com)以及两部分中允许的字符。
我并不是在询问完整的电子邮件验证。
我只想知道电子邮件地址的用户名和服务器部分允许使用哪些字符。这可能过于简单化,也许电子邮件地址可以采取其他形式,但我不在乎。我只问这个简单的表格:user-name@server(例如。wild.wezyr@best-server-ever.com)以及两部分中允许的字符。
当前回答
小心这条线索中有一堆知识腐烂(以前是真的,现在不是了)。
为了避免在当前和未来世界以及世界任何地方对实际电子邮件地址的误报拒绝,您至少需要了解RFC 3490“应用程序中的域名国际化(IDNA)”的高级概念。我知道美国和A的人通常对此并不感兴趣,但它已经在世界各地广泛使用并迅速增加(主要是非英语为主的部分)。
要点是你现在可以像梅森一样使用地址@日本.com和wildwezyr@fahrvergn不,这还不能与现有的一切兼容(正如许多人在上面所感叹的那样,即使是简单的qmail样式+ident地址也经常被错误地拒绝)。但有一个RFC,有一个规范,它现在得到了IETF和ICANN的支持,而且更重要的是,目前有大量且越来越多的实现支持这种改进。
直到我搬回日本,开始看到像hei这样的电子邮件地址,我自己才对这一发展了解很多@やる.ca和Amazon URL如下:
http://www.amazon.co.jp/エレクトロニクス-デジタルカメラ-ポータブルオーディオ/b/ref=topnav_storetab_e?即=UTF8&节点=3210981
我知道你不希望链接到规范,但如果你完全依赖互联网论坛上黑客的过时知识,你的电子邮件验证器最终会拒绝非英语用户越来越希望使用的电子邮件地址。对于这些用户来说,这种验证将与我们都讨厌的常见的脑死亡形式一样令人讨厌,这种形式无法处理一个+或三部分域名或其他任何东西。
所以我并不是说这不麻烦,但“在某些/任何/无条件下允许”的完整字符列表几乎是所有语言中的所有字符。如果你想“接受所有有效的电子邮件地址(也有许多无效的)”,那么你必须考虑IDN,这基本上使基于字符的方法变得无用(抱歉),除非你首先将国际化的电子邮件地址转换为Punycode(自2015年9月以来就已经过时了,以前是这样一种有效的替代方法)。
做完这些之后,你可以(大部分)遵循上面的建议。
其他回答
请参阅RFC 5322:Internet消息格式,以及RFC 5321:简单邮件传输协议。
RFC 822也涵盖了电子邮件地址,但它主要涉及其结构:
addr-spec = local-part "@" domain ; global address
local-part = word *("." word) ; uninterpreted
; case-preserved
domain = sub-domain *("." sub-domain)
sub-domain = domain-ref / domain-literal
domain-ref = atom ; symbolic reference
和往常一样,维基百科有一篇关于电子邮件地址的文章:
电子邮件地址的本地部分可以使用以下任意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字符外,截至2012年,您可以使用U+007F以上的国际字符,如RFC 6532规范所述,编码为UTF-8,并在维基百科上进行了解释。请注意,截至2019年,这些标准仍标记为“建议”,但正在缓慢推出。此规范中的更改基本上添加了国际字符作为有效的字母数字字符(atext),而不影响对允许和限制的特殊字符(如!#)的规则和@:。
有关验证,请参阅使用正则表达式验证电子邮件地址。
域部分定义如下:
协议的Internet标准(征求意见)要求组件主机名标签只能包含ASCII字母a到z(不区分大小写)、数字0到9和连字符(-)。RFC 952中主机名的原始规范规定,标签不能以数字或连字符开头,也不能以连字符结尾。然而,随后的规范(RFC 1123)允许主机名标签以数字开头。不允许使用其他符号、标点符号或空格。
谷歌用他们的gmail.com地址做了一件有趣的事情。gmail.com地址只允许字母(a-z)、数字和句点(忽略)。
例如。,pikachu@gmail.com与pi.kachu@gmail.com,两个电子邮件地址将发送到同一邮箱。PIKACHU@gmail.com也发送到同一邮箱。
因此,要回答这个问题,有时取决于实现者希望遵循多少RFC标准。谷歌的gmail.com地址样式与标准兼容。他们这样做是为了避免不同的人使用类似的电子邮件地址时产生混淆。
*** gmail.com accepting rules ***
d.oy.smith@gmail.com (accepted)
d_oy_smith@gmail.com (bounce and account can never be created)
doysmith@gmail.com (accepted)
D.Oy'Smith@gmail.com (bounce and account can never be created)
维基百科链接是关于电子邮件地址通常允许的内容的一个很好的参考。http://en.wikipedia.org/wiki/Email_address
答案是(几乎)全部(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 ....
因此,这样的包含规则“过于宽泛”。或者,在其他意义上,预期规则“过于简单化”。
姓名:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'*+-/=?^_`{|}~.
服务器:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.
这件事读得很好。
摘录:
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