Отправка писем через SMTP с помощью PHPMailer - PullRequest
14 голосов
/ 01 сентября 2010

Я пытаюсь отправлять 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 ]

25 голосов
/ 01 сентября 2010

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

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

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

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

$mail->SMTPSecure = 'tls';

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

$mail->SMTPSecure = 'ssl';

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

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

Может быть этот пример может помочь (GMail secure SMTP).

4 голосов
/ 01 сентября 2010

Попробуйте отправить электронное письмо через этот 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; по крайней мере с это . Итак, вам нужно изменить это:

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

в это:

define('SMTP_SERVER', 'ssl://smtp.ebola.cz');
3 голосов
/ 23 июля 2013

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

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

2 голосов
/ 01 сентября 2010

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

Для проверки используйте phpinfo()

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

1 голос
/ 08 июля 2013

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

1 голос
/ 10 июля 2012

SMTP -> ОТ СЕРВЕРА:
SMTP -> ОТ СЕРВЕРА:
SMTP -> ОШИБКА: EHLO не принято с сервера:

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

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

нет ничего удивительного в том, что не удалось начать SMTP-разговор аутентификация не вариант,

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

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

1 голос
/ 30 ноября 2010

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

0 голосов
/ 05 ноября 2017

Простой клиент smtp с сокетом php stream с командой 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;
}
...