当用户使用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数据库,以识别他们是合法用户?
任何帮助或建议表示赞赏。感谢
答案 0 :(得分:11)
我喜欢做的是:
在注册过程中生成唯一的随机ID
将ID与电子邮件地址,“已确认”字段(默认值:“否”)以及数据库表格中的任何其他数据一起存储
使用指向激活唯一ID的网址发送电子邮件(例如domain.com/activate.php?id=102939505595
激活页面会检查唯一键是否存在,并将confirmed
字段更改为yes
(或1
或其他)。
此外,还可以选择保存确认日期/时间,IP地址和用户代理。
答案 1 :(得分:6)
将用户插入到设置了“pending”标志的表中(或未设置“validated”标志)。在更改标志之前,他们不应该做任何事情。如果你想要非常彻底,实际上将它们放入users_temp表中。生成完全随机的密钥并将其与用户ID相关联。您通过电子邮件发送给他们的链接应为http://yourwebsite.com/?activate=totallyrandomkeyigeneratedearlier
。当您收到激活请求时,请使用相应的随机密钥为用户启用有效标记。
答案 2 :(得分:5)
不需要数据库。您可以发送散列
签名的超链接中的所有数据即使过期时间,我最近也回答了类似的问题 虽然它是用于密码恢复链接,但想法是相同的
$token = sha1($time.$email.$salt).dechex(time()).dechex($user_id);
$link = "http://".$domain."/restorepass/?token=$token";
整个令牌看起来像单个十六进制数字,很难猜出它的含义。
收到后再拆分并解码回来 整洁,IMO。
答案 3 :(得分:1)
我个人会在数据库中添加详细信息,并有一个名为“active”的字段,然后当他们点击激活链接时,您需要做的就是更新这一个字段。
您也可以在电子邮件中找到“这不是我”链接,如果他们点击此链接,您将删除所有详细信息。
答案 4 :(得分:1)
生成一个唯一ID,并将其与用户名/密码一起存储在新用户的某些临时数据库条目中。
$tmpID = uniqid();
然后,调整eMail-body中的链接,例如:
$body = "Please click the link to activate your email \n
http://www.activationlink.com/activateAccount?activate=".$tmpID;
如果用户在您的服务器上请求/ activateAccount,请根据$_GET['activate']
参数检查数据库条目,并将用户设置为激活(如果匹配)。
为了确保您的数据库不仅获得越来越多的条目,您可以使用一个cron-job来清除早于例如的条目。 24小时。
答案 5 :(得分: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&amp;通过$_GET
激活哈希并对您的数据库进行验证。
如果它们不匹配,则要求用户输入其密码以发送另一个激活哈希。否则将列active
设置为1,以便应用程序的其余部分知道用户的状态。
答案 6 :(得分:0)
以下是我的完整解决方案:
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
);
添加注册页面 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';
}
?>