За последние 24 часа нас посетили 24200 программистов и 1531 робот. Сейчас ищут 1237 программистов ...

Не приходит письмо на почтовый ящик

Тема в разделе "Работа с почтой", создана пользователем S.I.G, 20 апр 2016.

  1. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    Здравствуйте форумчане, мне нужна ваша помощь, я в PHP шарю как блондинка за рулем, поэтому.. Вообщем, я не знаю почему не приходит письмо на почтовый ящик. Вообще код страницы восстановления пароля, человек вводит емейл адрес, база его ищет, находит и заменяет пароль у найденной строки. Письмо должно содержать пароль, собственно оно его и содержит и попутно заносит в базу, но меня волнует больше не MySQL составляющая, она работает великолепно, а всё таки другая часть кода, по причине которой письмо не доходит до получателя. Вопрос: Почему оно не доходит? Где то ошибка?
    Код (Text):
    1.  
    2. <?php
    3. class recovery extends str {
    4.     protected function obr() {
    5.         $mail = mysql_real_escape_string($_POST['email']);
    6.         if(!empty($mail))
    7.         {
    8.             $query = "SELECT `Mail` FROM `accounts` WHERE `Mail`='{$mail}' LIMIT 1";
    9.             $sql = mysql_query($query) or die(mysql_error());
    10.             if(mysql_num_rows($sql)==1)
    11.             {
    12.                
    13.                 $simvols = array ("0","1","2","3","4","5","6","7","8","9",
    14.                                  "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");
    15.                 for ($key = 0; $key < 6; $key++)
    16.                 {
    17.                     shuffle ($simvols);
    18.                     $string = $string.$simvols[1];
    19.                 }
    20.                 $check = MD5($string);
    21.                 $newkey = mb_strtoupper($check);
    22.                 $query = "UPDATE `accounts` SET `Key`= '$newkey' WHERE `Mail`='{$mail}' ";
    23.                 $sql = mysql_query($query) or die(mysql_error());
    24.                
    25.                 $query = "SELECT `Mail` FROM `accounts` WHERE `Mail` ='{$mail}' LIMIT 1";
    26.                 $sql = mysql_query($query) or die(mysql_error());
    27.  
    28.                 $row = mysql_fetch_assoc($sql);
    29.                 $mail = $row['Mail'];
    30.                
    31.                 mail($mail, "Запрос на восстановление пороля", "Вы сделали запрос на восстановление пароля, ваш новый пароль: $string\n\nПожалуйста не отвечайте на данное письмо!");
    32.                 $_SESSION['CheckRec'] = "<script>
    33.  
    34.     $(function () {
    35. toastr.options = {
    36.   'closeButton': false,
    37.   'debug': false,
    38.   'newestOnTop': false,
    39.   'progressBar': true,
    40.   'positionClass': 'toast-top-right',
    41.   'preventDuplicates': false,
    42.   'onclick': null,
    43.   'showDuration': '300',
    44.   'hideDuration': '1000',
    45.   'timeOut': '5000',
    46.   'extendedTimeOut': '1000',
    47.   'showEasing': 'swing',
    48.   'hideEasing': 'linear',
    49.   'showMethod': 'fadeIn',
    50.   'hideMethod': 'fadeOut'
    51. }
    52.         $(function (){
    53.             toastr.success('На вашу почту был отправлен пароль!');
    54.         });
    55.  
    56.     });
    57.  
    58. </script>
    59.        ";
    60.             } else {
    61.                 $_SESSION['CheckRec'] = "<script>
    62.  
    63.     $(function () {
    64. toastr.options = {
    65.   'closeButton': false,
    66.   'debug': false,
    67.   'newestOnTop': false,
    68.   'progressBar': true,
    69.   'positionClass': 'toast-top-right',
    70.   'preventDuplicates': false,
    71.   'onclick': null,
    72.   'showDuration': '300',
    73.   'hideDuration': '1000',
    74.   'timeOut': '5000',
    75.   'extendedTimeOut': '1000',
    76.   'showEasing': 'swing',
    77.   'hideEasing': 'linear',
    78.   'showMethod': 'fadeIn',
    79.   'hideMethod': 'fadeOut'
    80. }
    81.         $(function (){
    82.             toastr.warning('Ошибка. Аккаунт с таким Email не найден!');
    83.         });
    84.  
    85.     });
    86.  
    87. </script>
    88.        ";
    89.             }
    90.         }
    91.     }
    92.     public function get_content() {
    93.         include "SiteController/AccountController/recovery.php";  
    94.     }
    95. }
    96. ?>
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    так и не факт, что оно вообще уходит от тебя. ты правильно настроил днс и сервер? смотри логи, может принимающая сторона просто не хочет принимать от тебя письма.
     
  3. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    Принимающая сторона должна принимать письма. А где получается настраивается почтовый ящик для отправки этих паролей на восстановление? Как бы на форуме я настраивал, но это не форум, а страница, а как настраивать на страницах я не очень понимаю..
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Если у тебя хостинг, то нужно у тех поддержки спросить.
    В php.ini есть настройки, через что отправлять функцией PHP.
    Ещё можно отправить через SMTP, есть удобный класс для отправки почты https://github.com/PHPMailer/PHPMailer
     
  5. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    Спасибо за ответ. Спрошу у хостинга, может они подскажут как у них настроить это дело. А php.ini нет файлика, человек похоже без него как то писал страницу.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    если что отправляй через SMTP.
     
  7. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    А есть какая то тема по SMTP? Как правильно это все записать и т.п.
    Кстати говоря, хостинг игровой, поэтому он ссылается только на настройку SMTP на форумных движках, а вот как это в скрипте записать, это вопрос..
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  9. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    Спасибо. Обязательно ознакомлюсь как вернусь домой.
    --- Добавлено ---
    Получается, в тот скрипт, что я кидал в самом начале надо просто грамотно добавить данные smtp?
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    надо подключить phpmailer и отправлять через него, в нём можно указать smtp данные, чтобы он через них отправлял, а не через mail()
     
  11. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    Ещё такой вопрос, есть такая запись в примере
    Код (Text):
    1.  
    2.     $mail->addAddress('whoto@example.com', 'John Doe');
    Получается как в него тогда добавить SQL конструкцию?
    Код (Text):
    1.  
    2. $query = "SELECT `Mail` FROM `accounts` WHERE `Mail` ='{$mail}' LIMIT 1";
    3.                 $sql = mysql_query($query) or die(mysql_error());
    4.  
    5.                 $row = mysql_fetch_assoc($sql);
    6.                 $mail = $row['Mail'];
    7.                
    8.                 mail($mail, "Запрос на восстановление пороля", "Вы сделали запрос на восстановление пароля, ваш новый пароль: $string\n\nПожалуйста не отвечайте на данное письмо!");
    Просто прописать $mail->addAddress($mail, 'John Doe');
    Так получается?
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Если в $mail хранится адрес электронной почты, то всё верно.
     
  13. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    Попробовал вшить это в тот код, если вам не сложно, можете указать на характерные ошибки, чтобы я их в дальнейшем не совершал.
    Код (Text):
    1.  
    2. <?php
    3. require '../PHPMailerAutoload.php';
    4. $mail = new PHPMailer(true);
    5. $mail->setFrom('admin@etrp.ru', 'Administrator');
    6. $mail->addReplyTo('linker5211@gmail.com', 'Administrator');
    7. class recovery extends str {
    8.     protected function obr() {
    9.         $mail = mysql_real_escape_string($_POST['email']);
    10.         if(!empty($mail))
    11.         {
    12.             $query = "SELECT `Mail` FROM `accounts` WHERE `Mail`='{$mail}' LIMIT 1";
    13.             $sql = mysql_query($query) or die(mysql_error());
    14.             if(mysql_num_rows($sql)==1)
    15.             {
    16.                
    17.                 $simvols = array ("0","1","2","3","4","5","6","7","8","9",
    18.                                  "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");
    19.                 for ($key = 0; $key < 6; $key++)
    20.                 {
    21.                     shuffle ($simvols);
    22.                     $string = $string.$simvols[1];
    23.                 }
    24.                 $check = MD5($string);
    25.                 $newkey = mb_strtoupper($check);
    26.                 $query = "UPDATE `accounts` SET `Key`= '$newkey' WHERE `Mail`='{$mail}' ";
    27.                 $sql = mysql_query($query) or die(mysql_error());
    28.                
    29.                 $query = "SELECT `Mail` FROM `accounts` WHERE `Mail` ='{$mail}' LIMIT 1";
    30.                 $sql = mysql_query($query) or die(mysql_error());
    31.  
    32.                 $row = mysql_fetch_assoc($sql);
    33.                 $mail = $row['Mail'];
    34.                
    35.                 $mail->addAddress($mail);
    36.                 $mail->Subject = 'Запрос на восстановление пороля', 'Вы сделали запрос на восстановление пароля, ваш новый пароль: $string\n\nПожалуйста не отвечайте на данное письмо!';
    37.                 $mail->send();
    38.                 } catch (phpmailerException $e) {
    39.                 echo $e->errorMessage();
    40.                 } catch (Exception $e) {
    41.                 echo $e->getMessage();
    42.                 }
    43.                 $_SESSION['CheckRec'] = "<script>
    44.  
    45.     $(function () {
    46. toastr.options = {
    47.   'closeButton': false,
    48.   'debug': false,
    49.   'newestOnTop': false,
    50.   'progressBar': true,
    51.   'positionClass': 'toast-top-right',
    52.   'preventDuplicates': false,
    53.   'onclick': null,
    54.   'showDuration': '300',
    55.   'hideDuration': '1000',
    56.   'timeOut': '5000',
    57.   'extendedTimeOut': '1000',
    58.   'showEasing': 'swing',
    59.   'hideEasing': 'linear',
    60.   'showMethod': 'fadeIn',
    61.   'hideMethod': 'fadeOut'
    62. }
    63.         $(function (){
    64.             toastr.success('На вашу почту был отправлен пароль!');
    65.         });
    66.  
    67.     });
    68.  
    69. </script>
    70.        ";
    71.             } else {
    72.                 $_SESSION['CheckRec'] = "<script>
    73.  
    74.     $(function () {
    75. toastr.options = {
    76.   'closeButton': false,
    77.   'debug': false,
    78.   'newestOnTop': false,
    79.   'progressBar': true,
    80.   'positionClass': 'toast-top-right',
    81.   'preventDuplicates': false,
    82.   'onclick': null,
    83.   'showDuration': '300',
    84.   'hideDuration': '1000',
    85.   'timeOut': '5000',
    86.   'extendedTimeOut': '1000',
    87.   'showEasing': 'swing',
    88.   'hideEasing': 'linear',
    89.   'showMethod': 'fadeIn',
    90.   'hideMethod': 'fadeOut'
    91. }
    92.         $(function (){
    93.             toastr.warning('Ошибка. Аккаунт с таким Email не найден!');
    94.         });
    95.  
    96.     });
    97.  
    98. </script>
    99.        ";
    100.             }
    101.         }
    102.     }
    103.     public function get_content() {
    104.         include "SiteController/AccountController/recovery.php";  
    105.     }
    106. }
    107. ?>
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    mysql сменить на mysqli или PDO + использовать подготовленные запросы.
    javascript не хранить в сесии, какой скрипт показывать можно определять через get или post параметры.
    читай дальше книги по php, mysql есть что улучшать
     
  15. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    Почему его лучше не хранить в сессии, а лучше выносить как отдельный файл? Мне просто зачастую непонятно зачем какие то конструкции маленькие выносят в файлы и как это сказывается на работе в дальнейшем? И что имелось в виду под "Использовать подготовленные запросы"?
    Говоря о скриптах и get, конструкция будет такого рода?
    Код (Text):
    1.  
    2. public function get_content() {
    3.         include "SiteController/AccountController/recovery.php";  
    4.     }
    --- Добавлено ---
    Так, про подготовленные запросы понял, это было в связке с PDO. Хочу, чтобы страница работала быстро, эффективно, надежно, что для этого лучше mysqli или PDO с готовыми запросами? Стоит ли вообще использовать PDO?
     
  16. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Кому что нравится. Пдо, вроде как, более устойчив к sql-инъекциям за счет того, что внутри библиотеки уже проводятся кое-какие мероприятия против инъекций, что в mysqli нужно делать ручками
     
  17. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    "Что в mysqli нужно делать ручками", это же ещё надо узнать как обезопасить себя. А по коду выгоднее будет в таком случае mysqli или PDO?
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    по коду будет выгоднее не быть дырявым. как ты к этому приходишь - это второй вопрос. Но просто так заюзать "экранирование" не достаточно. Всё равно можно протащить в некоторых случаях кавычечку. Так что это тема обширная. Главное запомни использовать всегда и везде UTF.
     
  19. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    Хорошо, запомню, спасибо. Значит перепишу на mysqli, по мере увеличения знаний уже смогу на большее способен быть.
    И вопрос без ответа остался про скрипты. Почему лучше делать вызов к файлу в сессии, а не сам js содержать? Мне просто зачастую непонятно зачем какие то конструкции маленькие выносят в файлы и как это сказывается на работе в дальнейшем?
     
  20. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Лично я использую mysqli. Никто же не запрещает тебе самому написать класс-обертку со всякими экранированиями, установкой кодировки и тп один раз и использовать постоянно и не париться.
    Слушай, я вот досконально не сиотрел твой код, но сходу я понять не смог, зачем у тебя в сессии js хранится. Да и ты через пару месяцев если взглянешь - вообще не поймешь, что написал. Нужно писать так, чтобы было более-менее понятно, что там написано
     
  21. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    У тебя на сайте 100 человек пользуются, это для примера, у них код в сессии, ты захочешь его изменить и пока сессия у этих 100 человек не помрёт, ты для них не сможешь изменить код.
    Потом js код можно вообще разместить как файл на диске и в зависимости от параметров, просто его подключать через script src, так он минует обработку PHP и вебсервер его отдаст браузеру. Зачем лишний раз напрягать PHP. Когда скопится много таких мелочей, то всё может работать медленнее.
    Посмотри ещё MVC. Всё это придумано, чтобы проще было дописывать код, менять что-то.
    Почитай документацию по framework например Symfony2, Yii2 там есть описание как организуют код.
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    выносят в файлики, чтобы статику отдавать не вовлекая пхп. Вебсервер файлики может отдавать тысячами в секунду. Ещё можно предварительно сжать. А из пхп там выйдет несколько сотен в лучшем случае.
     
  23. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    У меня на класс-обертку знаний не хватит xD Пока по крайней мере. Код писали под заказ и писал, как я уже понял спустя некоторое время после покупки, бездарный человек, которому нужны были только деньги. Ну вот я и хочу его исправить, а заодно научиться у умных людей как нужно правильно писать код, исправить недостатки, как то оптимизировать, понять каждую строку кода. Пока конечно это не сильно получается, но я буду стараться, а пока код не работает как не крути со вставленными смтп(
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Вот моя обёртка. =)

    https://gist.github.com/igordata/0a66aae660b21a7313b7456a2f3b84cb

    параметры передавать так
    PHP:
    1. class DB {
    2.  
    3.   use t_DB;
    4. }
    5.  
    6. DB::connSettings(CFG::$databases['main']);
    Использовать так:
    PHP:
    1. $dkps = DB::assoc_id('SELECT * FROM `dkp` WHERE `community` = ' . (int)$community['id']);
     
  25. S.I.G

    S.I.G Новичок

    С нами с:
    19 апр 2016
    Сообщения:
    86
    Симпатии:
    0
    Супер! Ничего пока не понимаю там, но это потрясающе! И работает не хуже,а даже лучше, чем встроенная?:)
    Её можно же использовать?:)