如何在Php中创建帐户电子邮件确认?

时间:2012-03-02 02:27:22

标签: php email-validation user-accounts

我正在尝试向用户发送包含链接的电子邮件(就像许多网站一样),当他们点击此链接时,他们的帐户将被激活。我究竟如何在Php中做到这一点?

5 个答案:

答案 0 :(得分:5)

我会这样做:

1)完成注册后,将帐户标记为非活动状态(待定确认),并创建两个随机字符串。

2)将两个字符串存储在数据库中并将其与用户关联。

3)通过电子邮件发送指向用户的链接,该链接包含指向您网站页面的链接,并包含两个字符串。

例如:www.mysite.com/confirm.php?auth1=j0832r2&auth2=fji4j32ion

4)让您的页面检查两个代码是否匹配,如果匹配,则将该帐户标记为活动。

希望这有帮助。

答案 1 :(得分:3)

以下是我用来发送验证邮件的代码部分。

//create login hash
$hash = hash('whirlpool', $user->authentication->password . time() . $user->authentication->salt);
if( !Quick_Login::add($hash, $user->userid, time() + 3600, 0) )
{
    // die
}

//load email template
ob_start();
include('templates/account_create.html');
$body = ob_get_clean();

if( Mail::sendMail($user->contact->email, 'no-reply-automator@domain.com', "Email Verification", $body) )
{
    //redirect to login         
    throw new RedirectBrowserException("/index.php?code=6");
}

Mail类为a simple mailer that I built,您可以轻松使用php mail()函数。

此处加载的电子邮件模板是:

<html>
<body>
    <div style="width: 600px; border: 2px solid #E9EBF6; margin: auto; font-size: 16px; color: #555555;">
        <h1 style="margin: 0; padding: 8px; background-color: #E9EBF6; text-align: center;">
            Hello, <?=$user->fname;?>!
        </h1>
        <div style="overflow: hidden; padding: 8px; padding-top: 0; background-color: #F5F6FB;">
            <p>You are receiving this email because you (or someone pretending to be you!) has signed up for a new account on the Domain System.</p>
            <p>If you would like to verify this email account (and you must in order to use the system), please <a href="http://domain.com/components/authentication/verify.php?code=<?=$hash;?>">click this link</a>.</p>
            <p>If you don't know what this is about, or you don't want the account, simply do nothing.</p>
            <p>The quick login link above is a one-time access pass to your account.  Please use the link to verify your email address and complete your account signup.</p>
            <br />
            <p>Thanks!</p>
            <p>-Domain</p>
        </div>
    </div>
</body>
</html>

他们点击的链接转到此脚本(verify.php):

<?php
    set_include_path('../../backbone:../../global:../../jquery:../../components:../../content:../../images:../../model:../../render:../../scripts:../../styles');
    require_once('RedirectBrowserException.php');
    require_once('User.php');
    require_once('Session.php');
    require_once('Quick_Login.php');
    setSession(0, '/');

    $code = isset($_GET['code']) ? $_GET['code'] : null;

    if( $code )
    {
        $ql = Quick_Login::getByHash($code);
        if( $ql )
        {
            $user = User::getByID($ql->userid);
            $user->disabled = 0;
            $user->save();

            setSessionVar('active', true);
            setSessionVar('roleid', $user->authentication->role->roleid);
            setSessionVar('userid', $user->userid);

            $ql->used = 1;
            $ql->save();

            throw new RedirectBrowserException("/home.php?code=0");
        }
        else
        {
            throw new RedirectBrowserException('/index.php?code=9');
        }
    }
    else
    {
        throw new RedirectBrowserException('/index.php?code=9');
    }
?>

您会在最后一个脚本中看到它在其帐户中设置disabled=0,并将其登录(在会话中设置active,并指定他们的roleid和{会议{1}}。

希望这有帮助。

更新

这就是在没有所有代码的情况下发生的事情。

  1. 创建一个随机字符串(最好是一个不可随意猜测的字符)
  2. 该字符串存储在数据库中,并带有指向用户ID的链接
  3. 向用户发送一封电子邮件,其中包含指向脚本和哈希的链接(例如userid
  4. 当用户单击链接时,处理它的脚本会检查数据库中是否有该字符串(verify.php?code=sdflnsdlknsge98y32598swob)。如果它有效,它会在用户的帐户上设置一个标记,表明他们已经验证了他们的电子邮件地址。
  5. [可选]脚本还可以在用户验证其电子邮件地址时自动将其记录下来。

答案 2 :(得分:1)

我做了以下事情。

  1. 收集他们的电子邮件地址和密码
  2. 将其密码存储为受保护的哈希。我正在使用PHP 7,所以我使用 password_hash($user_password, PASSWORD_DEFAULT);
  3. 创建并存储唯一的确认ID。我是肛门和偏执狂,所以我创造了长串。在这种情况下,64个字符(32个字节,bin2hex = 64个字符)。 $confirm_code = bin2hex(random_bytes(32));
  4. 通过电子邮件向用户发送使用$ confirm_code构建的确认链接。
  5. 当用户单击链接时,设置数据库标志(例如,“active_user”)以指示确认已完成。我不会删除确认码。
  6. 好吧,记住,我是肛门和偏执狂。后端不会删除确认代码,并且会针对所有先前的确认代码检查每个新的确认代码,以确保它确实是唯一的。为什么?因此,人们不能在以后实际使用他们的电子邮件链接来确认一个实际上不属于他们的帐户,并保证没有人获得发给但可能不被其他人使用的确认代码。 (请记住,在计算机世界中,没有任何东西实际上是“独特的”或“随机的”。如果你不检查,你就不知道。)

    此外,您不应该从他们的确认链接自动登录某人。这是一个巨大的安全违规行为。任何人都可以在激活前点击该链接,突然他们可以完全访问该帐户。始终强制用户在确认后登录。

答案 3 :(得分:0)

我多次这样做的方式是在注册过程中,将“Active”的成员表中的一个字段保持为bool(0或1)0为no,1为yes。在注册过程中将它们标记为0.此外,您还需要一个注册码字段。或者,您可以创建一个新的用户标识/注册码表并进行比较。

当用户注册时,创建一个唯一的代码。记录该代码并向他们发送电子邮件。当他们点击电子邮件中的链接时,请使用代码检查表格,如果它与数据库中的代码匹配,请将该用户的活动字段更改为1

答案 4 :(得分:0)

当他们注册时,为数据库添加一个唯一的ID用于他们的用户名。同时将“活动”列设置为0.要向他们发送电子邮件,请使用PHP mail()功能。在链接到yoursite.com/activate?id=uniqueid的电子邮件中有一个链接。获取activate.php上的ID,进行一些检查,并将数据库中的“active”列设置为1。

相关问题