PHP过滤器:验证电子邮件地址最大长度

3

当使用PHP的FILTER_VALIDATE_EMAIL时,允许的最大字符长度是多少?

我正在测试我的脚本以测试允许的最大长度功能(200个字符),但当我使用超过200个字符的电子邮件时,PHP的FILTER_VALIDATE_EMAIL会返回false。


嗯,你的测试数据是什么? - ʰᵈˑ
2个回答

13
如果电子邮件确实有效,则应该可以正常处理你的200+字符电子邮件数据。你确定你提供的是有效的电子邮件吗?
有效电子邮件的条件如下:
电子邮件地址的最大长度为254个字符。
每个电子邮件地址由两部分组成。本地部分位于“@”符号之前,域部分在其后。“user@example.com”中,本地部分为“user”,域部分为“example.com”。
本地部分不能超过64个字符,域名部分不能超过255个字符;
所有字符(包括“@”和标点符号)的总长度不得超过254个字符。
因此,电子邮件地址最多可以有254个字符。创建地址时,请确保您的用户名少于65个字符(前提是域名长度最多为188个字符)。

2
这就是我一直在寻找的。结果发现是因为我测试的“本地部分”超过了64个字符长。 - James Walker
2
是的,带有本地部分的信息非常有帮助! - Basster

2
看起来“域名可以长达254个字符”这部分不正确。这是我的测试数据。
<?php
$str = 'garahasgcdotrrriefvdqvegtartfhpnlwizanrhcqirnqllicyjhttvdylvkqccpljzrgledgqpjbttgwbqwgtkytkjxtufqcermdywzthceowyurrlmvvbiljraidwnmznazymwcjdozfaauzcnlwsxqfzgpzbsru1234567890ukxzqsvowzhnwnzzdzokhcffkpdvwycpcmxdknjvaakqjgjkvtqctpkhvgmeytsypkrfozeljsochfjvlszrwutiq';

$local = substr($str, 0, 64);
$domain = substr($str, 0, 63);
$com =  substr($str, 0, 63);

$email = $local. '@' . $domain . '.' . $com;
$is_valid = filter_var($email , FILTER_VALIDATE_EMAIL);

上面的代码返回TRUE。但是如果我尝试增加$domain或$com,它会失败。当然,根据上面的评论,我也不能增加$local。
因此,总共只接受192个字符。
更新:
回答我自己上面的问题:
看起来,域名规则的254个字符需要进一步解释。
看起来,PHP曾经允许超过63个字符的子域名,直到PHP 5.3.2。当https://bugs.php.net/bug.php?id=49576作为PHP 5.3.3发布的一部分时,它改变了这种行为。
因此,我们可以拥有最长63个字符的子域名。但是域名部分的总长度可以达到254个字符。

e.g

"local[64]@subdomain[63].subdomain[63].subdomain[63]"是有效的,但"local[64]@subdomain[65].subdomain[63]"不是有效的。
域名部分中的每个点都是一个子域名,最多可以有63个字符。
以下是一个示例代码,展示了上述理论(在5.3.2版本之前有效,在5.3.3版本之后无效)- http://3v4l.org/tnUR9#v5214

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