Когда пользователь подписывается на мою новостную рассылку через их адрес электронной почты, с помощью 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, распознающей, что они - законный подписчик?
Любая справка или предложения ценятся.Спасибо
Что мне нравится делать:
Генерировать уникальный, случайный ID в процессе регистрации
Хранить ID вместе с E-Mail адресом, полем "подтверждено" (по умолчанию: "нет") и любыми дополнительными данными в таблице базы данных
Рассылать E-Mail с URL, указывающим на активацию уникального ID (например. например, domain.com/activate.php?id=102939505595
Страница активации проверяет, существует ли уникальный ключ, и изменяет поле confirmed
на yes
(или 1
или любое другое).
Дополнительно и по желанию сохраните дату/время подтверждения, IP-адрес и агент пользователя.
Вставьте пользователя в таблицу с установленным флагом 'pending' (или не установленным флагом 'validated'). Они не должны иметь возможности делать что-либо, пока флаг не будет изменен. Если вы хотите быть очень внимательным, действительно поместите их в таблицу users_temp. Сгенерируйте совершенно случайный ключ и свяжите его с их идентификатором пользователя. Ссылка, которую вы отправите им по электронной почте, должна быть http://yourwebsite.com/?activate=totallyrandomkeyigeneratedearlier
. Когда вы получите запрос на активацию, включите флаг valid для пользователя с соответствующим случайным ключом.
Сгенерируйте уникальный 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 часа.
Лично я бы добавил эти данные в базу данных и имел поля с названием «активные», тогда, когда они щелкают ссылку активации, все, что вам нужно сделать, это обновить это одно поле.
У вас также может быть ссылка «Это был не я» в электронном письме, и если они нажмут на нее, вы удалите все подробности.
Во-первых, вам нужно добавить 2 колонки в таблицу вашей базы данных, которая содержит пользователей
Колонки должны называться active
и activation_hash
Когда пользователь регистрируется, вам нужно вставить пользователя в базу данных, но установить active
в 0, а activation_hash
станет случайным md5 из email_адрес пользователя, unique_id()
, убедитесь, что он в формате MD5, а затем сохраните его в колонке activation_hash
.
В шаблоне письма добавьте ссылку для активации пользователя, например:
Затем в файле регистрации или там, где вы указываете ссылку активации, просто получите user_id и хэш активации через $_GET
и проверьте их в вашей базе данных.
если они не совпадают, попросите пользователя ввести пароль, чтобы отправить другой хэш активации. В противном случае установите колонку active
в 1, чтобы остальные части вашего приложения знали, в каком статусе находится пользователь.
вот в принципе и все.
база данных не требуется. вы можете отправить все данные в гиперссылке, подписанной хешем
. Недавно я отвечал на аналогичный вопрос, даже со сроком действия.
хотя это была ссылка для восстановления пароля, но идея та же
$token = sha1($time.$email.$salt).dechex(time()).dechex($user_id);
$link = "http://".$domain."/restorepass/?token=$token";
, весь токен будет выглядеть как одно шестнадцатеричное число, и было бы трудно угадать его значение.
при получении просто разделите и декодируйте его обратно.
Аккуратно, ИМО.