Отправка писем через SMTP с помощью PHPMailer

Я пытаюсь отправить SMTP-письма с помощью PHPMailer, но я продолжаю получать это сообщение об ошибке, любые идеи, как избавиться от него?
Я пытаюсь подключиться через SSL порт 465.

SMTP -> FROM SERVER: 
SMTP -> FROM SERVER: 
SMTP -> ERROR: EHLO not accepted from server: 

Notice: fputs() [function.fputs]: send of 18 bytes failed with errno=32 Roura přerušena (SIGPIPE) in /home/www/amazonek.cz/subdomains/library/PHPMailer_v5.1/class.smtp.php on line 494
SMTP -> FROM SERVER: 
SMTP -> ERROR: HELO not accepted from server: 

Notice: fputs() [function.fputs]: send of 12 bytes failed with errno=32 Roura přerušena (SIGPIPE) in /home/www/amazonek.cz/subdomains/library/PHPMailer_v5.1/class.smtp.php on line 212
SMTP -> ERROR: AUTH not accepted from server: 
SMTP Error: Could not authenticate.

мой код:

  require_once('../library/PHPMailer_v5.1/class.phpmailer.php');

        try{
            $mail = new PHPMailer(true);
            $mail->IsSMTP();
            $mail->SMTPAuth = true;
            $mail->Host = SMTP_SERVER;
            $mail->Port = SMTP_PORT;
            $mail->Username = SMTP_USERNAME;
            $mail->Password = SMTP_PASSWORD;
            $mail->SMTPDebug = 2;
            $mail->SetFrom(MAIL_ORDERS_ADDRESS, MAIL_ORDERS_NAME);
            $mail->Subject = 'AMAZONEK.cz - objednávka číslo '.$_SESSION['orderId'];
            $mail->MsgHTML('<b>Ahoj</b>');
            $mail->AddAddress($_SESSION['user']['email'], $_SESSION['user']['name'].' '.$_SESSION['user']['surname']);
            $mail->AddBCC(MAIL_ORDERS_ADDRESS, MAIL_ORDERS_NAME);

            if(!$mail->Send()) throw new Exception($mail->ErrorInfo);
        }
        catch(Exception $e){
            echo $e->getMessage();
        }

константы определение:

define('SMTP_SERVER', 'smtp.ebola.cz');
define('SMTP_PORT', 465);
define('SMTP_USERNAME', 'myEmail@myDomain.tld');
define('SMTP_PASSWORD', '***CENSORED***');

define('MAIL_ORDERS_ADDRESS', 'myEmail@myDomain.tld');
define('MAIL_ORDERS_NAME', 'My Name');

какие идеи?

8 ответов


насколько я вижу, все в порядке с вашим кодом. Ваша ошибка:

ошибка SMTP: не удалось выполнить аутентификацию.

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

Если вы хотите использовать TLS, попробуйте добавить:

$mail->SMTPSecure = 'tls';

Если вы хотите использовать SSL, попробуйте добавить:

$mail->SMTPSecure = 'ssl';

имейте в виду что:

  • некоторые SMTP-серверы могут запретить подключения от "посторонних".
  • некоторые SMTP-серверы не поддерживают соединения SSL (или TLS).

может быть может помочь (Gmail secure SMTP).


попробуйте отправить электронное письмо через этот SMTP-сервер вручную / из интерактивного почтовика (например, Mozilla Thunderbird). Из-за ошибок кажется, что сервер не примет ваши учетные данные. Это SMTP работает на порту, или это SSL+SMTP? Вы, похоже, не используете безопасное соединение в коде, который вы опубликовали, и я не уверен, что PHPMailer действительно поддерживает SSL+SMTP.

(первый результат поиска имени хоста SMTP-сервера: http://podpora.ebola.cz/idx.php/0/006/article/Strucny-technicky-popis-nastaveni-sluzeb.html кажется, что "отправка почты SMTPs: безопасное SSL-соединение, порт: 465". )

похоже, что PHPMailer поддерживает SSL; по крайней мере, от этой. Итак, вам нужно будет изменить это:

define('SMTP_SERVER', 'smtp.ebola.cz');

в:

define('SMTP_SERVER', 'ssl://smtp.ebola.cz');

Это может показаться выстрел в темноте но убедитесь, что PHP был соблюден OpenSSL, если SMTP требует SSL.

для проверки использования phpinfo()

надеюсь, что это помогает!


попробуйте порт 25 вместо 456.

Я получил ту же ошибку при использовании порта 456, и изменение его на 25 работало для меня.


да, вам нужно OpenSSL для правильной работы. Мой сайт резервного копирования работал, мой живой сервер-нет. Разница? Live server не имел OpenSSL в конфигурации PHP.


У меня была очень похожая проблема в течение примерно часа, пока я не понял, что пошло не так. Моя проблема была в том, что я использовал протокол SSL, вместо протокол SSL. Проверка регистр в коде. AlexV привел меня к источнику проблемы. Это helo / ehlo-материал кажется неуместным.


SMTP - > ОТ СЕРВЕРА:
SMTP - > ОТ СЕРВЕРА:
SMTP - > ошибка: EHLO не принимается с сервера:

это типично для попытки подключения к службе SSL с клиентом, который не использует SSL

ошибка SMTP: не удалось выполнить проверку подлинности.

Не удивительно, что не удалось запустить SMTP-разговор authentigation не является вариантом.

phpmailer не делает неявный SSL (он же TLS on подключения, протокола smtps) Не хватает перезаписи smtp.класс.php включить поддержку для него там это не способ сделать то, что вы просите.

вместо этого используйте порт 587 с явным SSL (aka TLS, STARTTLS).


простой SMTP-клиент с PHP-потоковым сокетом с командой TLS / ssl smtp STARTTLS: https://github.com/breakermind/PhpMimeParser/blob/master/PhpSmtpSslSocketClient.php

работает с gmail.com с аутентификацией:

<?php
// Login email and password
$login = "your-email@cool.xx";
$pass = "123456";

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
stream_context_set_option($ctx, 'ssl', 'verify_peer_name', false);
try{
    // echo $socket = stream_socket_client('ssl://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    echo $socket = stream_socket_client('tcp://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    if (!$socket) {
        print "Failed to connect $err $errstr\n";
        return;
    }else{
        // Http
        // fwrite($socket, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
        // Smtp
        echo fread($socket,8192);
        echo fwrite($socket, "EHLO cool.xx\r\n");
        echo fread($socket,8192);

        // Start tls connection
        echo fwrite($socket, "STARTTLS\r\n");
        echo fread($socket,8192);

        echo stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);

        // Send ehlo
        echo fwrite($socket, "EHLO cool.xx\r\n");
        echo fread($socket,8192);

        // echo fwrite($socket, "MAIL FROM: <hello@cool.com>\r\n");
        // echo fread($socket,8192);

        echo fwrite($socket, "AUTH LOGIN\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, base64_encode($login)."\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, base64_encode($pass)."\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "rcpt to: <to-email@boome.com>\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "DATA\n");
        echo fread($socket,8192);

        echo fwrite($socket, "Date: ".time()."\r\nTo: <to-email@boome.com>\r\nFrom:<zour-email@cool.xx\r\nSubject:Hello from php socket tls\r\n.\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "QUIT \n");
        echo fread($socket,8192);

        /* Turn off encryption for the rest */
        // stream_socket_enable_crypto($fp, false);

        fclose($socket);
    }
}catch(Exception $e){
    echo $e;
}