Отправить форму нажатием кнопки с помощью FETCH и отправить электронное письмо с помощью PHPMailer - PullRequest
0 голосов
/ 05 августа 2020

Я хочу отправить форму при нажатии кнопки с API выборки для индекса. php где я проверяю форму. Если в форме не было ошибок, я хочу отправить клиенту электронное письмо с PHPMailer. По какой-то причине клиент не получает электронное письмо. Я часами искал ответ, но не смог решить проблему.

Вот код javascript:

 const form = document.querySelector("#myForm");
      form.addEventListener("submit", (e) => {
        e.preventDefault();
        const formData = new FormData(form);
        fetch("index.php", {
          method: 'post',
          body: formData
        }).then((resp) => resp.json())
        .then(function (text) {
          console.log(text); //Do something with the response, which is an array
          if(text !== undefined && text.length > 0) { //The array isn't empty
            //Show errors
            const formdiverror = document.querySelector(".col-100-form-error");
            const colform = document.querySelector(".col-100-form"); //showing error
            colform.style.display = "block";
            formdiverror.innerHTML = "";
            text.forEach(t => formdiverror.innerHTML += t + "</br>");
          } else {
            //array is empty, no errors
             const colform = document.querySelector(".col-100-form");
             if(colform !== null || colform !== undefined) colform.style.display = "none";
             alert("You succesfully bought the product!");
            //window.location.replace("index.html"); //if there was no error redirect to index.html
          }
        });
      })

php:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
require 'Exception.php';
require 'PHPMailer.php';
require 'SMTP.php';
require 'PHPMailerAutoload.php';
require "class.phpmailer.php";
require "class.smtp.php";


$errors = [];

if(isset($_POST["name"])) {
   
     /*I took out the validation to simplify the code*/
    if (!empty($errors)) {
        echo json_encode($errors);
    } else {
        echo json_encode([]);
        $mail = new PHPMailer();
        $mail->isSMTP();
        $mail->Host = 'smtp.gmail.com';
        $mail->SMTPAuth = true;
        $mail->Username = "mymail@gmail.com"; //paste one generated by Mailtrap
        $mail->Password = 'mypasswd'; 
        $mail->SMTPSecure = 'tls'; // secure transfer enabled REQUIRED for GMail
        $mail->Port = 587;
        $mail->addAddress("customer@gmail.com", 'First Last');
        $mail->addReplyTo('mymail@gmail.com', 'First Last');
        $mail->setFrom('mymail@gmail.com', 'John Doe');
        $mail->Subject = 'PHPMailer GMail SMTP test';
        $mail->isHTML(true);
        $mailContent = "<h1>Send HTML Email using SMTP in PHP</h1>
        <p>This is a test email I’m sending using SMTP mail server with PHPMailer.</p>";
         $mail->Body = $mailContent;
         $mail->send();
        //If I try this way it gives an errror: Unexpected token in JSON at position 
        /* if($mail->send()){
            echo ('Message has been sent');
        }else{
            echo ('Message could not be sent.');
            echo ('Mailer Error: ' . $mail->ErrorInfo);
        }*/
    }
} 
?>

У меня нет ошибок, поэтому я не знаю, в чем проблема. Я отключил двустороннюю проверку и предоставил доступ к менее безопасным приложениям.

1 Ответ

2 голосов
/ 05 августа 2020

Прежде всего, вы импортируете обе версии 5 и 6 PHPMailer! Это не будет go хорошо; go с 6. Удалите эти строки и файлы, на которые они указывают; они вам не нужны:

require 'PHPMailerAutoload.php';
require "class.phpmailer.php";
require "class.smtp.php";

Если вы не знаете, как импортировать библиотеки в целом, сейчас самое время узнать о composer.

Как ни странно, когда вы комментируете код, который показывает вам, где находится ошибка, он больше не показывает вам, когда есть ошибка ... эта строка console.log(text); должна показывать вам то, что видит ваш браузер.

Лучший способ подойти к этому - отлаживать одну вещь за раз.

Сначала убедитесь, что ваша форма действительно доставляет данные в ваш сценарий в том формате, который должен быть - учитывая JSON ошибка (которая не из PHPMailer), очень вероятно, что это не , и это, вероятно, источник всех ваших проблем. Поэтому добавьте это в верхней части вашего скрипта:

var_dump($_REQUEST);

Это нарушит ваш запрос ajax (потому что результат не JSON), но вы сможете увидеть необработанный ответ в своем веб-инспектор браузера.

Убедившись, что он имеет правильный формат и содержит все ваши ожидаемые данные формы, удалите эту строку var_dump и перейдите к проверке того, что вы получаете доступ к свойствам в JSON правильно. Опять же, вам может быть лучше показать это в инспекторе вашего браузера. Убедившись, что вы извлекаете все нужные вам биты данных правильным образом, переходите к отправке электронной почты.

Учитывая очень распространенные проблемы с использованием Gmail через SMTP , рекомендуется протестировать код электронной почты с фиксированными значениями отдельно от вашего ajax материала - его достаточно сложно отлаживать самостоятельно, чтобы другие вещи не мешали.

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

...