电子邮件地址是否允许包含非字母数字字符?

我正在用Djangobuild立一个网站。 该网站可能有来自非英语国家的重要用户。

我只想知道电子​​邮件地址可能包含的字符types是否有任何技术限制。

电子邮件地址是否只允许包含英文字母,数字,“_”,“@”和“。”?

是否允许包含“é”或“ü”等非英文字母?

他们是否允许包含中文或日文或其他Unicode字符?

电子邮件地址由 @之前的localdomain

这些部分的规则是不同的:

对于local part你可以使用ASCII:

  • 拉丁字母A – Z a – z
  • 数字0 – 9
  • 特殊字符!#$%&'* + – / =?^ _`{|}〜
  • 不是第一个也不是最后一个,而不是顺序
  • 空格和“(),:; <> @ []字符是允许的限制(它们只允许在引用string内,反斜线或双引号前面必须加反斜杠)
  • 另外,自2012年以来,您可以使用U+007F 以上的国际字符 ,编码为UTF-8 。

Domain part更受限制:

  • 拉丁字母A – Z a – z
  • 数字0 – 9
  • 连字符 – 不是第一个或最后一个,允许连续多个连字符。

正则expression式来validation

^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})

希望这可以为你节省一些时间。

嗯,是。 阅读(至less) 这篇文章从维基百科。

我住在阿根廷,在这里可以发邮件到ñoñó1234@server.com

RFC 3696中描述了电子邮件地址中允许的语法,并且涉及很多。

确切的规则[本地部分; '@']之前的部分是任何ASCII字符,包括控制字符,都可能会出现引号或用引号引起来的string。 当需要引用时,反斜杠字符用于引用以下字符
[…]
没有引号,本地部分可能由字母,数字或任何特殊字符的任意组合组成! #$%&'* + – / =? ^ _`。 {| }〜
[…]
在DNS名称中允许任何字符或位组合(如八位字节)。 但是,大多数应用程序都需要一个首选表单。

…等等,在一定的深度。

不要担心哪些电子邮件地址可以包含,也不能包含什么,你真的不关心,testing你的设置是否可以给他们发送电子邮件 – 这是你真正关心的! 这意味着实际上发送validation邮件。

否则,你不能find一个更常见的意外错别字的情况下,你留在你devise的任何字符集。 (快速:是random@mydomain.com是我的一个有效地址在你的网站上使用,还是不?)它也避免了当你告诉他们他们的完全有效和正确的地址是错误的,不必要地和无偿地疏远任何用户。 你仍然可能无法处理一些地址(这是必要的异化),因为其他答案说:电子邮件地址处理不是微不足道的; 但是这是他们需要找出他们是否想给你一个电子邮件地址!

所有你应该检查的是,用户在@之前提供一些文本,在它之后的一些文本,并且地址不是漫长的(例如1000个字符)。 如果你想提供一个警告(“这看起来像麻烦!是否有一个错字?在继续之前的双重检查”),这很好,但它不应该阻止添加电子邮件地址的过程。

当然,如果你不在乎给他们发电子邮件,那就把他们input的东西拿走吧。 例如,该地址可能仅用于Gravatar ,但Gravatar无论如何都会validation所有电子邮件地址。

有一个非ASCII的电子邮件地址的可能性,如本RFC: http : //tools.ietf.org/html/rfc3490所示,但我认为这并没有为所有国家设置,从我所了解的只有一个语言代码将被允许为每个国家,也有办法把它变成ASCII,但这并不是一个微不足道的问题。

我遇到过使用单引号的电子邮件地址,而且也不常使用。 我们拒绝空格(尽pipe严格来说是允许的),多个“@”符号和总共less于五个字符的地址string。 我相信这解决了比创build更多的问题,到目前为止,已经有超过十年的时间,几十万个地址,它拒绝了许多垃圾地址。 还有一个触发器,可以在插入或更新时减less所有电子邮件地址。

这就是说,要validation电子邮件是不可能的,但是至less我们可以拒绝非常怀疑的数据。