ссылка на подтверждение по электронной почте

Когда пользователь подписывается на мой информационный бюллетень через свой адрес электронной почты, используя 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 ); 

Регистрация таблицы 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('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'; } ?>