Сбой PHPMailer после переноса на другой сервер - PullRequest
0 голосов
/ 06 июля 2018

Это ломает мне мозг. У меня точно такой же код на двух разных серверах. Он отправляет почту SMTP без проблем в одном, а в другом отказывает. Консоль чистая. И у меня нет возможности что-либо отлаживать, так как я не знаю, что именно не удалось. Могу ли я одолжить пару глаз?

Это простая форма с капчей. После того, как он проходит или терпит неудачу, он отвечает модалом успеха / неудачи. Если это не удалось, он остается на странице контактов, чтобы исправить ошибки и отправить заново. Если он проходит, он обновляет экран после закрытия модального успеха.

Страница моего контакта <head>:

    <script>
        $(document).ready(function() {

            var request;

            $("#contactForm").submit(function(event){
                event.preventDefault();

                // Abort any pending request
                if (request) {
                    request.abort();
                }

                // setup some local variables
                var $form = $(this);

                // Let's select and cache all the fields
                var $inputs = $form.find("input, select, button, textarea");

                // Serialize the data in the form
                var serializedData = $form.serialize();

                // Let's disable the inputs for the duration of the Ajax request.
                // Note: we disable elements AFTER the form data has been serialized.
                // Disabled form elements will not be serialized.
                $inputs.prop("disabled", true);

                request = $.ajax({
                    url: "sendContactMail.php",
                    type: "post",
                    data: serializedData
                });

                // Callback handler that will be called on success
                request.done(function (response, textStatus, jqXHR){

                    if (response.status == 0) {
                        // Success! Do something successful, like show success modal
                        jQuery.noConflict();
                        $('#successEmail').modal('show');
                    } else {
                        // Oh no, failure - notify the user
                        jQuery.noConflict();
                        $('#failEmail').modal('show');
                    }

                    $( "#failBtn" ).click(function() {
                        jQuery.noConflict();
                        $('#failEmail').modal('hide');
                    });

                    $( "#passBtn" ).click(function() {
                        window.location.reload();
                    });

                });

                // Callback handler that will be called on failure
                request.fail(function (jqXHR, textStatus, errorThrown){
                    // Say you have a <div class="message"></div> somewhere, maybe under your form
                    //$('.message').html('Error: ' + textStatus + ', ' + errorThrown)
                });

                // Callback handler that will be called regardless
                // if the request failed or succeeded
                request.always(function () {
                    // Reenable the inputs
                    $inputs.prop("disabled", false);
                });
            });
        });
    </script>

Форма обратной связи:

<form id="contactForm" class="form margin-alpha-top" method="POST"> 
    <div class="form__group">
        <label class="form__label" for="inputSubject">Subject</label>
        <input id="inputSubject" name="subject" type="text" class="form__field">
    </div>
    <div class="form__group">
        <label class="form__label" for="inputName">Name *</label>
        <input id="inputName" name="name" type="text" class="form__field" required="">
    </div>
    <div class="form__group">
        <label class="form__label" for="inputEmail">E-mail *</label>
        <input id="inputEmail" name="email" type="email" class="form__field" required="">
    </div>
    <div class="form__group">
        <label class="form__label" for="inputPhone">Phone</label>
        <input id="inputPhone" name="phone" type="text" class="form__field">
    </div>
    <div class="form__group form-group--extended">
        <label class="form__label form__label--extended" for="inputMessage">Message *</label>
        <textarea id="inputMessage" name="message" class="form__field form__field--extended" rows="6" required=""></textarea>
    </div>
    <div class="row captcha">
        <div class="column-xs-12 column-sm-4 column-md-4 xs-center">
        </div>
        <div class="column-xs-6 column-sm-4 column-md-4 xs-center">
            <img id="captcha" src="/securimage/securimage_show.php" alt="CAPTCHA Image" />
            <br/>
            <input type="text" name="captcha_code" size="10" maxlength="6" />
            <br/>
            <a href="#" id="secureText" onclick="document.getElementById('captcha').src = '/securimage/securimage_show.php?' + Math.random(); return false">
                <small>Refresh Image</small>
            </a>
        </div>
        <div class="column-xs-6 column-sm-4 column-md-4 xs-center">
            <div class="form__group submit-button">    
                <button 
                    type="submit" 
                    class="form__button button button--gamma margin-beta-bottom" 
                    id="btnSubmit">
                    <span class="button__text">Send</span>
                </button>
            </div>
        </div>
    </div>                                        
</form>

Мой скрипт sendContactMail.php

<?php
session_start();

$msg = '';


use PHPMailer\PHPMailer\PHPMailer;

require './mail/PHPMailer.php';
require './mail/Exception.php';
require './mail/SMTP.php';
require './mail/PHPMailerAutoload.php';

include_once $_SERVER['DOCUMENT_ROOT'] . '/securimage/securimage.php';

$securimage = new Securimage();

//Don't run this unless we're handling a form submission
if (array_key_exists('email', $_POST)) {

    date_default_timezone_set('Etc/UTC');

    //Create a new PHPMailer instance
    $mail = new PHPMailer;

    $mail->SMTPDebug = 0;                                 // Enable verbose debug output
    $mail->isSMTP();                                      // Set mailer to use SMTP
    $mail->Host = 'smtp.live.com';                        // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                               // Enable SMTP authentication
    $mail->Username = 'lotusms@outlook.com';              // SMTP username
    $mail->Password = '********';                         // SMTP password
    $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;                                    // TCP port to connect to

    $mail->setFrom('lotusms@outlook.com', 'Mailer');
    $mail->addAddress('lotusms@outlook.com', 'Luis Silva');


    $email = isset($_POST['email']) ? $_POST['email'] : null;
    $subject = isset($_POST['subject']) ? $_POST['subject'] : null;
    $name = isset($_POST['name']) ? $_POST['name'] : null;
    $phone = isset($_POST['phone']) ? $_POST['phone'] : null;
    $message = isset($_POST['message']) ? $_POST['message'] : null;


    if ($mail->addReplyTo($_POST['email'], $_POST['name'])) {
        $mail->Subject = $_POST['subject'];
        $mail->isHTML(true);
        $mail->Body = <<<EOT
<div style="width:100%">
<div><label style="color: #044F69; font-weight:bold">Subject:</label> <span>{$_POST['subject']}</span></div>
<div><label style="color: #044F69; font-weight:bold">Email:</label> <span>{$_POST['email']}</span></div>
<div><label style="color: #044F69; font-weight:bold">Name:</label> <span>{$_POST['name']}</span></div>
<div><label style="color: #044F69; font-weight:bold">Phone:</label> <span>{$_POST['phone']}</span></div>
<div><label style="color: #044F69; font-weight:bold">Message:</label> <span>{$_POST['message']}</span></div>
</div>
EOT;

        if ($securimage->check($_POST['captcha_code']) == false) {
            $response = [
                'status'=> 1,
                'msg'   => 'CAPTCHA test failed!'
            ];
        } else {
            //Send the message, check for errors
            if (!$mail->send()) {
                // Generate a response in this failure case, including a message and a status flag
                $response = [
                    'status'=> 1,
                    'msg'   => 'Sorry, something went wrong. Please try again later.'
                ];
            } else {
                // Generate a response in the success case, including a message and a status flag
                $response = [
                    'status'=> 0,
                    'msg'   => 'Success!'
                ];
            }
        }
    } else {
        // Generate a response in this failure case, including a message and a status flag
        $response = [
            'status'=> 1,
            'msg'   => 'Invalid email address, message ignored.'
        ];
    }
}
// Add the response to the session, so that it will be available after reload
$_SESSION['response'] = $response;

// Finally display the response as JSON so calling JS can see what happened
header('Content-Type: application/json');
echo json_encode($response);

?>

У меня точно такая же установка работает на других сайтах и ​​работает правильно. Что я не вижу? Как это может работать на одном сервере, а не на другом?

Я знаю, что не стоит публиковать здесь реальные сайты, но если вы хотите, чтобы они проходили мимо и не работали, и, возможно, это поможет вам как-то отладить, вы можете. Это веб-сайт Департамента полиции. Полностью безопасен.

Сбой сайта (С выделенного сервера я не управляю)

Передача сайта (от HostGator)

Заранее большое спасибо. Это бесплатный сайт, который я пожертвовал, поэтому я ограничен объемом помощи, которую я могу нанять

1 Ответ

0 голосов
/ 06 июля 2018

Недавно у меня были очень похожие проблемы с PHP Mailer. Прежде всего, мы знаем, что он должен что-то делать с сервером, так как сайт работает на сервере dev, но не внутри живого сервера. Скорее всего, ошибка возникает из-за того, что не работает подключение к SMTP-серверу или SMTP-сервер в действующей системе отклоняет ваш почтовый запрос (однако, возможно, что-то уже не так с вашим кодом ранее из-за разных версий PHP, разных переменных, разных php.ini, ...).

Поэтому мы должны отладить, чтобы найти проблему. Отладка PHPMailer очень хорошо документирована: https://github.com/PHPMailer/PHPMailer/wiki/SMTP-Debugging

Вот как вы должны попытаться отладить вашу проблему (сокращенный код):

    //Create a new PHPMailer instance
    $mail = new PHPMailer;

    $mail->isSMTP();                                      // Set mailer to use SMTP
    $mail->Host = 'smtp.live.com';                        // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                               // Enable SMTP authentication
    $mail->Username = 'lotusms@outlook.com';              // SMTP username
    $mail->Password = '********';                         // SMTP password
    $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;                                    // TCP port to connect to

    $mail->setFrom('lotusms@outlook.com', 'Mailer');
    $mail->addAddress('lotusms@outlook.com', 'Luis Silva');


    $mail->Subject = $_POST['subject'];
    $mail->isHTML(true);
    $mail->Body = "...";


    $mail->SMTPDebug = 4; // Lowest level, you may also use 1, 2 or 3
    $mail->Debugoutput = 'text'; // if this does not work, use 'error_log' or even a custom closure

    var_dump($mail);

    $send = $mail->send());

    var_dump($send);

Если что-то не так, вы должны увидеть проблему в ваших var_dump s или выводе, созданном свойствами SMTPDebug и Debugoutput мгновенно.

Существуют различные возможные причины вашей проблемы, ключ заключается в правильной отладке вашего кода в вашей среде (но не обязательно на вашем сайте) .

Если $mail->Debugoutput='text'; не работает, попробуйте 'error_log' и просмотрите файл журнала или даже напишите специальное закрытие для этой цели (см. Документацию).

...