Отправка писем через PHPMailer и AJAX

129
30 января 2020, 08:00

Всем привет! Не получается сделать отправку писем на сайте через AJAX. Нажимаю на кнопку отправить и ничего не происходит. Консоль в ответ не выдает никаких ошибок. Не могу понять где что ни так..

HTML

 <form action="" method="POST" id="form_question">
                        <div class="form-row">
                                <div class="form-group col-md-6">
                                  <label for="user_name">Имя</label>
                                  <input type="text" class="form-control" name="user_name" placeholder="Имя" id="user_name" required ><span></span>
                                <label for="user_email">Email</label>
                                <input type="email" class="form-control" name="user_email" placeholder="Email" id="user_email" required ><span></span>

                                <label for="name_category">Выберите категорию</label>
                              <select class="custom-select" name="name_category" id="name_category" required  >
                                    <option selected value="">Выберите категорию...</option>
                                   <option value="Программы">Программы</option>
                                    <option value="Ошибки">Ошибки</option>
                                    <option value="Игры">Игры</option>
                                    <option value="Операционная система">Операционная система</option>
                                    <option value="BIOS">BIOS</option>
                                    <option value="Комплектующие">Комплектующие</option>
                                     <option value="Проблемы с железом">Проблемы с железом</option>
                                  </select><span></span>
        </div>
        <div class="form-group col-md-6">
            <label for="tema">Тема</label>
            <input type="text" class="form-control" name="tema" id="tema" placeholder="Тема вопроса"><span></span>
                <label for="message">Ваш вопрос</label>
                <textarea class="form-control" placeholder="Сообщение..." name="message" id="message" rows="4" required ></textarea><span></span>
              </div>
              <button type="submit" class="btn btn-primary col-md-10 mb-4  mx-auto" id="submit">Отправить</button><span></span>
    </div>
          </form>

JS

$(function(){
    $("#form_question").submit(function() { 
              var errors = false;
              $(this).find('span').empty();
              $(this).find('input, option, textarea').each(function(){
                  if ($.trim( $(this).val() ) == '' ) {
                      errors = true;
                      $(this).next().text('Не заполнено поле ' + $(this).prev().text() );
                  }
              });
              if ( !errors ) {
                  var data = $('#form_question').serialize();
                  $.ajax({
                      url: 'mail.php',
                      type: 'POST',
                      data: data,
                      beforeSend: function(){
                          $('#submit').next().text('Отправляю...');
                      },
                      success: function(res){
                          if(res == 1){
                              $('#form_question').find('input:not(#submit), textarea, option').val('');
                              $('#submit').next().empty();
                              alert('Письмо отправлено');
                          }
                          else {
                              $('#submit').next().empty();
                              alert('Ошибка отправки!');
                          }
                      },
                      error: function(){
                          alert('Ошибка!');
                      }
                  });
              }
              return false;
        });
});

PHP

<?php
    if ( $_POST){
    require 'phpmailer/PHPMailerAutoload.php';
    $mail = new PHPMailer; 
    $mail->isSMTP();
    $mail->Host = 'smtp.yandex.ru';
    $mail->SMTPAuth = true;
    $mail->Username = 'voprosy.ssaita@yandex.ru';
    $mail->Password = 'vopros.v.o09071993#%';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = '465';
    $mail->CharSet = 'utf-8';
    $mail->From = 'voprosy.ssaita@yandex.ru';
    $mail->addAddress('healpk@yandex.ru', 'Name');
    $mail->addCC('healpk@yandex.ru');
    $mail->isHTML(true);  
    $mail->Subject = $_POST['name_category'];
    $mail->Body = "Привет! Меня зовут: {$_POST['user_name']} Моя почта: {$_POST['user_email']} <br> Категория: {$_POST['name_category']} <br> Тема: {$_POST['tema']} <br> Вопрос: " .nl2br($_POST['message']);
    $mail->AltBody ="Привет! Меня зовут: {$_POST['user_name']} Моя почта: {$_POST['user_email']} \r\n Категория: {$_POST['name_category']} \r\n Тема: {$_POST['tema']} \r\n Вопрос: {$_POST['message']}";

    if ($mail->send() ){
        $answer = '1';
        }
        else {
          $answer = '0';  
        }
    die ($answer);
    }
?>

Помогите, пожалуйста, понять и найти ошибку))

Answer 1

Попробуйте вставить мой рабочий вариант он как раз показывает как отправить сообщение и принять на php и отправить обратно. Ошибок может быть много например url не правильный.Советую вам просто сделать простой запрос и 1 единственный ответ echo 999; и вывести этот ответ в js.вы отправляете data и data это не совсем логично.Посмотрите у меня происходит передача имени и значения переменной которую php принимает. А где вы принимаете это я не увидел.К базе данных можно и проще подключится если в первом варианте вы получили ответ 999 попробуйте взять любое число из базы данных и его отправить и вывести в js тогда вы убедитесь что она функционирует правильно. Хочется добавить ajax очень сложная вещь,чтобы её понять желательно сделать более простую передачу данных и понять каждую строку ,что куда и зачем идёт. var id=812382;

var k="Иван";

     $.ajax ({ // сам метод ajax
      url: "ch.php",// куда отправлять 
      type: "POST", // тип отправки
      data: ({num1: id,num3: k}), // отправляем id и имя
      dataType: "html", 
      beforeSend: funcBefore, 
      success:  function(data){// тут принимает ответ от php
               // тут получаем ответ
               alert(data);// должно выйти сообщение данные записаны 
          }

      } 
     });

// вот эти функция нужны чтобы всё правильно работало 
function funcBefore () { 
    $("#information").text ("Ожидание данных...") 
   }
   function funcSuccess (data) { 
   }


<?php 

$mysqli = new mysqli ("localhost", "имя бд", "пар", "имя бд"); // подключение к базе данных
$mysqli->query ("SET NAMES 'utf8' "); // кодировка
// тут мы принимаем данные 
 $w=$_POST['num1']; // id 
 $w1=$_POST['num3']; //  имя



$mysqli->query ("UPDATE `название таблицы` SET `name` = '$w1' WHERE `название таблицы`.`id` = $w"); // записываем данные 

echo "данные записаны";

$mysqli->close();// закрытие бд
 ?>
READ ALSO
Преобразовать объект в массив PHP

Преобразовать объект в массив PHP

Хотел бы поинтересоваться, как преобразовать объект, получаемый от АПИ ТелеграммаНиже моя попытка:

164
Найти точное значение в строке

Найти точное значение в строке

Есть строка с числамиКаждое значение разделено запятыми

156
Ошибка при запросе в базу данных PDO PHP

Ошибка при запросе в базу данных PDO PHP

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: mode must be an integer in C:\OSPanel\domains\WorkLeader\app\models\Adminphp on line 55 ( ! ) PDOException: SQLSTATE[HY000]: General error: mode must be an integer in C:\OSPanel\domains\WorkLeader\app\models\Admin

147