电子邮件地址验证方法(订阅按钮)

时间:2010-07-15 07:53:33

标签: php validation email subscription

我正在使用php编写网站,我目前正在联系我们页面,我想知道验证电子邮件地址的最佳方法是什么?

  1. 通过向其电子邮件发送验证链接?
  2. 正则表达式
  3. 还有其他方法吗?
  4. 你也可以告诉我为什么和我的方式指导实现它?我不希望有人为我做代码,因为这对我来说没什么好玩的,我不会学习,只是对用于实现上述方法的技术的一些指导。

    此外,我将使用这些方法在我的网页上实现订阅按钮。这是最好的方法吗?我应该考虑的任何其他方法吗?

10 个答案:

答案 0 :(得分:16)

我通常会经历这些步骤

  1. 正则表达式
  2. 向电子邮件发送激活码
  3. 如果第一步失败,它永远不会达到第二步。 如果电子邮件发送失败,因为电子邮件不存在我删除帐户或做其他一些事情

    - 修改

    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';
  • 如果$ checkDNS设置为true,它将验证域是否存在。如果域不存在,即使电子邮件有效,该函数也会返回false。
  • 如果$ diagnose设置为true,则函数返回代码而不是布尔值,该代码将告诉您电子邮件无效的原因(如果有效则为0)。

答案 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;