我正在使用 Django 建立一个网站。该网站可能有大量来自非英语国家的用户。
我只想知道对于电子邮件地址可以包含的字符类型是否有任何技术限制。
电子邮件地址是否只允许包含英文字母、数字_
、@
和.
?
是否允许它们包含非英文字母,例如é
or ü
?
它们是否允许包含中文或日文或其他 Unicode 字符?
我正在使用 Django 建立一个网站。该网站可能有大量来自非英语国家的用户。
我只想知道对于电子邮件地址可以包含的字符类型是否有任何技术限制。
电子邮件地址是否只允许包含英文字母、数字_
、@
和.
?
是否允许它们包含非英文字母,例如é
or ü
?
它们是否允许包含中文或日文或其他 Unicode 字符?
电子邮件地址由 local
@ 之前和domain
之后的两部分组成。
这些部分的规则不同:
因为local part
您可以使用 ASCII:
另外,自 2012 年以来,您可以使用上述国际字符 U+007F
,编码为 UTF-8。
Domain part
受到更多限制:
^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})
希望这可以节省您一些时间。
嗯,是。从维基百科阅读(至少)这篇文章。
我住在阿根廷,这里允许发送电子邮件,例如 ñoñó1234@server.com
电子邮件地址中允许的语法在 [RFC 3696][1] 中进行了描述,并且非常复杂。
确切的规则[对于本地部分;'@'] 之前的部分是任何 ASCII 字符,包括控制字符,都可能出现在引号中,或者在带引号的字符串中。当需要引用时,反斜杠字符用于引用以下字符
[...]
如果没有引号,本地部分可以由字母字符、数字或任何特殊字符的任意组合组成!# $ % & ' * + - / = ? ^_`。{ | } ~
[...]
DNS 名称中允许使用任何字符或位组合(作为八位字节)。但是,大多数应用程序都需要一种首选形式...
...等等,在某些深度。[1]:https ://www.rfc-editor.org/rfc/rfc3696
Instead of worrying about what email addresses can and can't contain, which you really don't care about, test whether your setup can send them email or not—this is what you really care about! This means actually sending a verification email.
Otherwise, you can't catch a much more common case of accidental typos that stay within any character set you devise. (Quick: is random@mydomain.com a valid address for me to use at your site, or not?) It also avoids unnecessarily and gratuitously alienating any users when you tell them their perfectly valid and correct address is wrong. You still may not be able to process some addresses (this is necessary alienation), as the other answers say: email address processing isn't trivial; but that's something they need to find out if they want to provide you with an email address!
All you should check is that the user supplies some text before an @, some text after it, and the address isn't outrageously long (say 1000 characters). If you want to provide a warning ("this looks like trouble! is there a typo? double-check before continuing"), that's fine, but it shouldn't block the add-email-address process.
Of course, if you don't care to ever send email to them, then just take whatever they enter. For example, the address might solely be used for Gravatar, but Gravatar verifies all email addresses anyway.
有可能有非 ASCII 电子邮件地址,如本 RFC 所示:https ://www.rfc-editor.org/rfc/rfc3490但我认为这并没有为所有国家/地区设置,据我了解每个国家只允许使用一种语言代码,还有一种方法可以将其转换为 ASCII,但这不是一个小问题。
我遇到过带有单引号的电子邮件地址,而且也不少见。我们拒绝空格(虽然严格来说是允许的)、超过一个“@”符号和总共短于五个字符的地址字符串。我相信这解决的问题多于造成的问题,到目前为止,十多年来,数十万个地址都拒绝了许多垃圾地址。还有一个触发器可以在插入或更新时将所有电子邮件地址小写。
话虽如此,如果不与所有者往返,就不可能验证电子邮件,但至少我们可以拒绝非常可疑的数据。
以@ Matas Vaitkevicius的回答为基础:我已经在 Python 中修复了更多的正则表达式,使其与此页面和维基百科的此页面上定义的有效电子邮件地址相匹配,使用了很棒的 regex101 网站:https://regex101。 com/r/uP2oL7/26
^(([^<>()\[\]\.,;:\s@\"]{1,64}(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@\[*(?!.*?\.\.)(([^<>()[\]\.,;\s@\"]+\.?)+[^<>()[\]\.,;\s@\"]{2,})\]?
希望这对某人有帮助!:)
我查看了 pooh17's answer 中的正则表达式,并注意到如果用句点分隔,它允许本地部分大于 64 个字符(它只是在第一个句点小于 64 个字符之前检查该位)。您可以利用积极的前瞻性来改进这一点,如果您真的想要一个正则表达式,这是我的建议
^(((?=.{1,64}@)[^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|((?=.{1,66}@)".+"))@(?=.{1,255}$)(\[(IPv6:)?[\dA-Fa-f:.]+]|(?!.*?\.\.)(([^\s!"#$%&'()*+,./:;<=>?@[\]^_`{|}~]+\.?)+[^\s!"#$%&'()*+,./:;<=>?@[\]^_`{|}~]{2,}))$