PHPMailer работает из бэкэнда, но ajax не возвращает сообщение об успешном выполнении в веб-интерфейсе - PullRequest
0 голосов
/ 03 ноября 2018

Я отправляю электронное письмо с PHPMailer. Работает просто отлично. Проблема в вызове ajax. Если мои данные возвращают «ноль», диалог работает.

Я пробовал if / else if / else и переключатель с сообщением об успехе, установленным по умолчанию. Моя консоль не показывает никакой обратной связи, и диалог не появляется. Единственное, что работает, это электронная почта.

Передняя часть:

<body class="text-center">
<div id="incorrect_email_dialog">
    <h3>Oops! It looks like you entered an incorrect email</h3>
    <h3>Give it another try</h3>
</div>
<div id="correct_email_dialog">
    <h3>Please check the email associated with your account</h3>
    <h3>for instructions to reset your password</h3>
</div>
<div class="container login-container">
    <form id="forgot_pass_form" class="form-signin">
        <img class="login_logo" src="css/images/logos/example_logo72x72.png">
        <h1 class="font-weight-normal">Please enter email</h1>
        <input type="email" id="inputEmail" name="inputEmail" class="form-control" placeholder="Enter email associated with account" required autofocus>
        <button id="login_btn" class="btn btn-lg btn-primary btn-block" type="submit">Submit</button>
        <div class="register-container">
            <p><a class="register-p" href="login.php">Back to Login</a></p>
        </div>
    </form>
</div>
</body>
<script>

    var original_error_dialog = $('#incorrect_email_dialog').html();

        $('#forgot_pass_form').submit(function(e) {
            e.preventDefault();
            console.log(email);
            console.log('Submitted form');
            $.ajax({
                type: 'post',
                url: 'includes/token_send.php',
                dataType: 'json',
                data: $(this).serialize(),
                success: function(data) {
                    console.log(data);
                    switch(data) {
                        case 'Error':
                            console.log('Error');
                            $('#incorrect_email_dialog').html('<h3>Oops. There was a problem</h3>');
                            $('#incorrect_email_dialog').dialog('open');
                            break;
                        case 'null':
                            console.log('Data was null');
                            $('#incorrect_email_dialog').html(original_error_dialog);
                            $('#incorrect_email_dialog').dialog('open');
                            break;
                        default:
                            $('#correct_email_dialog').dialog('open');
                            console.log('All good');
                            break;
                    }
                }
            })
        });

Бэкэнд:

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

require_once '../PHPMailer/src/PHPMailer.php';
require_once '../PHPMailer/src/SMTP.php';
include '../../config/DB.php';

if($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = $_POST['inputEmail'];

    try { $db = new DB(); } catch (\Exception $e) { $e->getMessage(); }

    $result = $db->getRow('SELECT email FROM users WHERE email=?', [$email]);

    $input_email = $result['email'];

    if($input_email !== null) {
        $to = $input_email;
        $token = bin2hex(random_bytes(8));
        $mail = new PHPMailer();
        $mail->isSMTP();
        $mail->Host = 'localhost';
        $mail->SMTPDebug = 2;
        $mail->setFrom('noreply@example.com', '');
        $mail->addAddress($to, '');
        $mail->Subject = 'Example Password Reset Request';
        $mail->isHTML(true);
        $mail->Body = '
                <h2 style="padding:10px;background:#ec1414;font-size:16px;color:#fff;">Example Password Reset</h2>
                <br><br>
                <p>Use this link to reset your password</p>
                <br>
                <a style="text-decoration:none!important;" href="http://example.local/reset.php?token='.$token.'&email='.$input_email.'">Click here to reset</a>';
        if(!$mail->send()) {
            echo json_encode('Error');
        } else {
            echo json_encode('Success');
        }
    } else {
        echo json_encode('null');
    }
}

Я получаю электронное письмо в своем почтовом ящике, но ничего после оператора console.log 'Submitted Form'.

Я тоже пробовал:

case 'Success':
    $('#correct_email_dialog').dialog('open');
    console.log('All good');
    break;

вместо default безрезультатно.

1 Ответ

0 голосов
/ 03 ноября 2018

Хорошо, я немного покопался и нашел свое решение в качестве комментария к этому вопросу.

Я забыл, что ушел

$mail->SMTPDebug = 2;

в коде! Все, что я сделал, было

//$mail->SMTPDebug = 2;

и стрела исправлены. Электронная почта отправляется, появляется мое диалоговое окно jQuery. Все хорошо. :)

Я кое-что узнал о режиме отладки PHPMailer и о том, как он взаимодействует с Ajax сегодня. Спасибо, что указали мне правильное направление, друзья.

Вот консольный журнал удаления почты.

enter image description here

А вот успех ajax, вызывающий взаимодействие jQuery Dialog.

enter image description here

Опять же, спасибо за вашу помощь.

...