- 通过向其电子邮件发送验证链接?
- 正则表达式
- 其他任何方法?
另外,我将使用这些方法在我的网页上实现一个订阅按钮。这是最好的方法吗?还有其他方法应该考虑吗?
我通常会按照以下步骤进行:
如果第一步失败,则不会执行第二步。 如果发送电子邮件失败是因为该电子邮件不存在,我会删除帐户或执行其他操作。
--编辑
3- 如果由于某些原因激活电子邮件未能发送,电子邮件未被删除,它会保持未批准状态 7 天(或由您配置),每隔 2-3 小时尝试重新发送电子邮件,在这些天之后,如果没有成功,则删除电子邮件
4- 如果电子邮件成功发送但未激活,则保持未批准状态,但可通过生成新的激活码随时重新激活。
我认为最好的方法是将第3种和第1种方法结合起来。
在最初阶段,您应该对电子邮件进行语法验证(以捕获拼写错误):
filter_var($email, FILTER_VALIDATE_EMAIL)
其次,您可以发送一封电子邮件,并在其中包含确认链接(这样可以同时捕获错误和故意提供错误信息)。
filter_var()
,它非常棒。 - BoltClock最好的方法是发送一封带有验证链接的电子邮件。如果您不想要激活电子邮件,至少验证电子邮件地址。最好的电子邮件验证函数是 Dominic Sayers 的RFC兼容电子邮件地址验证器。
只需在项目中包含php文件,并像这样使用:
if (is_email($email, $checkDNS, $diagnose)) //$checkDNS and $diagnose are false by default
echo 'Email valid';
else
echo 'Email invalid';
这取决于用户是否真的想要收到回复。
如果用户提出问题,他会想要回答并可能提供有效的电子邮件地址。在这种情况下,我会使用非常宽松的正则表达式检查来捕获拼写错误或缺少地址。(类似于.+@.+
)
如果用户不想被联系,但您想知道他们的地址,您需要使用验证链接。没有其他方法可以确保电子邮件地址是有效的并属于用户。
filter_var
函数的FILTER_VALIDATE_EMAIL
选项也相当不可靠。我使用EmailAddressValidator Class来测试电子邮件地址语法。filter_var
返回的错误结果示例(PHP Version 5.3.2-1ubuntu4.2)。可能还有更多。有些确实有点极端,但仍值得注意:
RFC 1035 2.3.1. 首选名称语法echo filter_var('name@example', FILTER_VALIDATE_EMAIL);
// name@example
echo filter_var('name@1example.com', FILTER_VALIDATE_EMAIL);
// name@1example
echo filter_var('name"quoted"string@example', FILTER_VALIDATE_EMAIL);
// FALSE
echo filter_var('AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com', FILTER_VALIDATE_EMAIL);
// AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com
echo filter_var('name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL);
// name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com
checkdnsrr()
来验证域是否存在并且是否设置了MX记录。这将检测使用虚假域名(如user@idontexist.com)的电子邮件。请注意保留HTML标签。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;
}
在 PHP 5.3 之前的 Windows 版本中,checkdnsrr()
函数不可用,因此我们需要使用 function_exists()
来验证其是否可用。
这取决于您的目标。如果您必须拥有一个有效和活跃的电子邮件,那么您必须发送一封需要验证收据的电子邮件。在这种情况下,除了方便用户之外,没有必要进行正则表达式验证。
但是,如果您的愿望是帮助用户避免输错,同时最大程度地减少用户的烦恼,请使用正则表达式进行验证。
这里有一些好的答案,我同意所选择的答案,除了正则表达式部分。正如其他人指出的那样,很难找到一个完全实现RFC 5321所有怪癖的正则表达式。
欢迎使用我的免费PHP函数is_email()
来验证地址。它可以在这里找到。
它将确保地址完全符合RFC 5321规范。它还可以可选地检查域名是否实际存在。
您不应该依赖验证器告诉您用户的电子邮件地址实际上是否存在:一些ISP向他们的用户提供不符合规范的地址,特别是在不使用拉丁字母的国家/地区。更多关于电子邮件验证的信息,请参见我的文章http://isemail.info/about。
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;