×
Закрытие
×

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

Для скачивания исходных файлов необходимо авторизоваться под своим аккаунтом через соответствующую форму.

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

  • Создаем сайт для работы в Интернете

    1. Причины создания пошаговой инструкции по разработке самописного сайта
    2. Тема создаваемого сайта
    3. В чем будет заключаться монетизация
    4. Функционал
    5. Этапы создания
    6. Текущее состояние создаваемого сайта

    Здравствуйте уважаемый посетитель!

    Наверное, многие задаются вопросом, как можно самому создать сайт для работы в Интернете или просто для реализации своих интеллектуальных способностей.

    Причем чтобы такой сайт был создан не в стандартном исполнении на основе какой-нибудь бесплатной СMS, а заточенный под себя, с возможностью обеспечить ему должную безопасность и реализовать все свои индивидуальные потребности.

    Данный сборник статей и предназначен для того, чтобы показать на реальном примере, как можно самому с нуля создать интернет-ресурс, который в последствии можно использовать в качестве инструмента для своей работы.

    При этом в материалах сборника приводится не только подробное описание каждого этапа создаваемого самописного сайта, но и бесплатно предоставляются все исходные коды с соответствующими таблицами базы данных. Что существенно упрощает использования предоставляемого шаблона сайта под свои конкретные задачи.

    Следует к этому добавить, что при желании, после получения необходимых знаний и навыков в вопросах сайтостроения, вполне возможно заняться и созданием сайтов на заказ. Тем более, что эта работа очень интересна и достаточно хорошо оплачиваемая. И что немаловажно, ее можно выполнять удалено, занимаясь в любое время не выходя из дома. Для этого нужно всего лишь одно условие - подключение к сети Интернет, что в наше время не является какой-либо проблемой.

    И надеюсь, что данный материал позволит многим желающим не только создать свой сайт для работы в сети Интернет, но и поможет овладеть необходимой компетенцией для занятия профессиональным веб-программированием.

Самописный сайт своими руками!

Текущее состояние создаваемого сайта

Здесь можно посмотреть текущее состояние самописного сайта, который создается для работы в Интернете в рамках цикла статей Как сделать сайт.

Где в дополнительных материалах можно бесплатно скачать исходные файлы сайта с таблицами MySQL.

Вы здесь: Главная → Сборник статей → Работа с почтой → Отправляем email для восстановления логина


Автор: / Дата:

Отправка email для восстановления логина

Отправляем email для восстановления логина

Здравствуйте уважаемый посетитель!

В предыдущей статье мы рассмотрели отправку email из формы обратной связи. Для чего сформировали скрипт отправки почты через SMTP с использованием библиотеки PHPMailer

А теперь посмотрим, как это можно использовать в других функциональных узлах. И в частности, создадим механизм восстановления данных учетной записи пользователя. При котором, как правило, также используется отправка с сайта почтовых сообщений.

Сегодня мы рассмотрим более простой вариант - отправку писем, предназначенных для восстановления логина зарегистрированного пользователя. При котором, в отличие от пароля, не требуется применения особых мер по защите данных от несанкционированного доступа.

Что касается восстановления пароля, то этим мы займемся в следующей статье. Где применим специальный алгоритм с использованием одноразового ключа доступа. Чем и обеспечим более высокую степень защиты данных о пароле.

Содержание


  • Порядок восстановления данных учетной записи пользователя
  • Формируем форму восстановления логина
  • Создаем обработчик формы восстановления логина
  • Отправляем почту с восстановленным логином
  • Исходные файлы сайта

Порядок восстановления данных учетной записи пользователя


Прежде чем приступить к практическим действиям по созданию необходимого функционала, сначала рассмотрим алгоритм, который мы будем реализовывать для возможности зарегистрированному пользователю восстановить логин или пароль от своего аккаунта.

Для восстановления данных учетной записи ранее были предусмотрены две ссылки, расположенные в панели пользователя, как показано на скриншоте.

Ссылки для восстановления данных учетной записи пользователя

Рис.1 Ссылки для восстановления данных учетной записи пользователя

Одна из них, как видно, предназначена для восстановления логина, другая - пароля. При этом каждой из этих операций после перехода по ссылке должен соответствовать определенный порядок действий.

Например, для восстановления логина это должно происходить следующим образом:

  1. Пользователь в предназначенную для восстановления логина форму вводит свой адрес электронной почты, который ранее указал при регистрации.
  2. При отправке запроса (нажатие кнопки отправки формы) в обработчике формы производится проверка наличия в базе данных введенного адреса. В зависимости от результата проверки дальнейшие действия происходят в следующем порядке:
    1. В случае, если такого адреса в базе данных нет, то об этом сообщается пользователю с предложением вновь ввести адрес и повторно отправить запрос.
    2. При нахождении адреса:
      1. Из базы данных извлекаются соответствующие адресу электронной почты имя и логин пользователя.
      2. На указанный email отправляется письмо пользователю с логином от его учетной записи.
      3. После получения письма пользователь использует полученный логин для авторизации на сайте.

Для восстановления пароля порядок действий несколько сложнее:

  1. Пользователь в предназначенную для восстановления пароля форму вводит свой адрес электронной почты, который ранее указал при регистрации.
  2. При отправке запроса в обработчике формы производится проверка наличия в базе данных введенного адреса. В зависимости от результата проверки дальнейшие действия происходят в следующем порядке:
    1. В случае, если такого адреса в базе данных нет, то об этом сообщается пользователю с предложением вновь ввести адрес и повторно отправить запрос.
    2. При нахождении адреса:
      1. Из базы данных извлекаются соответствующие адресу электронной почты имя и логин пользователя.
      2. Формируется одноразовый ключ доступа к восстановлению пароля.
      3. Сформированный одноразовый ключ доступа сохраняется в базе данных в записи, соответствующей данному пользователю.
      4. На указанный email отправляется письмо пользователю со ссылкой на страницу сайта для восстановления пароля (в ссылке в качестве псевдопараметра включен одноразовый ключ доступа).
      5. При получении письма пользователь переходит по ссылке на страницу сайта, на которой в специальной форме меняет пароль на новый (изменение пароля возможно только при соответствующем ключе доступа и с правильно указанным пользователем логином).
      6. При изменении пароля одноразовый ключ удаляется из базы данных.
      7. В случае, если пользователь, или кто иной, попытается повторно изменить пароль по данной ссылке, то на странице сайта ему будет сообщено о несоответствии ключа доступа к изменению пароля и предложено вновь пройти процедуру его восстановления.

Как видно, алгоритм действий при восстановлении логина и пароля во многом схож. Однако, в случае восстановлении пароля, помимо тех операций, которые присутствуют в первом варианте, имеется достаточно существенное дополнение, связанное с необходимостью обеспечения более высокой защиты восстанавливаемой конфиденциальной информации (пункты 2, b, ii÷vii).

Суть данной защиты заключается в том, что восстановить пароль после оправки запроса можно только один раз. После чего указанная в почтовом сообщении ссылка становится нерабочей.

И таким образом, если даже такое письмо каким-то образом потом попадет еще кому-либо, то воспользоваться ссылкой уже не удастся.

Можно, конечно, еще повысить защиту, ограничив действия ссылки на определенное время. Но в данный момент делать это не будем, а остановимся только на тех пунктах, которые мы здесь определили.

Далее рассмотрим механизм восстановления логина. А в следующей статье, дополнив его с учетом перечисленных дополнительного мер, создадим функционал, предназначенный и для восстановления пароля.

Формируем форму восстановления логина


Для данного случая, когда требуется вводить данные всего лишь в одно поле (только адрес электронной почты), форма имеет достаточно простой HTML-код.

  1. <div class="article">

  2. <h1>Восстановление логина</h1>

  3. <hr>

  4. <div class="recovery-login">

  5. <p>Введите указанный при регистрации e-mail, на который будет выслано письмо, предназначенное для восстановления логина.</p>

  6. <form name="recovery-login" action="/user/login/otpravka-logina.html" method="post">

  7. <div><input type="email" name="recovery-email" required></div>

  8. <div><input type="submit" name="recovery-button" value="Отправить запрос"></div>

  9. </form>

  10. </div>

  11. </div>

Рис.2 HTML-код формы восстановления логина

Ранее мы уже не раз создавали различные формы, поэтому вряд ли нужно на этом подробно останавливаться. Тем более на таком простом варианте (поз.6÷9), содержащим всего лишь одно поле (поз.7) и кнопку отправки формы (поз.8).

Здесь лишь можно добавить, что в атрибуте формы action (поз.6) указан адрес обработчика: /user/login/otpravka-logina.html, который мы будем создавать в следующей части статьи.

Если же у кого-то с вопросом создания формы возникнут сложности, то можно вернуться в раздел Работа с формами HTML, в статьях которого достаточно подробно рассматривалось использование различных ее элементов.

Как в итоге выглядит созданная форма, можно увидеть на скриншоте.

Внешний вид формы восстановления логина

Рис.3 Внешний вид формы восстановления логина

А вот насчет места расположения данного HTML-кода формы, наверное, стоит дать некоторые пояснения.

Дело в том, что в нашем сайте имеется возможность размещать область основного содержания страниц двумя способами:

  • в базе данных (поле "content" таблицы "url");
  • в файлах сайта.

В основном, для размещения HTML-кода контента предполагается использовать первый вариант - базу данных.

Второй же способ, при котором код размещается непосредственно в файлах, предназначен преимущественно для случаев, когда помимо HTML-кода, в основном содержании страницы присутствуют также и PHP-скрипты. Хотя при желании, в файлах можно размещать контент в любом виде, как с PHP, так и содержащий только HTML-разметку вэб-страниц.

Такое распределение позволяет исключить размещение PHP-кода в базе данных, сохраняя в ней только свойственные ей данные.

Ранее, при создании личного кабинета мы уже касались этого вопроса. Поэтому с некоторыми особенностями данного механизма, обеспечивающего определенную приоритетность вывода контента, дополнительно можно ознакомиться здесь.

Исходя из этого, основное содержание страницы "Восстановление логина", включающую в себя обычную HTML форму, мы разместим в базе данных. В данном случае это будет поле "content" соответствующей строки таблицы "url", как показано на скриншоте.

Размещение формы восстановления логина в таблице БД

Рис.4 Размещение формы восстановления логина в таблице БД

Как видно, страница "Восстановление логина" имеет адрес /user/login.htm, соответствующий второму уровню вложенности. Обусловлено это следующим содержимом записи: поле rubric имеет значение user, поле page - login.

При этом, в случае, если мы захотели бы разместить этот код в файле, то исходя из того, что все папки, относящиеся к основному содержанию страниц находятся в каталоге articles, сделать мы это должны были бы в директории /articles/user/login.php (в исходных файлах сайта для примера этот файл создан).

Это мы рассмотрели размещение HTML-код формы. А вот, что касается ее обработчика, в котором с помощью PHP будем обрабатывать данные и отправлять почту, то его код потребуется размещать непосредственно в файле. Так как в отличие от приведенной выше HTML-формы, в этом случае при формировании страницы должен будет выполняться PHP-скрипт.

Создаем обработчик формы восстановления логина


Как ранее было отмечено, в атрибуте action формы восстановления логина (рис.2, поз.6) указан адрес обработчика в следующем виде: /user/login/otpravka-logina.html. Что соответствует странице с третьим уровнем вложенности.

Исходя из этого, для создания новой страницы с именем "Отправка логина" (где будет размещаться PHP-код обработчика) в таблице базы данных "url" создадим новую запись, соответствующую этому адресу. Где поле section будет иметь значение user, поле rubric - login, а page - otpravka-logina.

Создание новой страницы Отправка логина

Рис.5 Создание новой страницы "Отправка логина"

Таким образом новую страницу мы получили. Осталось только создать файл, в котором будет размещаться основное содержание страницы с PHP-кодом обработчика формы. При этом необходимо учесть место его расположения. А сделать это достаточно просто, используя тот же адрес страницы /user/login/otpravka-logina.html.

Учитывая то, что все директории, относящиеся к основному содержанию страниц находятся в каталоге articles, путь к файлу должен иметь следующий вид: /articles/user/login/otpravka-logina.php.

Иначе говоря, созданный файл otpravka-logina.php мы должны поместить в папке login каталога user, которые являются содержимым общего каталога основного содержания страниц articles, как показано на следующем скриншоте.

Создание файла с основным содержанием страницы

Рис.6 Создание файла с основным содержанием страницы

Следующим шагом будет размещение в созданном файле кода, предназначенного для обработки данных формы и оправки пользователю логина в почтовом сообщении.

Однако, это должно быть возможным, только при условии, если указанный пользователем адрес электронной почты присутствует в базе данных. Если же нет, то сообщение с логином не отправляется, а пользователю предлагается повторно отправить запрос на восстановление логина.

Ниже показан код, реализующий этот алгоритм.

  1. <div class="article">

  2. <h1>Восстановление логина</h1>

  3. <hr>

  4. <div class="recovery-login">

  5. <?php

  6. //----Скрипт отправки почты для восстановления логина----

  7. use PHPMailer\PHPMailer\PHPMailer; //Импорт классов PHPMailer в глобальное пространство имен. Они должны быть в верхней части скрипта, а не внутри функции

  8. use PHPMailer\PHPMailer\Exception;

  9. if (!empty($_POST["recovery-button"])) { //Если форма отправлена

  10. $email = $_POST["recovery-email"]; //Получение из формы адреса email

  11. $email = check_symbol($email, "E-mail", "1", "/^[A-Z0-9._%+-]+@([A-Z0-9-]+\.)+[A-Z]{2,6}\z/i"); //Вызов пользовательской функции проверки и обработки данных формы

  12. if (!empty($GLOBALS['alert'])) { //При некорректном вводе адреса email

  13. $GLOBALS['alert'] = 'Данные из формы не отправлены. Обнаружены следующие ошибки: \n'.$GLOBALS['alert'];

  14. include "alert.php"; //Вывод сообщения об ошибке в диалоговом окне браузера

  15. ?>

  16. <p>Введите повторно указанный при регистрации e-mail, на который будет выслано письмо, предназначенное для восстановления логина.</p>

  17. <form name="recovery-login" action="/user/login/otpravka-logina.html" method="post">

  18. <div><input type="email" name="recovery-email" required></div>

  19. <div><input type="submit" name="recovery-button" value="Отправить запрос"></div>

  20. </form>

  21. <?php

  22. }

  23. else { //При успешной валидации адреса email

  24. $table = 'orders'; //Присвоение переменной $table имени таблицы, в которой будет происходить поиск требуемой записи

  25. $column = 'client-email';//Присвоение переменной $column имени поля, по значению которого будет производиться поиск

  26. $value = $email; //Присвоение переменной $value значения адреса email пользователя

  27. $data_bd = getLine($table, $column, $value); //Вызов функции вывода одиночной стоки по заданному условию

  28. if ($data_bd) { //Если запись с искомым адресом найдена

  29. $login = $data_bd['client-login']; //Извлечение логина пользователя

  30. $name = $data_bd['client-name']; //Извлечение имени пользователя

  31. require 'PHPMailer/src/PHPMailer.php'; //Подключение библиотеки PHPMailer

  32. require 'PHPMailer/src/Exception.php';

  33. require 'PHPMailer/src/SMTP.php';

  34. $mail = new PHPMailer(); //Инициализация класса

  35. $from = 'admin@avtobezugona.ru'; //Адрес почты, с которой идет отправка письма

  36. $to = $email; //Адрес получателя

  37. $mail -> isSMTP(); //Применение протокола SMTP

  38. $mail -> Host = 'smtp.yandex.ru';//Адрес почтового сервера

  39. $mail -> SMTPAuth = true; //Включение режима авторизации

  40. $mail -> Username = 'admin@avtobezugona.ru'; //Логин от доменной почты, подключенной к стороннему почтовому сервису (в данном случае в Яндекс.Почта)

  41. $mail -> Password = '2MsDom78'; //Пароль от доменной почты

  42. $mail -> SMTPSecure = 'ssl'; //Протокол шифрования

  43. $mail -> Port = '465'; //Порт сервера SMTP

  44. $mail -> CharSet = 'UTF-8'; //Кодировка

  45. $mail -> setFrom($from, 'Авто без угона'); //Адрес и имя отправителя

  46. $mail -> addAddress($to, 'Авто без угона'); //Адрес и имя получателя

  47. $mail -> isHTML (true); //Установка формата электронной почты в HTML

  48. $mail -> Subject = 'Восстановление логина'; //Тема письма (заголовок)

  49. $mail -> Body =

  50. "<html>

  51. <body>

  52. <p>Здравствуйте, $name!</p>

  53. <p>Вы запросили восстановление имени учетной записи на сайте \"Авто без угона\".</p>

  54. <p>Ваш логин: $login.</p>

  55. <p>Если Вы не запрашивали восстановление логина, и это письмо попало по ошибке, просто не реагируйте на него или удалите.</p>

  56. <p>Письмо отправлено автоматически сервисом рассылки <a href=\"avtobezugona.ru/user/login.html\" target=\"_blank\">Авто без угона</a></p>

  57. </body>

  58. </html>"; //Содержание письма

  59. $mail -> AltBody =

  60. "Здравствуйте, $name!

  61. Вы запросили восстановление имени учетной записи на сайте \"Авто без угона\".

  62. Ваш логин: $login.

  63. Если Вы не запрашивали восстановление логина, и это письмо попало по ошибке, просто не реагируйте на него или удалите.

  64. Письмо отправлено автоматически сервисом рассылки \"https://avtobezugona.ru\""; //Альтернативный текст в случае, если почтовый клиент не поддерживает формат HTML

  65. $mail -> SMTPDebug = 0; //Включение отладки SMTP: 0 - выкл (для штатного использования), 1 = сообщения клиента, 2 - сообщения клиента и сервера

  66. if ($mail -> send()) { //Если письмо отправлено

  67. ?>

  68. <p>Письмо с логином отправлено на указанный e-mail.</p>

  69. <?php

  70. }

  71. else { //Если при отправке почты возникли проблемы

  72. ?>

  73. <p><span>Ошибка, письмо не может быть отправлено: <?php print($mail -> ErrorInfo);?>.</span></p>

  74. <p>Введите повторно указанный при регистрации e-mail, на который будет выслано письмо, предназначенное для восстановления логина.</p>

  75. <p>В случае, если ошибка повторится, пожалуйста, обратитесь к администратору сайта через форму <a href="/kontakty.html">Обратной связи</a>.</p>

  76. <form name="recovery-login" action="/user/login/otpravka-logina.html" method="post">

  77. <div><input type="email" name="recovery-email" required></div>

  78. <div><input type="submit" name="recovery-button" value="Отправить запрос"></div>

  79. </form>

  80. <?php

  81. }

  82. }

  83. else { //Если запись с искомым адресом не найдена

  84. ?>

  85. <p><span>Ошибка при отправке сообщения! Такой e-mail в базе данных отсутствует.</span></p>

  86. <p>Введите повторно указанный при регистрации e-mail, на который будет выслано письмо, предназначенное для восстановления логина.</p>

  87. <p>В случае, если e-mail не может быть найден в базе данных, пожалуйста, обратитесь к администратору сайта через форму <a href="/kontakty.html">Обратной связи</a>, либо вновь зарегистрируйтесь в разделе <a href="/poluchit-skidku.html">Получить скидку</a>.</p>

  88. <form name="recovery-login" action="/user/login/otpravka-logina.html" method="post">

  89. <div><input type="email" name="recovery-email" required></div>

  90. <div><input type="submit" name="recovery-button" value="Отправить запрос"></div>

  91. </form>

  92. <?php

  93. }

  94. }

  95. }

  96. ?>

  97. </div>

  98. </div>

Рис.7 Обработчик формы восстановления логина

Как видно, здесь каждая строка PHP-кода сопровождается комментариями. Поэтому дополнительные пояснения сделаем лишь по некоторым блокам обработчика.

В первом части (поз.10÷20) происходит получение данных об адресе email, введенного пользователем в форму, в виде переменной $email (поз.10) с последующей их валидацией на стороне сервера с использованием пользовательской функции check_symbo() (поз.11). О предназначении и особенностях этой функции можно посмотреть здесь.

В случае, если данные введены некорректно (поз.12), выполняется вывод в диалоговом окне браузера сообщения об ошибке (поз.13,14). А далее на текущей странице предлагается пользователю повторно выполнить запрос на восстановление логина (поз.16÷20).

Если же валидация прошла успешно (поз.23), то тогда выполняется блок (поз.24÷28), в котором проверяется наличие в базе данных введенного пользователем адреса email. Для этого при вызове пользовательской функции getLine() используются определенные ее параметры: $table, $column и $value (поз.24÷26).

В дальнейшем в зависимости от результата поиска происходит, либо отправка пользователю email с его логином (поз.29÷81) при наличие в базе данных нужного адреса (поз.23). Либо, в случае его отсутствии (поз.83), вывод на текущую страницу сообщения о несуществующем email с предложением повторно отправить запрос на восстановление логина (поз.85÷91).

Что касается фрагмента, в котором пользователю отправляется почта с логином (поз.29÷81), то в нем используется уже ранее примененный нами скрипт, предназначавшийся для отправки email через SMTP с авторизацией. Поэтому при необходимости более подробного рассмотрения этой части кода, можно вернуться к предыдущей статье.

Думаю, что сделанных пояснений будет вполне достаточно для общего понимания работы обработчика формы восстановления логина. И теперь самое время перейти к проверке его в реальном действии.

Отправляем почту с восстановленным логином


Проверку созданного функционала сайта, предназначенного для восстановления пользователем логина выполним для двух вариантов адреса email. Сначала попытаемся отправить запрос с адресом, которого нет в базе данных. А затем отправим форму с реально существующим в базе данных email.

Ниже показан первый вариант заполненной формы восстановления логина при несуществующем адресе email.

Ввод несуществующего в базе данных адреса email

Рис.8 Ввод несуществующего в базе данных адреса email

И как видно на следующем скриншоте, при отправке запроса с несуществующим email мы получили сообщение об отсутствии его в базе данных с предложением повторно выполнить запрос.

Сообщение об отсутствии его в базе данных

Рис.9 Сообщение об отсутствии его в базе данных

А теперь снова оправим запрос, введя в форму email, который ранее был сохранен в базе данных при регистрации пользователя.

Ввод существующего в базе данных адреса email

Рис.10 Ввод существующего в базе данных адреса email

В этом случае по информации, полученной на текущей странице после оправки формы, письмо с логином отправлено на указанный e-mail.

Письмо с логином отправлено на указанный e-mail

Рис.11 Письмо с логином отправлено на указанный e-mail

Но, конечно, следует это проверить еще и на реальном почтовом ящике, на адрес которого было оправлено сообщение. Для этого войдем в него и поищем во входящих отправленное с сайта письмо с логином.

Полученное почтовое сообщение с логином

Рис.12 Полученное почтовое сообщение с логином

Как видно, письмо с логином действительно дошло до адресата. Чем подтвердилось работоспособность созданного функционала по восстановлению учетных данных записи пользователя.


На этом мы закончим рассмотрение данного вопроса. А в следующей статье, посмотрим, как применив специальный алгоритм с использованием одноразового ключа доступа можно обеспечить более высокую степень защиты данных при восстановлении пароля.

Исходные файлы сайта


Знак папкиИсходные файлы сайта с обновлениями, которые были сделаны в данной статье, можно скачать из прилагаемых дополнительных материалов:

  • Файлы каталога www
  • Таблицы базы данных MySQL

При этом, временно сформированные в данной статье PHP-скрипты, размещенные в файле "main.php" папки "articles" корневого каталога, закомментированы. Для проверки рассмотренных здесь примеров, следует раскомментировать соответствующие фрагменты кода.

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

Для скачивания исходных файлов необходимо авторизоваться под своим аккаунтом через соответствующую форму.

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

С уважением, Николай Гришин


Комментарии


Если у Вас возникли вопросы, или есть какие-либо пожелания по представлению материала, либо заметили какие-нибудь ошибки, а быть может просто хотите выразить свое мнение, пожалуйста, оставьте свои комментарии. Такая обратная связь очень важна для возможности учета мнения посетителей.

Буду Вам за это очень признателен!

comments powered by HyperComments