我正在使用php编写网站,我目前正在联系我们页面,我想知道验证电子邮件地址的最佳方法是什么?
你也可以告诉我为什么和我的方式指导实现它?我不希望有人为我做代码,因为这对我来说没什么好玩的,我不会学习,只是对用于实现上述方法的技术的一些指导。
此外,我将使用这些方法在我的网页上实现订阅按钮。这是最好的方法吗?我应该考虑的任何其他方法吗?
答案 0 :(得分:16)
我通常会经历这些步骤
如果第一步失败,它永远不会达到第二步。 如果电子邮件发送失败,因为电子邮件不存在我删除帐户或做其他一些事情
- 修改
3 - 如果由于某种原因未发送激活电子邮件,则电子邮件不会被删除,它会在7天内保持未经批准(或由您配置),每隔2-3小时就会尝试重新发送电子邮件,在那些日子之后如果没有成功,电子邮件将被删除
4 - 如果电子邮件发送成功但未激活,则会保持未批准但可以通过生成新的激活码随时重新激活
答案 1 :(得分:11)
我认为最好是3和1的组合。
在初始阶段,您在语法上验证电子邮件(以捕捉拼写错误):
filter_var($email, FILTER_VALIDATE_EMAIL)
在第二个中,您发送一封带有确认地址的电子邮件(以捕获错误和故意错误的信息)。
答案 2 :(得分:4)
最好的方法是发送一封带有验证链接的电子邮件。至少如果您不想要激活电子邮件,请验证电子邮件地址。最好的电子邮件验证功能是RFC-compliant email address validator by Dominic Sayers。
只需在项目中包含php文件并按如下方式使用:
if (is_email($email, $checkDNS, $diagnose)) //$checkDNS and $diagnose are false by default
echo 'Email valid';
else
echo 'Email invalid';
答案 3 :(得分:3)
这取决于用户是否真的想收到回复。
如果用户提出问题,他会想要回复并可能提供有效的电子邮件地址。在这种情况下,我会使用非常宽松的正则表达式检查来捕获拼写错误或丢失地址。 (类似于.+@.+
。)
如果用户不想联系,但您想知道他们的地址,则需要使用验证链接。没有其他方法可以确保电子邮件地址有效并且属于用户。
答案 4 :(得分:3)
真正了解电子邮件是否有效的唯一方法是向其发送电子邮件。如果你真的需要,请使用these之一。 Technically,@本地域之后甚至不需要任何句点。所有必要的是一个域跟随@。
答案 5 :(得分:2)
正则表达式不适合确定电子邮件地址语法的有效性,而filter_var
函数的FILTER_VALIDATE_EMAIL
选项也不太可靠。我使用EmailAddressValidator Class来测试电子邮件地址语法。
我已经汇总了filter_var
(PHP Version 5.3.2-1ubuntu4.2)返回的错误结果的一些示例。可能还有更多。有些人肯定有点极端,但仍然值得注意:
RFC 1035 2.3.1。首选名称语法
http://tools.ietf.org/search/rfc1035
总结为:域由由点分隔符分隔的标签组成(但对于本地域不一定是这样)。
echo filter_var('name@example', FILTER_VALIDATE_EMAIL);
// name@example
RFC 1035 2.3.1。首选名称语法
标签必须遵循ARPANET主机名的规则。它们必须以字母开头,并带有字母或数字,并且内部字符只有字母,数字和连字符。
echo filter_var('name@1example.com', FILTER_VALIDATE_EMAIL);
// name@1example
RFC 2822 3.2.5。引用字符串
http://tools.ietf.org/html/rfc2822#section-3.2.5
这是有效的(虽然它被许多邮件服务器拒绝):
echo filter_var('name"quoted"string@example', FILTER_VALIDATE_EMAIL);
// FALSE
RFC 5321 4.5.3.1.1。本地部分强>
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1
用户名或其他本地部分的最大总长度为64个八位字节
测试70个字符:
echo filter_var('AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com', FILTER_VALIDATE_EMAIL);
// AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com
RFC 5321 4.5.3.1.2。域强>
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.2
域名或号码的最大总长度为255个八位字节
测试260个字符:
echo filter_var('name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL);
// name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com
有关详细信息,请查看Validate an E-Mail Address with PHP, the Right Way。
答案 6 :(得分:2)
在发送验证电子邮件之前,您还可以使用checkdnsrr()
验证该域是否存在以及是否设置了MX记录。这将检测使用虚假域名的电子邮件(如user@idontexist.com)。
function validateEmail($email, $field, $msg = '')
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL))
{
return false;
}
list($user, $domain) = explode('@', $email);
if (function_exists('checkdnsrr') && !checkdnsrr($domain, 'MX'))
{
return false;
}
return true;
}
我们需要使用function_exists()
验证checkdnsrr()
是否适用于我们,因为在PHP 5.3之前它无法在Windows上使用。
答案 7 :(得分:1)
取决于您的目标。如果您必须拥有有效且有效的电子邮件,则必须发送要求验证收据的电子邮件。在这种情况下,除了为了方便用户之外,不需要正则表达式验证。
但如果您希望帮助用户避免拼写错误,同时尽量减少用户烦恼,请使用正则表达式进行验证。
答案 8 :(得分:0)
这里有一些好的答案,我同意所选的一个,除了正则表达式位。正如其他人指出的那样,要找到一个完全实现RFC 5321所有怪癖的正则表达式,即使不是不可能也是如此。
欢迎您使用我的免费PHP函数is_email()
来验证地址。它可用here。
它将确保地址完全符合RFC 5321。它还可以选择检查域是否确实存在。
您不应该依赖验证器来告诉您用户的电子邮件地址是否确实存在:某些ISP会向其用户提供不合规的地址,尤其是在不使用拉丁字母的国家/地区。更多关于电子邮件验证的文章:http://isemail.info/about。
答案 9 :(得分:-1)
function checkEmail($email) {
if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])
↪*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",
$email)){
list($username,$domain)=split('@',$email);
if(!checkdnsrr($domain,'MX')) {
return false;
}
return true;
}
return false;