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

Php 电子邮件地址验证方法(订阅按钮),php,validation,email,subscription,Php,Validation,Email,Subscription,我正在用php编写一个网站,我现在在联系我们页面上,我想知道验证电子邮件地址的最佳方法是什么 通过向他们的电子邮件发送验证链接 正则表达式 还有别的方法吗 另外,你能告诉我为什么以及我实现这一目标的指南吗?我不希望有人帮我编写代码,因为这对我来说毫无乐趣,我也不会学习,只会对实现上述两种方法所使用的技术提供一些指导 我还将使用这些方法在我的网页上实现订阅按钮。这是最好的方法吗?我还应该使用其他方法吗?我通常会执行这些步骤 正则表达式 向电子邮件发送激活码 如果第一步失败,它永远不会到达第二步。

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

  • 通过向他们的电子邮件发送验证链接
  • 正则表达式
  • 还有别的方法吗
  • 另外,你能告诉我为什么以及我实现这一目标的指南吗?我不希望有人帮我编写代码,因为这对我来说毫无乐趣,我也不会学习,只会对实现上述两种方法所使用的技术提供一些指导


    我还将使用这些方法在我的网页上实现订阅按钮。这是最好的方法吗?我还应该使用其他方法吗?

    我通常会执行这些步骤

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

    --编辑

    3-如果出于某种原因激活电子邮件未发送,电子邮件未被删除,它会在7天内(或按照您的配置)保持未批准状态,则每隔2-3小时尝试重新发送一次电子邮件,如果未成功,则在这几天之后删除电子邮件


    4-如果电子邮件发送成功但未激活,则它将保持未批准状态,但可以随时通过生成新的激活码重新激活,这取决于用户是否确实希望收到响应

    如果用户提出问题,他会希望得到回复,并可能给出他的有效电子邮件地址。在这种情况下,我会使用一个非常松散的正则表达式检查来捕捉拼写错误或丢失的地址。(类似于
    ++.++


    如果用户不想联系,但您想知道他们的地址,则需要使用验证链接。没有其他方法可以确保电子邮件地址有效且属于用户。

    我认为最好是3个地址的组合。和1

    在初始阶段,您需要对电子邮件进行语法验证(以捕捉打字错误):


    第二种方法是发送一封带有确认地址的电子邮件(以捕捉错误和故意错误的信息)。

    真正知道电子邮件是否有效的唯一方法是向其发送电子邮件。如果你真的必须这样做,请使用其中一种,本地域的@之后甚至不必有任何句点。所需要的只是一个遵循@的域。

    取决于您的目标。如果您必须有一封有效且有效的电子邮件,那么您必须发送一封需要确认收到的电子邮件。在这种情况下,除了方便用户之外,不需要进行正则表达式验证


    但是,如果您希望帮助用户避免输入错误,同时最大限度地减少用户的烦恼,请使用正则表达式进行验证。

    正则表达式并不真正适合确定电子邮件地址语法的有效性,而且该函数的
    过滤器\u验证\u电子邮件
    选项也相当不可靠。我使用测试电子邮件地址语法

    我总结了一些由
    filter\u var
    (PHP版本5.3.2-1ubuntu4.2)返回的错误结果示例。可能还有更多。诚然,有些有点极端,但仍然值得注意:

    RFC 1035 2.3.1。首选名称语法

    总结为:域由点分隔符分隔的标签组成(但对于本地域不一定如此)

    RFC 1035 2.3.1。首选名称语法
    标签必须遵循ARPANET主机名的规则。它们必须以字母开头,并以字母或数字开头,内部字符只有字母、数字和连字符

    echo filter_var('name@1example.com', FILTER_VALIDATE_EMAIL);
    // name@1example
    
    RFC 2822 3.2.5。带引号的字符串

    这是有效的(尽管它被许多邮件服务器拒绝):

    RFC 5321 4.5.3.1.1。本地部分

    用户名或其他本地部分的最大总长度为64个八位字节。
    使用70个字符进行测试:

    echo filter_var('AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com', FILTER_VALIDATE_EMAIL);
    // AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com
    
    echo filter_var('name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL);
    // name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com
    
    RFC 5321 4.5.3.1.2。域

    域名或数字的最大总长度为255个八位字节。
    使用260个字符进行测试:

    echo filter_var('AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com', FILTER_VALIDATE_EMAIL);
    // AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com
    
    echo filter_var('name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL);
    // name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com
    

    查看以获取更多信息。

    在发送验证电子邮件之前,您还可以使用该电子邮件验证域是否存在以及是否设置了MX记录。这将检测使用虚假域的电子邮件(如user@idontexist.com)

     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;
    

    我们需要使用
    function\u exists()
    来验证
    checkdnsrr()
    是否可用,因为它在PHP 5.3之前的Windows上不可用。

    最好的方法是发送一封带有验证链接的电子邮件。至少,如果你不想要激活电子邮件,请验证电子邮件地址。最好的电子邮件验证功能是

    只需将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)

      • 这里有一些不错的答案,我同意所选择的答案,除了正则表达式位。正如其他人所指出的,要找到一个完全实现RFC5321所有特性的正则表达式即使不是不可能,也是很困难的

        欢迎您使用我的免费PHP函数
        is\u email()
        验证地址。有空

        它将确保地址完全符合RFC 5321。它还可以选择检查域是否实际存在


        你不应该依赖验证器来告诉你用户的电子邮件地址是否确实存在:一些ISP向用户提供不符合要求的地址,特别是在不使用拉丁字母的国家。更多关于电子邮件验证的文章如下:。

        可能重复:Regex不会验证电子邮件,它只会验证用户输入看起来像电子邮件。(adasdsa@dadsd.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;
        }
        
        if (is_email($email, $checkDNS, $diagnose)) //$checkDNS and $diagnose are false by default
            echo 'Email valid';
        else
            echo 'Email invalid';