我并不是在问如何完整验证电子邮件。
我只想知道电子邮件地址中用户名
和服务器
部分允许使用哪些字符。这可能有些简化了,也许电子邮件地址可以采用其他形式,但我不关心。我只是询问这个简单的形式:用户名@服务器
(例如 wild.wezyr@best-server-ever.com),并且两部分允许使用哪些字符。
我并不是在问如何完整验证电子邮件。
我只想知道电子邮件地址中用户名
和服务器
部分允许使用哪些字符。这可能有些简化了,也许电子邮件地址可以采用其他形式,但我不关心。我只是询问这个简单的形式:用户名@服务器
(例如 wild.wezyr@best-server-ever.com),并且两部分允许使用哪些字符。
关于这个问题的好文章。
摘录:
These are all valid email addresses!
"Abc\@def"@example.com
"Fred Bloggs"@example.com
"Joe\\Blow"@example.com
"Abc@def"@example.com
customer/department=shipping@example.com
\$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com
Joe.\\Blow@example.com
(不带引号)。这是有效的吗?
鉴于这里的答案并不清楚,这个问题似乎并不明确。但我提出这个问题是因为我曾经看到过(非常少见的)DNS SoA rname电子邮件字符串包含反斜杠。 - wesinat0r已经有很多人尝试回答这个问题。也有很多人说很多答案已经过时了。以下是我在2022年的回答。
显然,这个问题的答案并不像它被提出的那么简单。具体来说,关于邮箱名称(在这个上下文中是<user-name>)的命名所提出的标准,以及这些RFC的解释,非常繁多。
对于<user-name>部分,通用接受管理组已在一份名为UASG-028的文件中提供了详细的指南,说明电子邮件ID本地部分包括哪些内容。
对于<server>部分,在此提到的所有字符“应用程序的Unicode代码点和国际化域名(IDNA)”都具有字符状态“PVALID”。此外,状态为“CONTEXTJ”和“CONTEXTO”的字符在某些上下文条件下也是有效的。
答案是(几乎)ALL
(7位ASCII码)。
如果包含规则是“...在某些/任何/没有条件下允许...”
仅通过查看RFC 5322页面17顶部中“域文本”部分中允许文本的多个可能包含规则之一,我们就可以找到:
dtext = %d33-90 / ; Printable US-ASCII
%d94-126 / ; characters not including
obs-dtext ; "[", "]", or "\"
这个描述中唯一缺失的三个字符用于 domain-literal []
中,以形成一个 quoted-pair \
和空格字符
(%d32)。因此整个范围 32-126(十进制)被使用。类似的要求出现在“qtext”和“ctext”中。许多控制字符也被允许/使用。这样的控制字符列表出现在第31页 RFC 5322的4.1节 中,称为 obs-NO-WS-CTL。
obs-NO-WS-CTL = %d1-8 / ; US-ASCII control
%d11 / ; characters that do not
%d12 / ; include the carriage
%d14-31 / ; return, line feed, and
%d127 ; white space characters
所有这些控制字符都被允许,正如在第3.5节开头所述:
.... MAY be used, the use of US-ASCII control characters (values
1 through 8, 11, 12, and 14 through 31) is discouraged ....
这样的包含规则因此“太宽泛”了。或者换句话说,期望的规则“过于简单化”。
可以在这个维基百科链接中找到。
电子邮件地址的 local-part 可以使用以下任何 ASCII 字符: local part starts with a period ( .account@host.com )
local part ends with a period ( account.@host.com )
two or more periods in series ( lots..of...dots@host.com )
&’`*|/ ( some&thing`bad@host.com )
more than one @ ( which@one@host.com )
:% ( mo:characters%mo:problems@host.com )
John.."The*$hizzle*Bizzle"..Doe@whatever.com --> John..Doe@whatever.com
John..Doe@whatever.com --> John.Doe@whatever.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";
}
?>
Gmail 仅允许使用加号 + 作为特殊字符,并且在某些情况下(.)也可以使用,但是其他任何特殊字符都不允许在 Gmail 中使用。RFC 规定可以使用特殊字符,但应避免向 Gmail 发送包含特殊字符的邮件。
"hello world"@example.com
是合法的。 - user253751