我正在使用Django构建一个网站。该网站可能有来自非英语国家的大量用户。
我只想知道电子邮件地址可能包含的字符类型是否存在任何技术限制。
电子邮件地址是否仅允许包含英文字母,数字,_
,@
和.
?
是否允许包含é
或ü
等非英文字母?
是否允许包含中文或日文或其他Unicode字符?
答案 0 :(得分:37)
电子邮件地址consists of two parts local
之前的@和domain
之后。
这些部分的规则不同:
对于local part
,您可以使用ASCII:
U+007F
,编码as UTF-8。 Domain part
受到更多限制:
^(([^<>()\[\]\.,;:\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 page和this 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,}))$