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

时间:2010-10-02 04:49:19

标签: email unicode internationalization domain-name

我正在使用Django构建一个网站。该网站可能有来自非英语国家的大量用户。

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

电子邮件地址是否仅允许包含英文字母,数字,_@.

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

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

8 个答案:

答案 0 :(得分:37)

电子邮件地址consists of two parts local之前的@和domain之后。

这些部分的规则不同:

对于local part,您可以使用ASCII:

  • 拉丁字母A - Z a - z
  • 数字0 - 9
  • 特殊字符!#$%&' * + - / =?^ _` {|}〜
  • dot。,它不是第一个或最后一个,而不是按顺序
  • 空格和&#34;(),:;&lt;&gt; @ []字符允许有限制(它们只允许在带引号的字符串中,反斜杠或双引号必须以反斜杠开头)< / LI>
  • Plus since 2012您可以使用国际characters above U+007F,编码as UTF-8

Domain part受到更多限制:

  • 拉丁字母A - Z a - z
  • 数字0 - 9
  • 连字符 - 不是第一个或最后一个,允许按顺序连接多个连字符。

Regex to validate

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

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

答案 1 :(得分:36)

嗯,是的。阅读维基百科上的(至少)this文章。

我住在阿根廷,这里有电子邮件,如ñoñó1234@server.com

答案 2 :(得分:17)

电子邮件地址中允许的语法在RFC 3696中有所描述,并且非常复杂。

  

确切规则[对于本地部分; '@'之前的部分是任何ASCII字符,包括控件      字符,可能出现引号,或带引号的字符串。引用时      需要时,反斜杠字符用于引用以下内容      性格
   [...]
  如果没有引号,本地部分可以包含任何组合      字母字符,数字或任何特殊字符         ! #$%&amp; '* + - / =? ^ _`。 {| }〜
  [...]
  允许使用任何字符或位组合(作为八位字节)      DNS名称。但是,有一种需要的优选形式      大多数申请......

...等等,在某种程度上。

答案 3 :(得分:11)

不要担心哪些电子邮件地址可以包含哪些内容(您真正不关心),请测试您的设置是否可以向他们发送电子邮件 - 这就是您真正关心的内容!这意味着实际发送验证邮件。

否则,你无法捕捉到一个更常见的意外错别字案例,它会留在你设计的任何字符集中。 (快速:random@mydomain.com是我在您的网站上使用的有效地址,或不是?)当您告诉他们完全有效且正确的地址错误时,它还可以避免不必要地和无偿地疏远任何用户。您仍然可能无法处理某些地址(这是必要的异化),正如其他答案所说:电子邮件地址处理并非无足轻重;但是他们需要知道他们是否想要为您提供电子邮件地址!

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

当然,如果您不想发送电子邮件给他们,那么只需拿走他们输入的内容即可。例如,地址可能仅用于Gravatar,但Gravatar仍会验证所有电子邮件地址。

答案 4 :(得分:5)

有可能有非ASCII电子邮件地址,如此RFC所示:http://tools.ietf.org/html/rfc3490但我认为尚未针对所有国家/地区设置,并且根据我的理解,只允许使用一种语言代码对于每个国家,还有一种方法可以将其转换为ASCII,但这不会是一个微不足道的问题。

答案 5 :(得分:2)

我遇到过带单引号的电子邮件地址,而且不经常发生。我们拒绝空格(虽然严格来说是允许的),不止一个'@'符号和总共短于五个字符的地址字符串。我相信这解决了比它创造的问题更多的问题,到目前为止,十多年和几十万个地址都可以拒绝许多垃圾地址。此外,还有一个触发器可以在插入或更新时包含所有电子邮件地址。

据说如果没有往返主人就无法验证电子邮件,但至少我们可以拒绝非常怀疑的数据。

答案 6 :(得分:1)

建立在@ Matas Vaitkevicius的答案上:我已经在Python中修复了更多正则表达式,以使其与Wikipedia的this pagethis page上定义的有效电子邮件地址匹配,使用该真棒regex101网站:https://regex101.com/r/uP2oL7/26

希望这对某人有帮助!:)

答案 7 :(得分:0)

我看了pooh17答案中的正则表达式,发现如果用句点分隔,则它允许局部部分大于64个字符(它只是检查了第一个句点之前的位小于64个字符)。您可以利用积极的前瞻来改善这一点,这是我的建议,如果您真的想要一个正则表达式

^(((?=.{1,64}@)[^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|((?=.{1,66}@)\".+\"))@(?=.{1,255}$)(\[(IPv6:)?[\dA-Fa-f:.]+\]|(?!.*?\.\.)(([^\s!\"#$%&'()*+,./:;<=>?@[\]^_`{|}~]+\.?)+[^\s!\"#$%&'()*+,./:;<=>?@[\]^_`{|}~]{2,}))$