PHPmailer и vanilla JavaScript AJAX форма приглашения - PullRequest
0 голосов
/ 18 января 2020

Итак, мне понадобилась контактная форма, которая может отправлять электронные письма с «успешным» приглашением, которое появляется в моей форме, БЕЗ перезагрузки. Я нашел PHPmailer, который помогает с отправкой почты в почтовый ящик, а не спам (это само по себе работает нормально, электронная почта отправляется прямо в почтовый ящик). Затем я добавляю проверку JS, затем AJAX, затем PHP, которая имеет дело с ответом JSON.

Приглашение «success» появляется, когда я нажимаю «send» (хорошо!), Но проблема в том, что ни одно письмо не было отправлено / получено. Код без AJAX отлично работает на моих локальных и веб-хостах отлично. Как мне оптимизировать это, чтобы появилось сообщение об успешном завершении и электронное письмо было отправлено (в идеале, входящие)?

Нет jQuery или любые дополнительные плагины, пожалуйста.

Заранее спасибо.

HTML:

<div class="contact-form">
    <form action="mail.php" method="POST" onsubmit="return doRegister()">
        <input id="mail-name" type="text" name="name" placeholder="Your Name">
        <span id="name-alert"></span>
        <input id="mail-email" type="text" name="email" placeholder="Your Email">
        <span id="email-alert"></span>
        <input id="mail-subject" type="text" name="subject" placeholder="Your Subject">
        <span id="subject-alert"></span>
        <textarea id="mail-message" name="message" placeholder="Your Message"></textarea>
        <span id="message-alert"></span>
        <input type="submit" value="Send">
        <input type="reset" value="Clear">
        <span class="contact__form--alert-success" id="success-alert"></span>
    </form>
</div>

JS:

function doRegister() {
  let checks = {
    name : document.getElementById("mail-name"),
    email : document.getElementById("mail-email"),
    subject : document.getElementById("mail-subject"),
    message : document.getElementById("mail-message")
  },
error = "";
  if (checks.name.value=="") {
    error += document.getElementById("name-alert").innerHTML+='<p>A name is required!</p>';
  }
  if (checks.subject.value=="") {
    error += document.getElementById("subject-alert").innerHTML+='<p>A subject is required!</p>';
  }
  if (checks.message.value=="") {
    error += document.getElementById("message-alert").innerHTML+='<p>A message is required!</p>';
  }
  let pattern = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  if (!pattern.test(checks.email.value.toLowerCase())) {
    error += document.getElementById("email-alert").innerHTML+='<p>A valid email is required!</p>';
  }

// Ajax
if (error!="") {
    error="";
} else {
let data = new FormData();
for (let k in checks) {
  data.append(k, checks[k].value);
}
let xhr = new XMLHttpRequest();
xhr.open('POST', "mail.php", true);
xhr.onload = function(){
        let res = JSON.parse(this.response);
        // SUCCESS!
  if (res.status) {
            document.getElementById("success-alert").innerHTML+='<p>Success!</p>';
  } else {
    // ERROR!
    error = "";
    for (let e of res['error']) {
      error += e + "\n";
    }
    alert(error);
  }
};
// SEND
xhr.send(data);
 }
 return false;
}

PHP:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
$error = [];
$msg = '';
if ( array_key_exists( 'email', $_POST ) ) {
  date_default_timezone_set( 'Etc/UTC' );
  require 'mail/vendor/autoload.php';
  // Call super globals from the contact form names
  $email                        = $_POST['email'];
  $name                         = $_POST['name'];
  $subject          = $_POST['subject'];
  $message          = $_POST['message'];
  $mail             = new PHPMailer;
  $mail->isSMTP();
  $mail->Host       = 'mail.host.com';
  $mail->SMTPAuth   = true;
  $mail->Username   = 'name@host.com';
  $mail->Password   = 'password1';
  $mail->SMTPSecure = 'ssl';
  $mail->Port       = 465;
  $mail->setFrom( 'name@host.com', 'New Message' );
  $mail->addAddress( 'somemail@mail.com' );
  if ($mail->addReplyTo($email, $name)) {
    $mail->Subject = $subject;
    $mail->isHTML(false);
    $mail->Body = <<<EOT
Email: {$email}
Name: {$name}
Message: {$message}
EOT;
  }

// Check inputs
if ($name=="") {
    $error[] = "A name is required.";
}
if ($subject=="") {
    $error[] = "A subject is required.";
}
if ($message=="") {
    $error[] = "A message is required.";
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $error[] = "A valid email is required.";
}

// JSON encode with a response
echo json_encode([
"status" => count($error)==0 ? 1 : 0,
"error" => $error
]);
 }

Решение: отсутствует функция "send ()"

if(empty($error)){
  if(!$mail->send()){
    $error[] = 'There was an error sending the mail. Please try again!';
  }
}

1 Ответ

1 голос
/ 18 января 2020

Ваш скрипт PHP не отправляет почту, потому что функция send() не вызывается, поэтому после проверки вы должны добавить что-то вроде:

if(empty($error)){
    if(!$mail->send()){
        $error[] = 'There was an error sending the mail. Please try again!';
    }
}

echo json_encode([
"status" => count($error)==0 ? 1 : 0,
"error" => $error
]);

Таким образом, вы отправляете сообщение и, если возникла проблема (send() возвращает false), в массив ошибок добавляется ошибка.

...