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

Wil*_*zyr 587 forms email email-address email-validation

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

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

Ant*_*lev 752

请参阅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
Run Code Online (Sandbox Code Playgroud)

像往常一样,维基百科有一篇关于电子邮件地址的文章:

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

  • 大写和小写拉丁字母AZaz;
  • 数字09;
  • 特殊人物!#$%&'*+-/=?^_`{|}~;
  • .,只要它不是第一个或最后一个字符,除非报价,并且还提供它不连续出现,除非引用(例如John..Doe@example.com不允许,但是"John..Doe"@example.com是允许的);
  • 空格和"(),:;<>@[\]字符是允许有限制的(它们只允许在带引号的字符串中,如下段所述,此外,反斜杠或双引号必须以反斜杠开头);
  • 本地部分两端的括号允许注释; 例如john.smith(comment)@example.com并且(comment)john.smith@example.com都等同于john.smith@example.com.

除ASCII字符外,截至2012年,您可以使用上面的 国际字符U+007F,编码为UTF-8,如RFC 6532规范中所述,并在Wikipedia上进行了解释.请注意,截至2019年,这些标准仍然标记为建议,但正在缓慢推出.此规范中的更改实际上将国际字符添加为有效的字母数字字符(atext),而不会影响允许和限制的特殊字符(如!#和)的规则@:.

有关验证,请参阅使用正则表达式验证电子邮件地址.

domain部分定义如下:

协议的Internet标准(Request for Comments)要求组件主机名标签可以只包含ASCII字母(a通过z不区分大小写的方式),数字0通过9和连字符(-).RFC 952中主机名的原始规范,强制标签不能以数字或连字符开头,并且不得以连字符结尾.但是,后续规范(RFC 1123)允许主机名标签以数字开头.不允许使用其他符号,标点字符或空格.

  • 由于国际化地址,这不再是有效的答案.看梅森的回答. (47认同)
  • @WildWzyr,不是那么简单.电子邮件地址对于允许的内容有很多规则.引用规范比列出所有规范更简单.如果你想要完整的Regex,请点击这里了解为什么它不那么简单:http://www.regular-expressions.info/email.html (15认同)
  • @WildWezyr嗯,本地部分允许使用句号.但不是在开始或结束.或者另一个全站.所以答案不仅仅是一个允许字符列表这么简单,有关于如何使用这些字符的规则 - ".ann..other.@ example.com`不是一个有效的电子邮件地址,而是`ann.其他@ example.com`即使两个都使用相同的字符. (14认同)
  • 此外,请记住,随着国际化域名的进入,允许的字符列表将会爆炸. (14认同)
  • 没有简单的清单,只是因为你想要的东西简单并不意味着它会如此.某些字符只能在某些位置而不能在其他位置.你无法一直拥有自己想要的东西. (6认同)
  • 现实世界的轶事:那里有使用连续点的地址(我认为违反了RFC).最近,当我协助对公司紧急通知系统进行技术审计时,这就出现了; 在一年一度的演习中,该系统默默无法通知一名员工.事实证明,日本最大的移动运营商NTT Docomo允许使用"burgers ... mmm@docomo.ne.jp"等电子邮件地址.该系统令人窒息.(Docomo拥有超过4000万客户.) (5认同)

Mas*_*son 309

小心!在这个线程中有一堆知识腐烂(过去曾经是真的,现在却没有).

为了避免在当前和未来世界以及世界任何地方误报实际电子邮件地址,您至少需要了解RFC 3490的高级概念"在应用程序中国际化域名(IDNA)".我知道美国和美国的人们往往不会这样做,但它已经广泛使用并且在世界范围内迅速增加(主要是非英语主导的部分).

要点是,您现在可以使用mason @日本.com和wildwezyr@fahrvergnügen.net等地址.不,这还不兼容那里的所有内容(正如许多人在上面感叹,即使简单的qmail风格+身份地址也经常被错误地拒绝).但是有一个RFC,有一个规范,它现在得到了IETF和ICANN的支持,而且 - 更重要的是 - 支持这一改进的大量且越来越多的实现正在服务中.

在我回到日本并开始看到像hei @やる.ca这样的电子邮件地址以及像这样的Amazon URL之前,我对这个开发本身并不多了解:

http://www.amazon.co.jp/エレクトロニクス - デジタルカメラ - ポータブルオーディオ/ B/REF = topnav_storetab_e即= UTF8&节点= 3210981

我知道您不希望链接到规范,但如果您完全依赖于互联网论坛上黑客的过时知识,那么您的电子邮件验证工具最终将拒绝非英语用户越来越期望工作的电子邮件地址.对于那些用户来说,这样的验证就像我们讨厌的普通脑死亡形式一样令人讨厌,无法处理+或三部分域名或其他任何东西.

所以我并不是说这不麻烦,但是"允许在某些/任何/无条件下"的完整字符列表(几乎)是所有语言中的所有字符.如果你想"接受所有有效的电子邮件地址(以及许多无效的电子邮件地址)"那么你必须考虑IDN,这基本上使得基于字符的方法无用(对不起),除非你首先将国际化的电子邮件地址转换Punycode.

完成后,您可以遵循(大部分)上面的建议.

  • 对; 在幕后,域名仍然只是ASCII.但是,如果您的Web应用程序或表单接受用户输入的输入,则它需要执行与用户输入IDN主机名时Web浏览器或邮件客户端相同的作业:将用户输入转换为DNS兼容表单.然后验证.否则,这些国际化的电子邮件地址将无法通过您的验证.(像我链接的转换器只修改它们给出的非ASCII字符,所以在非国际化的电子邮件地址上使用它们是安全的(那些只是未修改的).) (17认同)
  • 请注意,国际化电子邮件(如当前定义的)*不使用punycode或类似的方式转换非ASCII地址,而是扩展SMTP协议本身的大部分以使用UTF8. (5认同)
  • 这似乎是正确答案的正确轨道.我敢打赌如果你包含有关保留和允许字符的细节,它会获得更多的选票. (3认同)
  • **对于Javascript devs**,我现在正在研究这样做的方法,并且[**Punycode.js**](http://bram.us/2011/11/29/punycode-js)似乎是最完整和最完美的解决方案. (2认同)
  • 我错过了什么或者这是否未能回答这个问题?我正在读'其他答案是错误的,你需要接受更多的字符'但是却没有说出哪些额外的字符.我也无法(轻松地)在RFC中看到它是指所有Unicode代码点还是仅仅是BMP. (2认同)

ken*_*orb 49

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

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

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

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

域名部分:

  • 小写拉丁字母:abcdefghijklmnopqrstuvwxyz,
  • 大写拉丁字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ,
  • 数字: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 (一个字母的本地部分)
  • "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 (没有顶级域名的本地域名)
  • #!$%&'*+-/=?^_`{}|~@example.org
  • "()<>[]:,;@\\"!#$%&'-/=?^_`{}| ~.a"@example.org
  • " "@example.org (引号之间的空格)
  • example@localhost (从localhost发送)
  • example@s.solutions(请参阅Internet顶级域列表)
  • user@com
  • user@localserver
  • user@[IPv6:2001:db8::1]

而这些无效的例子:

  • Abc.example.com(没有@人物)
  • A@b@c@example.com(只@允许一个引号外)
  • a"b(c)d,e:f;gi[j\k]l@example.com (此本地部分中的任何特殊字符都不允许在引号外)
  • just"not"right@example.com (引用的字符串必须是点分隔的或构成本地部分的唯一元素)
  • this is"not\allowed@example.com (空格,引号和反斜杠可能仅在带引号的字符串中以反斜杠开头时存在)
  • this\ still\"not\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*)
Run Code Online (Sandbox Code Playgroud)

RFC2822地址的完整正则表达式仅为3.7k.

另请参阅:PHP中的RFC 822电子邮件地址解析器.


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

  • RFC 5322(第3.2.3和3.4.1节,废弃RFC 2822),RFC 5321,RFC 3696,
  • RFC 6531(允许的字符).

有关:

  • 作为这个正则表达式的潜在实施者的额外警告:不要.只需验证它是否包含格式`something @ something.something`并将其称为一天. (5认同)
  • 我说疯了。谁会在生产中使用它。有一点应该不再使用正则表达式。这远远超出了这一点。 (3认同)
  • 我经常看到的是“根据 RFC822 进行验证”。这实际上并不是通常所需要的。RFC822 没有定义可以“发送到”的地址;它定义了可以“出现在消息中”的地址,这不是一回事。可以发送到的地址由 RFC821 (SMTP) 和后续标准确定。特别是,此规范不允许评论,不包括像“a@abc(bananas)def.com”这样的地址,这些地址是有效的 RFC822 地址,但无法发送到。因此,许多电子邮件验证器正在验证错误的内容。 (3认同)
  • @ChrisSobolewski 绝对。此验证的目的是*帮助用户*,并避免明显的错误(例如忘记@或类似的错误)。将电子邮件与“@”分开并检查它是否返回两个非零字符串就足够了。 (2认同)

Mik*_*ler 21

维基百科有一篇很好的文章,官方规范在这里.来自Wikipdia:

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

  • 大写和小写英文字母(az,AZ)
  • 数字0到9
  • 人物!#$%&'*+ - /=?^ _` {| }〜
  • 性格.(点,句号,句号),条件是它不是第一个或最后一个字符,并且还提供它不连续出现两次或多次.

另外,允许引用字符串(即:"John Doe"@ example.com),从而允许否则将被禁止的字符,但是它们不会出现在通常的实践中.RFC 5321还警告说"希望接收邮件的主机应该避免定义Local-part需要(或使用)Quoted-string表单的邮箱".


Ang*_*Koh 13

Google用他们的gmail.com地址做了一件有趣的事情.gmail.com地址仅允许字母(az),数字和句点(被忽略).

例如,pikachu @ gmail.com与pi.kachu@gmail.com相同,两个电子邮件地址都将被发送到同一个邮箱.PIKACHU@gmail.com也会发送到同一个邮箱.

因此,为了回答这个问题,有时它取决于实施者他们想要遵循多少RFC标准.Google的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)
Run Code Online (Sandbox Code Playgroud)

维基百科链接是关于电子邮件地址通常允许的一个很好的参考. http://en.wikipedia.org/wiki/Email_address

  • Gmail确实遵循RFC 6530,因为根据RFC,Gmail允许的每个可能的电子邮件地址都是有效的.Gmail只是选择使用其他规则进一步限制允许的地址集,并使用本地部分中的点制作其他类似地址,可选地后跟"+"和字母数字字符同义. (3认同)
  • 是的,这是一个很好的答案,为什么Gmail不允许用这个来创建电子邮件.但是您可以发送和接收来自`{john'doe} @ my.server`的电子邮件,没有任何问题.也用hMail服务器测试过. (2认同)

Vla*_*mir 12

你可以从维基百科文章开始:

  • 大写和小写英文字母(az,AZ)
  • 数字0到9
  • 人物!#$%&'*+ - /=?^ _` {| }〜
  • 性格.(点,句号,句号),条件是它不是第一个或最后一个字符,并且还提供它不连续出现两次或多次.


Thi*_*iff 11

名称:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'*+-/=?^_`{|}~.
Run Code Online (Sandbox Code Playgroud)

服务器:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.
Run Code Online (Sandbox Code Playgroud)

  • 请引用消息来源.没有来源,这*看起来像猜想. (19认同)
  • 这已经过时了,可能永远都不正确. (12认同)
  • 那么`<>`和`[]`呢?例如`"()<> []:,; @ \\\"!#$%&' - /=?^ _`{} | 〜.一"@ example.org`? (4认同)

小智 9

检查@和.然后发送电子邮件给他们验证.

我仍然无法在互联网上20%的网站上使用我的.name电子邮件地址,因为有人搞砸了他们的电子邮件验证,或者因为它早于有效的新地址.

  • 甚至.并非绝对必要; 我听说过至少有一个顶级域名的电子邮件地址(特别是ua).地址是<name> @ua - 没有点! (9认同)

小智 5

简短的回答是有2个答案.你应该做什么有一个标准.即行为是明智的,将使你摆脱困境.对于你应该接受而不会制造麻烦的行为,还有另一个(更广泛的)标准.这种二元性适用于发送和接收电子邮件,但在生活中具有广泛的应用.

为您创建的地址提供良好的指导; 请参阅:http://www.remote.org/jochen/mail/info/chars.html

要过滤有效的电子邮件,只需传递一些可理解的内容即可看到下一步.或者开始阅读一堆RFC,请注意,这里是龙.


Luk*_*nga 5

关于此事的好读.

摘抄:

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
Run Code Online (Sandbox Code Playgroud)


Mac*_*Mac 5

在讨论电子邮件地址的有效本地部分时,接受的答案是指维基百科的文章,但维基百科不是这方面的权威.

IETF RFC 3696 此问题的权威,应参阅第3.电子邮件地址的限制在第5页:

当前电子邮件地址由"本地部分"组成,该"本地部分"通过符号("@")与"域部分"(完全限定的域名)分开.域部分的语法对应于上一节中的语法.该部分中关于过滤和名称列表的关注点也适用于电子邮件上下文中使用的域名.域名也可以用方括号中的IP地址替换,但除了测试和故障排除之外,强烈建议不要使用该表单.

本地部分可能使用下面描述的引用约定出现.引用的表格在实践中很少使用,但出于某些合法目的是必需的.因此,它们不应该在过滤例程中被拒绝,而应该被传递到电子邮件系统以供目标主机评估.

确切的规则是任何ASCII字符(包括控制字符)都可以显示引号,或者带引号的字符串.当需要引用时,反斜杠字符用于引用以下字符.例如

  Abc\@def@example.com
Run Code Online (Sandbox Code Playgroud)

是电子邮件地址的有效形式.也可能出现空白,如

  Fred\ Bloggs@example.com
Run Code Online (Sandbox Code Playgroud)

反斜杠字符也可用于引用自身,例如,

  Joe.\\Blow@example.com
Run Code Online (Sandbox Code Playgroud)

除了使用反斜杠字符引用之外,传统的双引号字符可用于包围字符串.例如

  "Abc@def"@example.com

  "Fred Bloggs"@example.com
Run Code Online (Sandbox Code Playgroud)

是前两个例子的替代形式.这些引用的表单很少被推荐,并且在实践中并不常见,但是,如上所述,必须由处理电子邮件地址的应用程序支持.特别是,引用的表单通常出现在与其他系统和上下文的转换相关联的地址的上下文中; 那些过渡性要求仍然会出现,并且由于接受用户提供的电子邮件地址的系统无法"知道"该地址是否与遗留系统相关联,因此必须接受地址表并将其传递到电子邮件环境中.

如果没有引号,本地部分可以包含
字母字符,数字或任何特殊字符的任意组合

  ! # $ % & ' * + - / = ?  ^ _ ` . { | } ~
Run Code Online (Sandbox Code Playgroud)

句号(".")也可能出现,但可能不会用于开始或结束本地部分,也不会出现两个或多个连续的句号.换句话说,除了at符号("@"),反斜杠,双引号,逗号或方括号之外的任何ASCII图形(打印)字符都可以不引用而出现.如果要显示任何排除字符列表,则必须引用它们.形式如

  user+mailbox@example.com

  customer/department=shipping@example.com

  $A12345@example.com

  !def!xyz%abc@example.com

  _somename@example.com
Run Code Online (Sandbox Code Playgroud)

是有效的,并且经常被看到,但允许使用上面列出的任何字符.

正如其他人所做的那样,我提交了一个适用于PHP和JavaScript的正则表达式来验证电子邮件地址:

/^[a-z0-9!'#$%&*+\/=?^_`{|}~-]+(?:\.[a-z0-9!'#$%&*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-zA-Z]{2,}$/i
Run Code Online (Sandbox Code Playgroud)