简体   繁体   English

RFC 5322 电子邮件格式验证

[英]RFC 5322 email format validation

How can I check if emails that are generated by my code a valid according to RFC 5322 ?如何根据RFC 5322检查由我的代码生成的电子邮件是否有效?

Here's a PCRE regular expression (taken from a PHP library) that will validate according to RFC 5322:这是一个 PCRE 正则表达式(取自 PHP 库),它将根据 RFC 5322 进行验证:

'/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z\d-]{64,})(?1)(?>([a-z\d](?>[a-z\d-]*[a-z\d])?)(?>(?1)\.(?!(?1)[a-z\d-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f\d]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f\d][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f\d]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?>\.(?9)){3}))\])(?1)$/isD'

Unlike Peter's answer it does allow for single-label domain names (which are syntactically valid) and IPv6 address literals.与 Peter 的回答不同,它确实允许使用单标签域名(在语法上是有效的)和 IPv6 地址文字。

However, I'd strongly suggest to instead validate according to RFC 5321 which doesn't allow for comments or folding white space (which are semantically invisible and so not actually a part of the email address) or for obsolete local parts (which can just be re-written as non-obsolete quoted strings):但是,我强烈建议改为根据 RFC 5321 进行验证,该 RFC 5321 不允许注释或折叠空白(在语义上不可见,因此实际上不是电子邮件地址的一部分)或过时的本地部分(只能被重写为非过时的带引号的字符串):

'/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!"?(?>\\\[ -~]|[^"]){65,}"?@)(?>([!#-\'*+\/-9=?^-~-]+)(?>\.(?1))*|"(?>[ !#-\[\]-~]|\\\[ -~])*")@(?!.*[^.]{64,})(?>([a-z\d](?>[a-z\d-]*[a-z\d])?)(?>\.(?2)){0,126}|\[(?:(?>IPv6:(?>([a-f\d]{1,4})(?>:(?3)){7}|(?!(?:.*[a-f\d][:\]]){8,})((?3)(?>:(?3)){0,6})?::(?4)?))|(?>(?>IPv6:(?>(?3)(?>:(?3)){5}:|(?!(?:.*[a-f\d]:){6,})(?5)?::(?>((?3)(?>:(?3)){0,4}):)?))?(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?>\.(?6)){3}))\])$/iD'

Using this regex its like 98% valid.使用这个正则表达式就像 98% 一样有效。 It doesn't validate the following:它不验证以下内容:

postbox@com

admin@mailserver1

user@[IPv6:2001:db8:1ff::a0b:dbd0]

But it covers everything else但它涵盖了其他一切

^(([^<>()[\\]\\.,;:\\s@\"]+(\\.[^<>()[\\]\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$

Note: This is transported directly from some production Golang code so slashes are added.注意:这是直接从一些生产 Golang 代码传输的,因此添加了斜杠。

Email Regex as per RFC 5322 Policy After so much struggle I made the regex validating all the cases as per 5322 except one: (1)admin@mailserver1 (local domain name with no TLD, although ICANN highly discourages dot less email addresses)根据 RFC 5322 政策发送电子邮件正则表达式 经过如此多的努力,我让正则表达式按照 5322 验证所有案例,除了一个:(1)admin@mailserver1(没有 TLD 的本地域名,尽管 ICANN 强烈反对使用 dot less 电子邮件地址)

^(?=.{1,64}@)((?:[A-Za-z0-9!#$%&'*+-/=?^ \\{\\|\\}~]+|"(?:\\\\"|\\\\\\\\|[A-Za-z0-9\\.!#\\$%&'\\*\\+\\-/=\\?\\^_ {|}~ (),:;<>@[].])+")(?:.(?:[A-Za-z0-9!#$%&'*+-/=?^ \\{\\|\\}~]+|"(?:\\\\"|\\\\\\\\|[A-Za-z0-9\\.!#\\$%&'\\*\\+\\-/=\\?\\^_ {|}~ (),:;<>@[].])+")) )@(?=.{1,255}.)((?:[A-Za-z0-9]+(?:(?:[A-Za-z0-9-] [A-Za-z0-9])?).)+[A-Za-z]{2,})|(((0|[1-9A-Fa-f][0-9A-Fa-f]{0,3}):){0,6}(0|)])$ ^(?=.{1,64}@)((?:[A-Za-z0-9!#$%&'*+-/=?^ \\{\\|\\}~]+|"(?:\\\\"|\\\\\\\\|[A-Za-z0-9\\.!#\\$%&'\\*\\+\\-/=\\?\\^_ {|}~ (),:;< >@[].])+")(?:.(?:[A-Za-z0-9!#$%&'*+-/=?^ \\{\\|\\}~]+|"(?:\\\\"|\\\\\\\\|[A-Za-z0-9\\.!#\\$%&'\\*\\+\\-/=\\?\\^_ {|}~ (),:; <>@[].])+")) )@(?=.{1,255}.)((?:[A-Za-z0-9]+(?:(?:[A-Za-z0- 9-] [A-Za-z0-9])?).)+[A-Za-z]{2,})|(((0|[1-9A-Fa-f][0-9A- Fa-f]{0,3}):){0,6}(0|)])$

Please click here to get a clear idea about this regex https://regex101.com/r/7u0dze/1请单击此处以清楚了解此正则表达式https://regex101.com/r/7u0dze/1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM