Подтвердить что ты не робот

Отправка электронной почты через 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', '[email protected]');
define('SMTP_PASSWORD', '***CENSORED***');

define('MAIL_ORDERS_ADDRESS', '[email protected]');
define('MAIL_ORDERS_NAME', 'My Name');

Любые идеи?

4b9b3361

Ответ 1

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

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

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

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

$mail->SMTPSecure = 'tls';

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

$mail->SMTPSecure = 'ssl';

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

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

Возможно, этот пример может помочь (GMail secure SMTP).

Ответ 2

Попробуйте отправить электронное письмо через этот 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, кажется, говорит: "Отправка почты SMTP: безопасное соединение SSL, порт: 465".)

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

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

в это:

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

Ответ 3

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

Чтобы проверить использование phpinfo()

Надеюсь, что это поможет!

Ответ 4

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

Ответ 5

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

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

Ответ 6

SMTP → FROM SERVER:
SMTP → ОТ СЕРВЕР:
SMTP → ОШИБКА: EHLO не принимается с сервера:

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

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

нет сюрприза, не получив сеанса SMTP аутентификация не является вариантом,

phpmailer не выполняет неявный SSL (например, TLS на подключении, SMTPS) За исключением перезаписи smtp.class.php, чтобы включить поддержку там, он не может делать то, что вы просите.

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

Ответ 7

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

Ответ 8

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

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

<?php
// Login email and password
$login = "[email protected]";
$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: <[email protected]>\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: <[email protected]>\r\n");
        echo fread($socket,8192);

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

        echo fwrite($socket, "Date: ".time()."\r\nTo: <[email protected]>\r\nFrom:<[email protected]\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;
}