Здравствуйте форумчане, мне нужна ваша помощь, я в PHP шарю как блондинка за рулем, поэтому.. Вообщем, я не знаю почему не приходит письмо на почтовый ящик. Вообще код страницы восстановления пароля, человек вводит емейл адрес, база его ищет, находит и заменяет пароль у найденной строки. Письмо должно содержать пароль, собственно оно его и содержит и попутно заносит в базу, но меня волнует больше не MySQL составляющая, она работает великолепно, а всё таки другая часть кода, по причине которой письмо не доходит до получателя. Вопрос: Почему оно не доходит? Где то ошибка? Код (Text): <?php class recovery extends str { protected function obr() { $mail = mysql_real_escape_string($_POST['email']); if(!empty($mail)) { $query = "SELECT `Mail` FROM `accounts` WHERE `Mail`='{$mail}' LIMIT 1"; $sql = mysql_query($query) or die(mysql_error()); if(mysql_num_rows($sql)==1) { $simvols = array ("0","1","2","3","4","5","6","7","8","9", "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"); for ($key = 0; $key < 6; $key++) { shuffle ($simvols); $string = $string.$simvols[1]; } $check = MD5($string); $newkey = mb_strtoupper($check); $query = "UPDATE `accounts` SET `Key`= '$newkey' WHERE `Mail`='{$mail}' "; $sql = mysql_query($query) or die(mysql_error()); $query = "SELECT `Mail` FROM `accounts` WHERE `Mail` ='{$mail}' LIMIT 1"; $sql = mysql_query($query) or die(mysql_error()); $row = mysql_fetch_assoc($sql); $mail = $row['Mail']; mail($mail, "Запрос на восстановление пороля", "Вы сделали запрос на восстановление пароля, ваш новый пароль: $string\n\nПожалуйста не отвечайте на данное письмо!"); $_SESSION['CheckRec'] = "<script> $(function () { toastr.options = { 'closeButton': false, 'debug': false, 'newestOnTop': false, 'progressBar': true, 'positionClass': 'toast-top-right', 'preventDuplicates': false, 'onclick': null, 'showDuration': '300', 'hideDuration': '1000', 'timeOut': '5000', 'extendedTimeOut': '1000', 'showEasing': 'swing', 'hideEasing': 'linear', 'showMethod': 'fadeIn', 'hideMethod': 'fadeOut' } $(function (){ toastr.success('На вашу почту был отправлен пароль!'); }); }); </script> "; } else { $_SESSION['CheckRec'] = "<script> $(function () { toastr.options = { 'closeButton': false, 'debug': false, 'newestOnTop': false, 'progressBar': true, 'positionClass': 'toast-top-right', 'preventDuplicates': false, 'onclick': null, 'showDuration': '300', 'hideDuration': '1000', 'timeOut': '5000', 'extendedTimeOut': '1000', 'showEasing': 'swing', 'hideEasing': 'linear', 'showMethod': 'fadeIn', 'hideMethod': 'fadeOut' } $(function (){ toastr.warning('Ошибка. Аккаунт с таким Email не найден!'); }); }); </script> "; } } } public function get_content() { include "SiteController/AccountController/recovery.php"; } } ?>
так и не факт, что оно вообще уходит от тебя. ты правильно настроил днс и сервер? смотри логи, может принимающая сторона просто не хочет принимать от тебя письма.
Принимающая сторона должна принимать письма. А где получается настраивается почтовый ящик для отправки этих паролей на восстановление? Как бы на форуме я настраивал, но это не форум, а страница, а как настраивать на страницах я не очень понимаю..
Если у тебя хостинг, то нужно у тех поддержки спросить. В php.ini есть настройки, через что отправлять функцией PHP. Ещё можно отправить через SMTP, есть удобный класс для отправки почты https://github.com/PHPMailer/PHPMailer
Спасибо за ответ. Спрошу у хостинга, может они подскажут как у них настроить это дело. А php.ini нет файлика, человек похоже без него как то писал страницу.
А есть какая то тема по SMTP? Как правильно это все записать и т.п. Кстати говоря, хостинг игровой, поэтому он ссылается только на настройку SMTP на форумных движках, а вот как это в скрипте записать, это вопрос..
тут есть примеры https://github.com/PHPMailer/PHPMailer --- Добавлено --- в папке examples ещё примеры
Спасибо. Обязательно ознакомлюсь как вернусь домой. --- Добавлено --- Получается, в тот скрипт, что я кидал в самом начале надо просто грамотно добавить данные smtp?
надо подключить phpmailer и отправлять через него, в нём можно указать smtp данные, чтобы он через них отправлял, а не через mail()
Ещё такой вопрос, есть такая запись в примере Код (Text): $mail->addAddress('whoto@example.com', 'John Doe'); Получается как в него тогда добавить SQL конструкцию? Код (Text): $query = "SELECT `Mail` FROM `accounts` WHERE `Mail` ='{$mail}' LIMIT 1"; $sql = mysql_query($query) or die(mysql_error()); $row = mysql_fetch_assoc($sql); $mail = $row['Mail']; mail($mail, "Запрос на восстановление пороля", "Вы сделали запрос на восстановление пароля, ваш новый пароль: $string\n\nПожалуйста не отвечайте на данное письмо!"); Просто прописать $mail->addAddress($mail, 'John Doe'); Так получается?
Попробовал вшить это в тот код, если вам не сложно, можете указать на характерные ошибки, чтобы я их в дальнейшем не совершал. Код (Text): <?php require '../PHPMailerAutoload.php'; $mail = new PHPMailer(true); $mail->setFrom('admin@etrp.ru', 'Administrator'); $mail->addReplyTo('linker5211@gmail.com', 'Administrator'); class recovery extends str { protected function obr() { $mail = mysql_real_escape_string($_POST['email']); if(!empty($mail)) { $query = "SELECT `Mail` FROM `accounts` WHERE `Mail`='{$mail}' LIMIT 1"; $sql = mysql_query($query) or die(mysql_error()); if(mysql_num_rows($sql)==1) { $simvols = array ("0","1","2","3","4","5","6","7","8","9", "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"); for ($key = 0; $key < 6; $key++) { shuffle ($simvols); $string = $string.$simvols[1]; } $check = MD5($string); $newkey = mb_strtoupper($check); $query = "UPDATE `accounts` SET `Key`= '$newkey' WHERE `Mail`='{$mail}' "; $sql = mysql_query($query) or die(mysql_error()); $query = "SELECT `Mail` FROM `accounts` WHERE `Mail` ='{$mail}' LIMIT 1"; $sql = mysql_query($query) or die(mysql_error()); $row = mysql_fetch_assoc($sql); $mail = $row['Mail']; $mail->addAddress($mail); $mail->Subject = 'Запрос на восстановление пороля', 'Вы сделали запрос на восстановление пароля, ваш новый пароль: $string\n\nПожалуйста не отвечайте на данное письмо!'; $mail->send(); } catch (phpmailerException $e) { echo $e->errorMessage(); } catch (Exception $e) { echo $e->getMessage(); } $_SESSION['CheckRec'] = "<script> $(function () { toastr.options = { 'closeButton': false, 'debug': false, 'newestOnTop': false, 'progressBar': true, 'positionClass': 'toast-top-right', 'preventDuplicates': false, 'onclick': null, 'showDuration': '300', 'hideDuration': '1000', 'timeOut': '5000', 'extendedTimeOut': '1000', 'showEasing': 'swing', 'hideEasing': 'linear', 'showMethod': 'fadeIn', 'hideMethod': 'fadeOut' } $(function (){ toastr.success('На вашу почту был отправлен пароль!'); }); }); </script> "; } else { $_SESSION['CheckRec'] = "<script> $(function () { toastr.options = { 'closeButton': false, 'debug': false, 'newestOnTop': false, 'progressBar': true, 'positionClass': 'toast-top-right', 'preventDuplicates': false, 'onclick': null, 'showDuration': '300', 'hideDuration': '1000', 'timeOut': '5000', 'extendedTimeOut': '1000', 'showEasing': 'swing', 'hideEasing': 'linear', 'showMethod': 'fadeIn', 'hideMethod': 'fadeOut' } $(function (){ toastr.warning('Ошибка. Аккаунт с таким Email не найден!'); }); }); </script> "; } } } public function get_content() { include "SiteController/AccountController/recovery.php"; } } ?>
mysql сменить на mysqli или PDO + использовать подготовленные запросы. javascript не хранить в сесии, какой скрипт показывать можно определять через get или post параметры. читай дальше книги по php, mysql есть что улучшать
Почему его лучше не хранить в сессии, а лучше выносить как отдельный файл? Мне просто зачастую непонятно зачем какие то конструкции маленькие выносят в файлы и как это сказывается на работе в дальнейшем? И что имелось в виду под "Использовать подготовленные запросы"? Говоря о скриптах и get, конструкция будет такого рода? Код (Text): public function get_content() { include "SiteController/AccountController/recovery.php"; } --- Добавлено --- Так, про подготовленные запросы понял, это было в связке с PDO. Хочу, чтобы страница работала быстро, эффективно, надежно, что для этого лучше mysqli или PDO с готовыми запросами? Стоит ли вообще использовать PDO?
Кому что нравится. Пдо, вроде как, более устойчив к sql-инъекциям за счет того, что внутри библиотеки уже проводятся кое-какие мероприятия против инъекций, что в mysqli нужно делать ручками
"Что в mysqli нужно делать ручками", это же ещё надо узнать как обезопасить себя. А по коду выгоднее будет в таком случае mysqli или PDO?
по коду будет выгоднее не быть дырявым. как ты к этому приходишь - это второй вопрос. Но просто так заюзать "экранирование" не достаточно. Всё равно можно протащить в некоторых случаях кавычечку. Так что это тема обширная. Главное запомни использовать всегда и везде UTF.
Хорошо, запомню, спасибо. Значит перепишу на mysqli, по мере увеличения знаний уже смогу на большее способен быть. И вопрос без ответа остался про скрипты. Почему лучше делать вызов к файлу в сессии, а не сам js содержать? Мне просто зачастую непонятно зачем какие то конструкции маленькие выносят в файлы и как это сказывается на работе в дальнейшем?
Лично я использую mysqli. Никто же не запрещает тебе самому написать класс-обертку со всякими экранированиями, установкой кодировки и тп один раз и использовать постоянно и не париться. Слушай, я вот досконально не сиотрел твой код, но сходу я понять не смог, зачем у тебя в сессии js хранится. Да и ты через пару месяцев если взглянешь - вообще не поймешь, что написал. Нужно писать так, чтобы было более-менее понятно, что там написано
У тебя на сайте 100 человек пользуются, это для примера, у них код в сессии, ты захочешь его изменить и пока сессия у этих 100 человек не помрёт, ты для них не сможешь изменить код. Потом js код можно вообще разместить как файл на диске и в зависимости от параметров, просто его подключать через script src, так он минует обработку PHP и вебсервер его отдаст браузеру. Зачем лишний раз напрягать PHP. Когда скопится много таких мелочей, то всё может работать медленнее. Посмотри ещё MVC. Всё это придумано, чтобы проще было дописывать код, менять что-то. Почитай документацию по framework например Symfony2, Yii2 там есть описание как организуют код.
выносят в файлики, чтобы статику отдавать не вовлекая пхп. Вебсервер файлики может отдавать тысячами в секунду. Ещё можно предварительно сжать. А из пхп там выйдет несколько сотен в лучшем случае.
У меня на класс-обертку знаний не хватит xD Пока по крайней мере. Код писали под заказ и писал, как я уже понял спустя некоторое время после покупки, бездарный человек, которому нужны были только деньги. Ну вот я и хочу его исправить, а заодно научиться у умных людей как нужно правильно писать код, исправить недостатки, как то оптимизировать, понять каждую строку кода. Пока конечно это не сильно получается, но я буду стараться, а пока код не работает как не крути со вставленными смтп(
Вот моя обёртка. =) https://gist.github.com/igordata/0a66aae660b21a7313b7456a2f3b84cb параметры передавать так PHP: class DB { use t_DB; } DB::connSettings(CFG::$databases['main']); Использовать так: PHP: $dkps = DB::assoc_id('SELECT * FROM `dkp` WHERE `community` = ' . (int)$community['id']);
Супер! Ничего пока не понимаю там, но это потрясающе! И работает не хуже,а даже лучше, чем встроенная? Её можно же использовать?