8

当用户使用 php 通过他们的电子邮件地址订阅我的时事通讯时,我将如何通过电子邮件向他们发送“激活链接”以确认它是他们的电子邮件地址而不是假的。

所以此刻我有

PHP:

<?php
 $to = "recipient@example.com";
 $subject = "Hi!";
 $body = "Hi,\n\nHow are you?";
 if (mail($to, $subject, $body)) {
   echo "<p>Message successfully sent!</p>";
  } else {
   echo "<p>Message delivery failed...</p>";
  }
 ?>

我想我会将 $body 更改为:

$body = "Please click the link to activate your email \n
http://www.activationlink.com?";

我将如何做到这一点,以便如果用户单击该链接,它将他们的详细信息添加到 Mysql 数据库中,从而识别出他们是合法订阅者?

任何帮助或建议表示赞赏。谢谢

4

7 回答 7

13

我喜欢做的是:

  • 在注册过程中生成一个唯一的、随机的 ID

  • 将 ID 与电子邮件地址、“已确认”字段(默认值:“否”)和任何其他数据一起存储在数据库表中

  • 发送带有指向激活唯一 ID 的 URL 的电子邮件(例如domain.com/activate.php?id=102939505595

  • 激活页面检查唯一键是否存在并将confirmed字段更改为yes1或其他)。

  • 此外,还可以选择保存确认日期/时间、IP 地址和用户代理。

于 2010-07-13T13:15:28.093 回答
6

将用户插入设置了“待定”标志(或未设置“已验证”标志)的表中。在更改标志之前,他们应该无法做任何事情。如果您想真正彻底,实际上将它们放入 users_temp 表中。生成一个完全随机的密钥并将其与他们的用户 ID 相关联。您通过电子邮件发送给他们的链接应该是http://yourwebsite.com/?activate=totallyrandomkeyigeneratedearlier. 当您收到激活请求时,使用相应的随机密钥为用户打开有效标志。

于 2010-07-13T13:13:52.193 回答
6

不需要数据库。您可以在由哈希签名的超链接中发送所有数据

即使有到期时间,我最近也回答了类似的问题。
虽然是密码恢复链接,但是思路是一样的

$token = sha1($time.$email.$salt).dechex(time()).dechex($user_id);
$link = "http://".$domain."/restorepass/?token=$token";

整个令牌看起来像单个十六进制数字,很难猜出它的含义。

收到后只需拆分并解码回来。
整洁,海事组织。

于 2010-07-13T13:22:13.113 回答
1

就我个人而言,我会在数据库中添加详细信息并有一个名为“活动”的字段,然后当他们单击激活链接时,您需要做的就是更新这一字段。

您还可以在电子邮件中包含“这不是我”链接,如果他们单击此链接,您将删除所有详细信息。

于 2010-07-13T13:15:59.853 回答
1

生成一个唯一 ID 并将其与用户名/密码一起存储在新用户的一些临时数据库条目中。

$tmpID = uniqid();

然后,将您的电子邮件正文中的链接调整为例如:

$body = "Please click the link to activate your email \n
http://www.activationlink.com/activateAccount?activate=".$tmpID;

如果用户在您的服务器上请求 /activateAccount,请根据参数检查数据库条目$_GET['activate'],并设置用户激活(如果匹配)。

为了确保您的数据库不只是获得越来越多的条目,您可以使用一个 cron-job 来清除早于例如 24 小时的条目。

于 2010-07-13T13:18:20.590 回答
1

首先,您需要在保存用户的数据库表中添加 2 列

应该调用该列active,并且activation_hash

当用户注册时,您需要将用户插入数据库,但将其设置active为 0,然后activation_hash变成用户 email_address、first_name 等的随机 md5,其中包含一个unique_id(),确保其为 MD5 格式,然后将其存储在activation_hash列中。

在您的电子邮件模板中添加供用户激活的链接,例如:

<a href="http://mydomain.registrer.php?process=activate&id=<?php echo $user_id;?>&hash=<?php echo $activation_hash;?>">Activate your account</a>

然后在您的注册文件中或您将激活链接指向的任何位置,只需通过获取 user_id 和激活哈希$_GET并针对您的数据库进行验证。

如果它们不匹配,则要求用户输入他的密码以发送另一个激活哈希。否则将该列设置active为 1,以便应用程序的其余部分知道用户的状态。

基本上就是这样。

于 2010-07-13T13:19:02.570 回答
1

这是我的完整解决方案方案:

CREATE TABLE signup  (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
email VARCHAR(30) NOT NULL,
token VARCHAR(30) NOT NULL,
verified VARCHAR(50),
registration_date TIMESTAMP,
maxdate TIMESTAMP
);

注册 MySQL 表

添加注册页面signup.php

添加以下表格:

    <form name="signupform" method="post" action="process.php">
    Username:
    <input type="text" name="username">
    <br> Password:
    <input type="text" name="password">
    <br> Email:
    <input type="text" name="email">
    <br>
    <input type="submit" value="Signup">
</form>

创建process.php页面:

<?php
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
date_default_timezone_set('America/New_York');
$registration_date = date('Y-m-d H:i:s');
$verified = 0;
$maxdate = date('Y-m-d H:i:s', strtotime($registration_date . ' +1 day'));
$salt = uniqid(mt_rand() , true);
$token = msha1(registration_date . md5($salt));
$sql = "INSERT INTO signup (username, password, email, token, verified, registration_date, maxdate) VALUES ('$username', '$password', '$email', '$token', '$verified', '$registration_date', '$maxdate')";

if (mysqli_query($conn, $sql))
    {
    $msg = 'Please click this link to verify your email: http://www.yourdomain.com/verifyemail.php?token=' . $token;
    mail($email, $subject, $msg);
    }
  else
    {
    echo mysql_error();
    }

?>

之后创建verifyemail.php

<?php
$token = $_REQUEST['token'];
date_default_timezone_set('America/New_York');
$current_time = date('Y-m-d H:i:s');
$sql = "SELECT * FROM users WHERE token='$token' AND maxtime >'$current_time' AND verified=0";
$result = mysqli_query($conn, $sql);
$notverified = mysqli_num_rows($result);

if ($notverified)
    {
    $sql = "update signup set verified=1 where token='$token'";
    $result = mysqli_query($conn, $sql);
    if ($result)
        {
        echo 'Email verified';
        }
      else
        {
        echo 'Error';
        }
    }
  else
    {
    echo 'Link expired';
    }

?>
于 2016-12-23T00:03:40.903 回答