3

如何根据 RFC 5322检查由我的代码生成的电子邮件是否有效?

4

3 回答 3

5

这是一个 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'

与彼得的回答不同,它确实允许单标签域名(在语法上有效)和 IPv6 地址文字。

但是,我强烈建议改为根据 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'
于 2015-05-14T10:05:17.187 回答
0

使用这个正则表达式它的 98% 有效。它不验证以下内容:

postbox@com

admin@mailserver1

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

但它涵盖了其他一切

^(([^<>()[\\]\\.,;:\\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,}))$

注意:这是直接从一些生产 Golang 代码传输的,因此添加了斜杠。

于 2014-07-17T20:08:45.880 回答
0

根据 RFC 5322 政策的电子邮件正则表达式 经过这么多的努力,我使正则表达式根据 5322 验证所有案例,除了一个:(1)admin@mailserver1(没有 TLD 的本地域名,尽管 ICANN 非常不鼓励点少的电子邮件地址)

^(?=.{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|)])$

请单击此处以清楚了解此正则表达式 https://regex101.com/r/7u0dze/1

于 2021-02-18T12:44:02.267 回答