一个电子邮件地址中可以有多少个@符号?

33

在任何电子邮件地址中是否有特定数量的@符号的规则? 只是想到如果我们要使用PHP检查电子邮件地址是否有效。


3
据我所知,您只能有一个。 "@" 符号是域名和地址名称之间的分隔符;多个 "@" 符号很可能会混淆电子邮件解析器。 - Palladium
@PaulTomblin ..那是分隔符.. :-) - user166390
您所说的“email id”是指电子邮件地址吗? - jtheman
6个回答

40
如果有多个引用的@是允许的。我必须问一下,为什么您需要这些信息。请不要尝试编写正则表达式/函数或其他内容来验证电子邮件地址。您必须考虑3个rfc(如果您想考虑unicode,则可能是4个)。而且您将会失败,这会让您发疯。 如需更多信息和可在旧版本PHP中使用的正则表达式,请参见我的先前答案 附言:
如果有人没有理解我的意思:永远不要尝试自己验证电子邮件地址。

这里再确认一下,您的意思是在用户名中可以有多个'@'符号,对吗?域名中不能有'@'符号,对吗?我问这个问题是为了从提交的电子邮件中获取主机名以检查mx记录,这是我所知道的标准验证方案。 - Jamie Marshall
根据您的最后一点...与其花费时间使用正则表达式等尝试验证地址,通常的做法是向相关地址发送一封电子邮件,并附带一个验证链接。最终用户点击该链接,这将作为验证的证明:1)电子邮件地址是真实存在的;2)相对而言也是活跃的,并且用户可以访问。从数据库的角度来看,可以在用户帐户旁边存储一个验证密钥,以及一个无效或有效状态的标志。 - ThisClark

26

可以有任意数量的字符(在电子邮件地址大小限制内),但最后一个必须是域名和"本地部分"之间的分隔符。

如果本地部分中存在@或任何其他“不寻常”的字符(如RFC 5322所定义),它必须用引号括起来,例如:"user@something"@example.com


20

@字符方面没有特定的限制。

"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com是一个有效的地址。

另请参阅有关该主题的维基百科页面


1
addr-spec是一种特定的互联网标识符,它包含一个本地解释的字符串,后面跟着“@”字符(ASCII值为64),然后是一个互联网域。本地解释的字符串可以是引用字符串或点原子。如果该字符串可以表示为点原子(即它不包含除atext字符或由atext字符包围的“.”之外的任何字符),则应使用点原子形式,不应使用引用字符串形式。在addr-spec中,“@”周围不应使用注释和折叠空格。
参见:https://www.rfc-editor.org/rfc/rfc5322#section-3.4.1

1

我的真正问题是,电子邮件中是否有两个@符号是有意义的?
它该如何运作?

我会使用 filter_var()FILTER_VALIDATE_EMAIL。以下是一个示例用法和输出:

function testemail($email) {
    echo "'$email' => ";
    var_dump(filter_var($email, FILTER_VALIDATE_EMAIL));    
    echo "<br />";
}

testemail('');
testemail('myemailsample.com');
testemail('myemail@sample');
testemail('myemail@sample.com');
testemail('myemail@@sample.com');
testemail('myemail@sa@mple.com');

输出,

'' => bool(false)
'myemailsample.com' => bool(false)
'myemail@sample' => bool(false)
'myemail@sample.com' => string(18) "myemail@sample.com"
'myemail@@sample.com' => bool(false)
'myemail@sa@mple.com' => bool(false)


3
如果规范允许的话,使用两个 @ 符号是有意义的。尽管有人可能会对规范的荒谬性提出质疑。 - PeeHaa
看起来是真的, '"my@email"@sample.com' => string(21) ""my@email"@sample.com" - Jared Paolin

0
要检查有效的电子邮件地址,应该使用filter_var函数。它将验证字符串并返回true或false。你不需要考虑正则表达式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接