我并不是在询问完整的电子邮件验证。
我只想知道电子邮件地址的用户名和服务器部分允许使用哪些字符。这可能过于简单化,也许电子邮件地址可以采取其他形式,但我不在乎。我只问这个简单的表格:user-name@server(例如。wild.wezyr@best-server-ever.com)以及两部分中允许的字符。
我并不是在询问完整的电子邮件验证。
我只想知道电子邮件地址的用户名和服务器部分允许使用哪些字符。这可能过于简单化,也许电子邮件地址可以采取其他形式,但我不在乎。我只问这个简单的表格:user-name@server(例如。wild.wezyr@best-server-ever.com)以及两部分中允许的字符。
当前回答
在我的PHP中,我使用此检查
<?php
if (preg_match(
'/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/',
"tim'qqq@gmail.com"
)){
echo "legit email";
} else {
echo "NOT legit email";
}
?>
自己试试看http://phpfiddle.org/main/code/9av6-d10r
其他回答
请参阅RFC 5322:Internet消息格式,以及RFC 5321:简单邮件传输协议。
RFC 822也涵盖了电子邮件地址,但它主要涉及其结构:
addr-spec = local-part "@" domain ; global address
local-part = word *("." word) ; uninterpreted
; case-preserved
domain = sub-domain *("." sub-domain)
sub-domain = domain-ref / domain-literal
domain-ref = atom ; symbolic reference
和往常一样,维基百科有一篇关于电子邮件地址的文章:
电子邮件地址的本地部分可以使用以下任意ASCII字符:大写和小写拉丁字母A至Z和A至Z;数字0至9;特殊字符!#$%&'*+-/=^_`{|}~;点前提是除非被引用,否则它不是第一个或最后一个字符,并且除非被引用(例如。John..Doe@example.com不允许,但允许使用“John…Doe”@example.com);空格和“(),:;<>@[\]字符允许有限制(它们只允许在带引号的字符串中,如下面的段落所述,此外,反斜杠或双引号前面必须有反斜杠);注释允许在本地部分的两端加括号;例如john.smith(注释)@example.com和(注释)john.smith@example.com都相当于john.smith@example.com.
除ASCII字符外,截至2012年,您可以使用U+007F以上的国际字符,如RFC 6532规范所述,编码为UTF-8,并在维基百科上进行了解释。请注意,截至2019年,这些标准仍标记为“建议”,但正在缓慢推出。此规范中的更改基本上添加了国际字符作为有效的字母数字字符(atext),而不影响对允许和限制的特殊字符(如!#)的规则和@:。
有关验证,请参阅使用正则表达式验证电子邮件地址。
域部分定义如下:
协议的Internet标准(征求意见)要求组件主机名标签只能包含ASCII字母a到z(不区分大小写)、数字0到9和连字符(-)。RFC 952中主机名的原始规范规定,标签不能以数字或连字符开头,也不能以连字符结尾。然而,随后的规范(RFC 1123)允许主机名标签以数字开头。不允许使用其他符号、标点符号或空格。
您可以从维基百科文章开始:
大写和小写英文字母(a-z,a-z)数字0至9字符!#$%&'*+-/=?^ _ `{ | } ~性格(点、句号、句号),前提是它不是第一个或最后一个字符,并且不连续出现两次或多次。
如维基百科链接所示
电子邮件地址的本地部分可以使用以下任意ASCII字符:大写和小写拉丁字母A至Z和A至Z;数字0至9;特殊字符!#$%&'*+-/=^_`{|}~;点前提是除非被引用,否则它不是第一个或最后一个字符,并且除非被引用(例如。John..Doe@example.com不允许,但允许使用“John…Doe”@example.com);空格和“(),:;<>@[\]字符允许有限制(它们只允许在带引号的字符串中,如下面的段落所述,此外,反斜杠或双引号前面必须有反斜杠);注释允许在本地部分的两端加括号;例如john.smith(注释)@example.com和(注释)john.smith@example.com都相当于john.smith@example.com.除上述ASCII字符外,RFC 6531允许使用U+007F以上的国际字符(编码为UTF-8),尽管邮件系统可能会限制在分配本地部分时使用哪些字符。带引号的字符串可以作为点分隔的实体存在于本地部分中,或者当最外面的引号是本地部分的最外面的字符时(例如,abc.“defghi”.xyz@example.com或“abcdefghixyz”@example.com。相反,abc“defghi”xyz@example.com不是;abc\“def\”也不是ghi@example.com). 但是,引号字符串和字符并不常用。RFC 5321还警告“希望接收邮件的主机应避免定义本地部分需要(或使用)引号字符串格式的邮箱”。本地邮局主管会受到特殊对待,不区分大小写,应转发给域电子邮件管理员。从技术上讲,所有其他本地部件都区分大小写,因此jsmith@example.com和JSmith@example.com指定不同的邮箱;然而,许多组织将大小写字母视为等同字母。尽管在技术上有效的特殊字符范围很广;在实践中,组织、邮件服务、邮件服务器和邮件客户端通常不接受所有这些。例如,Windows Live Hotmail仅允许使用字母数字、点(.)、下划线(_)和连字符(-)创建电子邮件地址。常见的建议是避免使用一些特殊字符,以避免电子邮件被拒绝的风险。
谷歌用他们的gmail.com地址做了一件有趣的事情。gmail.com地址只允许字母(a-z)、数字和句点(忽略)。
例如。,pikachu@gmail.com与pi.kachu@gmail.com,两个电子邮件地址将发送到同一邮箱。PIKACHU@gmail.com也发送到同一邮箱。
因此,要回答这个问题,有时取决于实现者希望遵循多少RFC标准。谷歌的gmail.com地址样式与标准兼容。他们这样做是为了避免不同的人使用类似的电子邮件地址时产生混淆。
*** gmail.com accepting rules ***
d.oy.smith@gmail.com (accepted)
d_oy_smith@gmail.com (bounce and account can never be created)
doysmith@gmail.com (accepted)
D.Oy'Smith@gmail.com (bounce and account can never be created)
维基百科链接是关于电子邮件地址通常允许的内容的一个很好的参考。http://en.wikipedia.org/wiki/Email_address
在讨论电子邮件地址的有效本地部分时,公认的答案是维基百科的一篇文章,但维基百科并不是这方面的权威。
IETF RFC 3696是这一问题的权威,应在第3节中查阅。第5页对电子邮件地址的限制:
当代电子邮件地址由“本地部分”组成,与由at符号(“@”)表示的“域名部分”(完全限定的域名)。域部分的语法与前面的部分本节中确定的关于过滤和名称列表适用于电子邮件上下文中使用的域名好域名也可以替换为中的IP地址方括号,但除了测试和故障排除目的。本地部分可能使用所描述的引用约定出现在下面引用的表格在实践中很少使用,但却是必需的出于某些正当目的。因此,不应在过滤例程,但应改为传递到电子邮件系统以供目标主机评估。确切的规则是任何ASCII字符,包括控件字符,可以出现在引号中,也可以出现在带引号的字符串中。当报价为需要,反斜杠字符用于引用以下内容性格例如Abc公司\@def@example.com是电子邮件地址的有效形式。空白也可能出现,如中所示弗雷德\Bloggs@example.com反斜杠字符还可以用于引用自身。,乔\\Blow@example.com除了使用反斜杠字符引用外双引号字符可用于环绕字符串。例如"Abc@def“@example.com”“Fred Blogs”@example.com是上述前两个示例的替代形式。这些引用的表单很少被推荐,在实践中也不常见,但是必须由正在处理的应用程序支持电子邮件地址。特别是,引用的表格经常出现在与来自其他系统的转换相关联的地址上下文和背景;这些过渡要求仍然存在,因为接受用户提供的电子邮件地址的系统不能“知道”该地址是否与旧系统关联地址表格必须被接受并传递到电子邮件环境中。如果没有引号,本地部分可以由以下任意组合组成字母字符、数字或任何特殊字符! # $ % & ' * + - / = ? ^ _ ` . { | } ~句点(“.”)也可能出现,但不能用于开始或结束也不能出现两个或多个连续周期。换句话说,除了at符号(“@”)、反斜杠、双引号、逗号或方括号可能出现而不引用。如果排除了要显示字符,必须引用它们。表单,如用户+mailbox@example.com客户/部门=shipping@example.com$A12345@example.com!定义!xyz%abc@example.com_somename@example.com是有效的,并且很常见,但任何字符允许使用上面列出的。
正如其他人所做的,我提交了一个既适用于PHP又适用于JavaScript的正则表达式来验证电子邮件地址:
/^[a-z0-9!'#$%&*+\/=?^_`{|}~-]+(?:\.[a-z0-9!'#$%&*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-zA-Z]{2,}$/i