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

Con*_*ion 61 email unicode domain-name internationalization

我正在使用`Django建立一个网站.该网站可能拥有来自非英语国家的重要用户.

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

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

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

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

Mat*_*ius 43

电子邮件地址 local @之前的两部分组成domain.

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

因为local part你可以使用ASCII:

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

Domain part 更受限制:

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

正则表达式验证

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

希望这能为您节省一些时间.

  • 您对域的看法是正确的,但您可能会遇到需要使用 punycode 进行编码的 unicode 字符 (2认同)

eKe*_*ek0 37

嗯,是.阅读(至少)维基百科的这篇文章.

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

  • 您的示例字符位于latin1集中,并且不需要完整的unicode. (12认同)
  • 这是一个更好的例子邮件:伊昭杰@邮件.商务 (9认同)
  • 请将文章的相关部分直接复制到答案中. (8认同)
  • 我无法找到允许此类电子邮件地址的服务,您能指出一个吗? (4认同)
  • HTML5 验证不接受类似 `ñoñó1234@server.com` 的内容,请参阅 http://jsfiddle.net/dbd8paxa/ (2认同)

Mic*_*tta 17

RFC 3696中描述了电子邮件地址中允许的语法,并且非常复杂.

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

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


小智 11

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

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

您应该检查的是,用户在@之前提供了一些文本,在它之后提供了一些文本,并且地址不是很长(比如说1000个字符).如果你想提供一个警告("这看起来很麻烦!是否有拼写错误?在继续之前仔细检查"),这没关系,但它不应该阻止add-email-address进程.

当然,如果您不打算向他们发送电子邮件,那么只需拿走他们输入的内容即可.例如,地址可能仅用于Gravatar,但Gravatar无论如何都会验证所有电子邮件地址.

  • 告诉人们他们做什么和不关心什么是很冒昧的.(例如,由于电子邮件地址通常不区分大小写,因此了解您是需要处理Unicode还是仅处理ASCII非常重要.) (24认同)

Jam*_*ack 5

有可能有非ASCII电子邮件地址,如此RFC所示:http://tools.ietf.org/html/rfc3490但我认为这还没有为所有国家设置,并且从我所理解的只有一个每个国家/地区都允许使用语言代码,还有一种方法可以将其转换为ASCII格式,但这不是一个小问题.