【问题标题】:Verify emails using PHP使用 PHP 验证电子邮件
【发布时间】:2011-04-07 03:03:49
【问题描述】:

当访问者在我的网站上注册时,我如何验证他/她使用的电子邮件是否有效。我想通过电子邮件向他们发送一个链接,他们可以点击该链接来证明他们的会员资格,如何做到这一点?

【问题讨论】:

  • 您要验证电子邮件 ID 还是还要检查电子邮件 ID 是否存在?
  • 这在很大程度上取决于您的托管解决方案,这里的最佳答案是什么,但您可以从查看 PHPMailer 开始

标签: php mysql email-validation


【解决方案1】:

在高层次上,你想做的大致如下:

  • 当用户注册时,创建一个用户自己猜不出来的密码
    • 这可以是像随机字符串一样随机分配的东西
    • 这也可以是您可以通过程序计算(但用户不能)的东西,例如将用户电子邮件地址的 MD5 连接到一个秘密字符串;这样做可以为您节省一个数据库列,因为您不必存储它
  • 保存密码并以电子邮件中的链接形式发送给用户
  • 在该链接设置监听器,如果代码匹配,“激活用户”

至于如何一步一步做,tutorials abound

【讨论】:

    【解决方案2】:

    创建一个唯一的随机数,并将其与用户 ID 一起存储在一个表中。通过电子邮件向他们发送一条消息,其中包含指向接受随机数作为输入的页面的链接。如果他们有正确的随机数,则将他们的帐户标记为有效。

    【讨论】:

      【解决方案3】:

      如果您使用的是 PHP 5.2 或更高版本,一个选项是 filter_var 函数...

      if (filter_var('email@example.com', FILTER_VALIDATE_EMAIL) !== FALSE)
      

      【讨论】:

      • 虽然关于 FILTER_VAL 的蹩脚部分
      • 我不认为他只想验证电子邮件的格式。他想验证该电子邮件是属于用户的真实电子邮件地址。因此,他想发送一封确认电子邮件,其中包含用户必须单击的链接。如果用户输入了伪造的电子邮件,他将无法验证他的帐户并登录。
      【解决方案4】:

      将采用以下方法。

      用户注册。 数据库更新了它们的详细信息,并为活动/非活动添加了一个标志。 电子邮件将发送到带有链接的注册电子邮件地址。 链接转到可以确认电子邮件地址有效并更新数据库的页面。

      不知道您在什么环境中工作并做出一些假设,这大致就是您的工作方式。

      我假设您已经在保留用户注册? 对于以下内容,您将希望生成某种散列并将其与用户/成员详细信息一起插入...

      $hash = substr(md5(uniqid()), 0, 5);
      

      您对构建电子邮件视图并使用 phpMailer 或类似工具发送它有信心吗? 如果是这样,请使用链接,当它被点击时,将获取 member_id 和 member_hash 等等,如下所示...... 我在这里再次使用了 PDO,有很多方法可以做你想做的事……任何对你最好的。

      // PDO Instance
      $pdo = $this->actionServer->getDataSource('PDO');
      
      $findMember = $pdo->prepare('SELECT * FROM member WHERE member.member_id = :memberId AND member.member_hash = :memberHash AND hidden = 1');
      $findMember->bindParam(':memberId', $memberId);
      $findMember->bindParam(':memberHash', $memberHash);
      $findMember->execute();
      $findMemberResult = $findMember->fetch(PDO::FETCH_ASSOC);
      
      if (empty($findMemberResult)) {
          $this->log->error('Could not find member based on ID and Hash combination');
          throw new HTTPException(404);
      }
      
      /**
       * Could use a method like below to approve
       */
      
      protected function approveMember($memberId, $pdo) {
          $sql = 'UPDATE member SET member.hidden = 0 WHERE member.member_id = :memberId';
          $updateMember = $pdo->prepare($sql);
          $updateMember->bindParam(':memberId', $memberId);
          $updateMember->execute();
      }
      

      希望对您有所帮助!

      欢呼

      【讨论】:

        【解决方案5】:

        我在某个时间点做了类似的事情,但是我不必验证用户是否存在,我确实需要验证格式以及它是否是真实域 (scrub none@none.com) .你可以看看我的函数并从那里开始。

        //Verify formatting
        function verify_email($email){
        
            if(!preg_match('/^[_A-z0-9-]+((\.|\+)[_A-z0-9-]+)*@[A-z0-9-]+(\.[A-z0-9-]+)*(\.[A-z]{2,4})$/',$email)){
                return false;
            } else {
                return $email;
            }
        }
        
        //Verify MX records exist
        function verify_email_dns($email){
        
            // This will split the email into its front
            // and back (the domain) portions
            list($name, $domain) = split('@',$email);
        
            if(!(checkdnsrr($domain,'MX') || checkdnsrr($domain, 'A'))){
        
                // No MX record found
                return false;
        
            } else {
        
                // MX record found, return email
                return true;
        
            }
        }
        

        您也可以查看stack question

        【讨论】:

        • 另外,none.com 的人会不高兴,因为这是一个实际的域(即使人们继续使用它,就好像它不是一样)。你的意思是example.com
        • 我对@Sourav 说的话。至少你包括了 .info 和 .mobi,但是嘿,“.travel 不存在(2001 年!),.museum 不存在(2001 年!),.рф 不存在(2010 年),啦啦啦” .
        • 不要这样做。这是一个可怕的想法。接受用户作为电子邮件地址输入的任何内容,前提是它包含@ 和句点,并通过向他们发送电子邮件 进行验证。我厌倦了过度热心/损坏的电子邮件地址验证。
        • @downvoters 这个解决方案在我的应用程序中对我有用,我建议验证域作为开始的地方。我还提供了一个类似 SO question 的链接。
        猜你喜欢
        • 2016-02-29
        • 2011-09-25
        • 2017-03-19
        • 2017-11-19
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        • 2016-06-13
        相关资源
        最近更新 更多