phpmailer и php5.6 не работают с office365

У меня есть сайт, размещенный в стойке, и я обновил технологию своего сайта с php5.4 до php5.6. Теперь я больше не могу отправлять письма с сайта. Хуже всего то, что я даже не получаю никаких ошибок, и журналы ничего не показывают. Я использую phpmailer 5.2.14.

Вот мой почтовый скрипт

require 'phpmailer/PHPMailerAutoload.php';
if (isset($_POST['contactForm'])) {
        $email = $_POST['email'];
        $subject = $_POST['subject'];
        $message = $_POST['message'];
        $body = '
        <html>
            <body>
                <div style="float:left; width:100%; margin:0 0 25px 0; padding:20px; background:#222; text-align:center;">
                    <div style="display:inline-block; vertical-align:top;">
                        <a href="http://website.com"><img src="img/logoEmail.png" alt="waesf"></a>
                    </div>
                </div>
                <main style="float:left; width:100%; padding:20px;">
                    <p style="font-family:Arial; font-size:18px;">'.$message.'</p>
                </main>
            </body>
        </html>';
        $mail = new PHPMailer;

        $mail->SMTPDebug = 3;                                                         // Enable verbose debug output

        $mail->SMTPOptions = array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
            )
        );
        $mail->isSMTP();                                                                // Set mailer to use SMTP
        $mail->Host = 'smtp.office365.com';                                             // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                                                         // Enable SMTP authentication
        $mail->Username = '[email protected]';                                 // SMTP username
        $mail->Password = 'secret';                                                // SMTP password
        $mail->SMTPSecure = 'tls';                                                      // Enable TLS encryption, `ssl` also accepted
        $mail->Port = 587;                                                              // TCP port to connect to

        $mail->SetFrom('[email protected]', 'Ballpoint Machinist');
        $mail->AddAddress('[email protected]', "BPM");                         // Add a recipient
        $mail->addReplyTo('[email protected]', 'Information');
        // $mail->addCC('[email protected]');
        // $mail->addBCC('[email protected]');

        // $mail->addAttachment('/var/tmp/file.tar.gz');                                // Add attachments
        // $mail->addAttachment('/tmp/image.jpg', 'new.jpg');                           // Optional name
        $mail->isHTML(true);                                                            // Set email format to HTML

        $mail->Subject = $subject;
        $mail->Body    = $body;
        $mail->AltBody = $body;

        if (!$mail->send()) {
            echo 'Message could not be sent.';
            echo 'Mailer Error: ' . $mail->ErrorInfo;
        } else {
            echo 'Message has been sent';
        }
    }

Когда скрипт запускает сайт, он зависает на некоторое время, а затем выдает сообщение о том, что время ожидания сервера истекло, и больше ничего. Никакие коды ошибок php ничего не кодируют, и когда я проверяю журналы, ошибок, связанных с моим почтовым кодом, нет. Однако это происходит только с Office 365, когда я меняю настройки smtp на gmail, тогда я, по крайней мере, получаю ошибки php на странице.

Я уже прочитал кучу тем на эту тему, но так и не понял. Я также прошел через https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting и добавил SMTPOptions для исключения ssl, но это не помогло.

Я озадачен тем, что я не получаю никаких ошибок. У меня SMTPDebug = 3 и error_reporting(E_ALL).

отредактируйте с предложением Willy Pt. Все еще не работает, когда скрипт запускает время сервера.

if (isset($_POST['contactForm'])) {
        $email = $_POST['email'];
        $subject = $_POST['subject'];
        $message = $_POST['message'];
        $body = '
        <html>
            <body>
                <div style="float:left; width:100%; margin:0 0 25px 0; padding:20px; background:#222; text-align:center;">
                    <div style="display:inline-block; vertical-align:top;">
                        <a href="http://website.com"><img src="img/logoEmail.png" alt="Ballpoint Machinist"></a>
                    </div>
                </div>
                <main style="float:left; width:100%; padding:20px;">
                    <p style="font-family:Arial; font-size:18px;">'.$message.'</p>
                </main>
            </body>
        </html>';
        $mail = new PHPMailer(true);

        // $mail->SMTPDebug = 4;                                                         // Enable verbose debug output

        try {

        $mail->SMTPOptions = array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
            )
        );
        $mail->isSMTP();                                                                // Set mailer to use SMTP
        $mail->Host = 'smtp.office365.com';                                             // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                                                         // Enable SMTP authentication
        $mail->Username = '[email protected]';                                 // SMTP username
        $mail->Password = 'test';                                                // SMTP password
        $mail->SMTPSecure = 'tls';                                                      // Enable TLS encryption, `ssl` also accepted
        $mail->Port = 587;                                                              // TCP port to connect to

        $mail->SetFrom('[email protected]', 'Ballpoint Machinist');
        $mail->AddAddress('[email protected]', "BPM");                         // Add a recipient
        $mail->addReplyTo('[email protected]', 'Information');
        // $mail->addCC('[email protected]');
        // $mail->addBCC('[email protected]');

        // $mail->addAttachment('/var/tmp/file.tar.gz');                                // Add attachments
        // $mail->addAttachment('/tmp/image.jpg', 'new.jpg');                           // Optional name
        $mail->isHTML(true);                                                            // Set email format to HTML

        $mail->Subject = $subject;
        $mail->Body    = $body;
        $mail->AltBody = $body;
        $mail->send();
        echo "Message Sent OK\n";
        /*if (!$mail->send()) {
            echo 'Message could not be sent.';
            echo 'Mailer Error: ' . $mail->ErrorInfo;
        } else {
            echo 'Message has been sent';
        }*/


        } catch (phpmailerException $e) {
            echo $e->errorMessage(); //Pretty error messages from PHPMailer
        } catch (Exception $e) {
          echo $e->getMessage(); //Boring error messages from anything else!
        }
    }
} 

Кто-нибудь может помочь?


person badsyntax    schedule 18.01.2016    source источник
comment
Попробуйте опубликовать трассировку стека, предоставленную PHPMailer, используя тот же метод, который описан в этом ответе stackoverflow.com/questions/2386544/ Лучше читать трассировку стека, чем видеть только ErrorInfo   -  person Willy Pt    schedule 18.01.2016
comment
SMTPDebug = 4 требуется для отображения информации о низкоуровневом соединении. Был ли PHP единственным, что вы обновили? Если время ожидания соединения истекло, PHPMailer ничего не может сказать, так как другой информации нет. Тайм-ауты обычно связаны с сетевыми проблемами — DNS и брандмауэром. Попробуйте телнет и другие проверки в руководстве.   -  person Synchro    schedule 18.01.2016
comment
@WillyPt Я добавил правку в свой код, используя опубликованное вами предложение, и все еще сталкиваюсь с той же проблемой. Когда скрипт запускается, сайт зависает на некоторое время, а затем истекает время ожидания.   -  person badsyntax    schedule 18.01.2016
comment
Параметр @Synchro SMTPDebug = 4 не действует. Тот же скрипт работал на живом сервере с php5.4 и работает на моем локальном хосте с использованием php5.5. Он не работает на живом сервере, размещенном в стоечном пространстве. живой сервер был обновлен до php5.6. днс и фаервол не изменились   -  person badsyntax    schedule 18.01.2016
comment
@synchro Я видел ваше имя в других темах и на странице github, помогающей другим людям с похожими проблемами. Я пытался решить эту проблему самостоятельно, но ваша помощь очень ценится. Если вы хотите, вы можете увидеть, что именно происходит здесь (ballpointmachinist.com/contact.php). Вы можете попробовать это сами, чтобы увидеть, когда истечет время ожидания.   -  person badsyntax    schedule 18.01.2016
comment
Так что используйте тесты в руководстве, чтобы сузить проблему - внесение изменений ssl в ответ на проблему тайм-аута нелогично. ДНС работает? Можешь телнет? Ничего не предполагайте, проверяйте.   -  person Synchro    schedule 18.01.2016
comment
@syncro Прочитав о dns и telnet, я смог подключиться к smtp-серверу через telnet и получил его обратно (220BY2PR11CA0059.outlook.office365.com Служба Microsoft ESMTP MAIL готова в понедельник, январь 2016 г., 21:13:36 +0000). Не могу установить dnsutils. Есть ли еще один способ проверить, работает ли DNS?   -  person badsyntax    schedule 19.01.2016
comment
Вы не смогли бы подключиться к именованному хосту через telnet, если бы ваш DNS не работал. Очень странно, что вы можете подключиться туда через telnet, но при этом вообще не получить вывод отладки, делая то же самое из PHPMailer.   -  person Synchro    schedule 20.01.2016
comment
Если я переключу сайт обратно на php5.4, он будет работать с office365. С php5.6 и office365 я получаю тайм-ауты. Использование gmail и php5.6 работает. Очень запутанно   -  person badsyntax    schedule 20.01.2016


Ответы (2)


Не знаю, считается ли это ответом, но мне удалось заставить это работать с gmail. точно такой же код, просто используйте учетные данные gmail и хост smtp вместо office365. Мне пришлось настроить Gmail, чтобы разрешить менее безопасные приложения.

person badsyntax    schedule 19.01.2016

Проблема связана с PHP5.6 и проверкой самоподписанного сертификата. В PHP5.6 проверка сертификата включена по умолчанию, и сертификат не может быть самоподписанным.

Правильным решением для этого является замена недействительного, неправильно настроенного или самозаверяющего сертификата на хороший.

Или настройте его для использования несамоподписанного сертификата:

$mail->SMTPOptions = array(
'ssl' => array(
    'verify_peer' => false,
    'verify_peer_name' => false,
    'allow_self_signed' => true
    )
);

Вы также можете изменить эти настройки глобально в файле php.ini, но это очень плохая идея; PHP 5.6 сделал это изменение по очень веским причинам.

Иногда это поведение не столь очевидно; иногда сбои шифрования могут появляться, когда клиент выдает QUIT сразу после попытки выполнить STARTTLS. Если вы видите, что это происходит, вам следует проверить состояние ваших сертификатов или настроек проверки.

person Michael Fever    schedule 30.11.2016
comment
К сожалению, теперь я вижу, что у вас был этот код. Это решило бы это для большинства людей, у которых есть проблема. - person Michael Fever; 01.12.2016