Когда пользователь подписывается на мой информационный бюллетень через свой адрес электронной почты, используя 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, признав, что они являются законным подписчиком?
Любая помощь или предложения оценены. благодаря
Что мне нравится делать:
Создание уникального случайного идентификатора в процессе регистрации
Сохраните идентификатор вместе с адресом электронной почты, «подтвержденным» полем (по умолчанию: «нет») и любыми дополнительными данными в таблице базы данных
Отправляйте E-Mail с URL-адресом, указывающим на активацию уникального идентификатора (например, domain.com/activate.php?id=102939505595
Страница активации проверяет наличие уникального ключа и изменяет confirmed
поле на yes
(или 1
или что-то еще).
Дополнительно и, необязательно, сохраните дату / время подтверждения, IP-адрес и агент пользователя.
Вставьте пользователя в таблицу с установленным флагом «ожидающий» (или не установлен флаг «проверенный»). Они не должны ничего делать, пока флаг не будет изменен. Если вы хотите быть действительно основательным, на самом деле поместите их в таблицу users_temp. Создайте полностью случайный ключ и свяжите его с идентификатором пользователя. Ссылка, которую вы отправляете по электронной почте, должна быть http://yourwebsite.com/?activate=totallyrandomkeyigeneratedearlier
. Когда вы получите запрос на активацию, включите флаг правильности для пользователя с соответствующим случайным ключом.
нет необходимости в базе данных. вы можете отправлять все данные в гиперссылку, подписанную хешем
Я ответил на аналогичный вопрос недавно даже с истечением срока.
хотя это было для ссылки восстановления пароля, но идея такая же
$token = sha1($time.$email.$salt).dechex(time()).dechex($user_id); $link = "http://".$domain."/restorepass/?token=$token";
весь токен будет выглядеть как одно шестнадцатеричное число, и было бы трудно догадаться, что это значение.
после получения просто раскол и декодировать его обратно.
Аккуратно, ИМО.
Лично я бы добавил туда детали в базу данных и имел поля, называемые «активными», тогда, когда они нажимают на ссылку активации, вам нужно обновить это одно поле.
У вас также может быть ссылка «Это не я» в электронном письме, и если они нажмут на нее, вы удалите все детали.
Создайте уникальный идентификатор и сохраните его вместе с именем пользователя / паролем в некоторой временной записи базы данных для нового пользователя.
$tmpID = uniqid();
Затем адаптируйте ссылку в элементе eMail-body, например:
$body = "Please click the link to activate your email \n http://www.activationlink.com/activateAccount?activate=".$tmpID;
Если пользователь запрашивает / активирует $_GET['activate']
запись на вашем сервере, проверьте запись базы данных на параметр $_GET['activate']
и установите активированный пользователь (если он соответствует).
Чтобы ваша база данных не просто получала все больше и больше записей, вы можете использовать cron-job, который очищает записи старше, чем, например, 24 часа.
Во-первых, вам нужно будет добавить 2 столбца в таблицу базы данных, в которой содержатся пользователи
Столбец должен быть назван active
и activation_hash
Когда пользователь регистрируется, вам нужно вставить пользователя в БД, но установить значение 0, а activation_hash
становится случайным md5 пользователей email_address, first_name и т.д. с 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, чтобы остальная часть вашего приложения узнала, какой статус у пользователя.
thats в основном это.
Вот мой полный вариант решения:
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('Ymd H:i:s'); $verified = 0; $maxdate = date('Ymd 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('Ymd 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'; } ?>