首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >电子邮件地址中允许使用哪些字符?

电子邮件地址中允许使用哪些字符?
EN

Stack Overflow用户
提问于 2010-01-12 22:13:58
回答 17查看 1M关注 0票数 721

我不是在问完整的电子邮件验证。

我只想知道在电子邮件地址的user-nameserver部分允许使用什么字符。这可能过于简单化了,也许电子邮件地址可以采用其他形式,但我不在乎。我只问这个简单的形式:user-name@server (例如wild.wezyr@best-server-ever.com)和两个部分都允许的字符。

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2010-01-12 22:15:24

请参阅RFC 5322: Internet Message FormatRFC 5321: Simple Mail Transfer Protocol (程度较小)。

RFC 822也涵盖了电子邮件地址,但它主要处理其结构:

代码语言:javascript
运行
复制
 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

和往常一样,维基百科有一个像样的article on email addresses

电子邮件地址的本地部分可以使用以下任何ASCII码字符:

  • 大小写拉丁字母A to Za to 9;
  • special 0 to !#$%&'*+-/=?^_`{|}~;
  • dot .,前提是它不是第一个或最后一个字符,除非被引用,而且除非被引用,否则它不会连续出现(例如,不允许使用John..Doe@example.com,但允许使用"John..Doe"@example.com );
  • 空格和"(),:;<>@[\]字符是有限制的(它们只允许在带引号的字符串内,如下面的段落所述,此外,反斜杠或双引号必须以backslash);
  • comments开头,本地部分的两端都允许使用括号;例如,john.smith(comment)@example.com(comment)john.smith@example.com都等同于john.smith@example.com.

除了ASCII字符之外,您还可以使用国际characters above U+007F,它按照RFC 6532 spec中所述编码为as of 2012 -8,并在Wikipedia上进行了说明。请注意,截至2019年,这些标准仍被标记为建议标准,但正在缓慢推出。此规范中的更改实质上是将国际字符添加为有效的字母数字字符(atext),而不会影响!#@:等允许和限制的特殊字符的规则。

有关验证,请参阅Using a regular expression to validate an email address

domain部件定义为as follows

协议的互联网标准(征求意见稿)要求组件主机名标签只能包含ASCII码字母az (不区分大小写)、数字09和连字符(-)。RFC 952中最初的主机名规范要求标签不能以数字或连字符开头,也不能以连字符结尾。但是,后续规范(RFC 1123)允许主机名标签以数字开头。不允许使用其他符号、标点符号或空格。

票数 874
EN

Stack Overflow用户

发布于 2010-01-15 20:01:01

小心!在这个帖子中有一堆知识腐烂(以前是真的,现在不是)。

为了避免在当前和未来的世界中以及从世界的任何地方拒绝实际的电子邮件地址,您至少需要了解RFC 3490的高级概念“在应用程序中国际化域名(IDNA)”。我知道美国和美国的人们通常对此并不了解,但它已经在世界各地广泛且迅速地使用(主要是非英语占主导地位的部分)。

要点是您现在可以使用像mason@日本.com和wildwezyr@fahrvergnügen.net这样的地址。不,这还不能兼容所有的东西(正如许多人在上面抱怨的那样,即使是简单的qmail样式+ident地址也经常被错误地拒绝)。但是有一个RFC,有一个规范,它现在由IETF和ICANN支持,更重要的是,有大量的实现支持这种改进,目前正在服务中。

直到我回到日本,开始看到像这样的hei@やる.ca和亚马逊URL这样的电子邮件地址之前,我自己都不太了解这一发展:

http://www.amazon.co.jp/エレクトロニクス-デジタルカメラ-ポータブルオーディオ/b/ref=topnav_storetab_e?ie=UTF8&node=3210981

我知道你不想要规范的链接,但如果你仅仅依靠黑客在互联网论坛上过时的知识,你的电子邮件验证器最终会拒绝非英语用户越来越多地期望工作的电子邮件地址。对于这些用户来说,这样的验证将会像我们都讨厌的普通的脑死亡形式一样令人讨厌,不能处理+或三部分域名或其他任何东西的形式。

因此,我不是说这不是一个麻烦,但是“在某些/任何/无条件下允许”的完整字符列表是(几乎)所有语言中的所有字符。如果你想“接受所有有效的电子邮件地址(以及许多无效的)”,那么你必须考虑到IDN,这基本上使得基于字符的方法无用(对不起),除非你第一次convert the internationalized email addresses (自2015年9月死亡,过去是like this-a working alternative is here)到Punycode

在这样做之后,你可以遵循上面的(大部分)建议。

票数 358
EN

Stack Overflow用户

发布于 2016-08-05 18:46:00

电子邮件地址格式为:local-part@domain-part (最大64@255个字符,总共不超过256个字符)。

local-partdomain-part可以有不同的允许字符集,但这还不是全部,因为它有更多的规则。

通常,本地部分可以具有以下ASCII字符:

  • 小写拉丁字母:abcdefghijklmnopqrstuvwxyz
  • 大写拉丁字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • digits:0123456789
  • 特殊字符:!#$%&'*+-/=?^_`{|}~
  • 点:. (不是第一个或最后一个字符,除非引用,否则不重复),
  • 空格标点符号,如:"(),:;<>@[\] (有一些限制),
  • 注释:() (允许在括号内,例如(comment)john.smith@example.com).

)

域部分:

  • 小写拉丁字母:abcdefghijklmnopqrstuvwxyz
  • 大写拉丁字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ
  • digits:0123456789
  • 连字符:- (不是第一个或最后一个字符),
  • 可以包含用方括号括起来的IP地址:jsmith@[192.168.2.1]jsmith@[IPv6:2001:db8::1].

以下电子邮件地址有效:

  • prettyandsimple@example.com
  • very.common@example.com
  • disposable.style.email.with+symbol@example.com
  • other.email-with-dash@example.com
  • x@example.com (一个字母的本地part)
  • "much.more unusual"@example.com
  • "very.unusual.@.unusual.com"@example.com
  • "very.(),:;<>[]\".VERY.\"very@\ \"very\".unusual"@strange.example.com
  • example-indeed@strange-example.com
  • admin@mailserver1 (没有顶级domain)
  • #!$%&'*+-/=?^_`{}|~@example.org
  • "()<>[]:,;@\\"!#$%&'-/=?^_`{}| ~.a"@example.org
  • " "@example.org的本地域名)( quotes)
  • example@localhost之间的空格(从本地主机发送)
  • example@s.solutions (请参见List of Internet top-level domains)
  • user@com
  • user@localserver
  • user@[IPv6:2001:db8::1]

下面是无效的例子:

  • Abc.example.com (无引号character)
  • A@b@c@example.com (在引号marks)
  • a"b(c)d,e:f;gi[j\k]l@example.com之外只允许有一个引号(此本地部分中的任何特殊字符都不允许在引号marks)
  • just"not"right@example.com之外))(引号字符串必须用点分隔,或者构成本地part)
  • this is"not\allowed@example.com的唯一元素(空格、引号和反斜杠只能存在于带引号的字符串内并以backslash)
  • this\ still\"not\allowed@example.com开头(即使转义(前面有反斜杠)、空格、引号、@ @、并且反斜杠必须仍然包含在quotes)
  • john..doe@example.com中(@之前的双点);(需要注意的是: Gmail允许这个through)
  • john.doe@example..com ( @)
  • a有效地址后面的双圆点和前导空格
  • 一个尾随空格的有效地址

来源:维基百科上的Email address

用于验证电子邮件的Perl's RFC2822 regex

代码语言:javascript
运行
复制
(?:(?:\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。

另请参阅:RFC 822 Email Address Parser in PHP

电子邮件地址的正式定义在:

  • RFC5322( 3.2.3和3.4.1节,废弃RFC2822)、RFC5321、RFC3696、
  • RFC6531(允许的characters).

相关信息:

票数 80
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2049502

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档