Я пытаюсь отправить 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');
Есть идеи?
Насколько я вижу, все правильно с вашим кодом. Ваша ошибка:
Ошибка SMTP: не удалось выполнить проверку подлинности.
Это означает, что учетные данные, которые вы отправляете, отклоняются сервером SMTP. Убедитесь, что хост, порт, имя пользователя и пароль хороши.
Если вы хотите использовать TLS, попробуйте добавить:
$mail->SMTPSecure = 'tls';
Если вы хотите использовать SSL, попробуйте добавить:
$mail->SMTPSecure = 'ssl';
Имейте в виду, что:
Может быть, этот пример может помочь (GMail secure SMTP).
Попробуйте отправить электронное письмо через этот SMTP-сервер вручную / из интерактивной почтовой программы (например, Mozilla Thunderbird). Из ошибок кажется, что сервер не примет ваши учетные данные. Этот SMTP работает на порту, или это SSL + SMTP? Вы, кажется, не используете безопасное соединение в коде, который вы опубликовали, и я не уверен, что PHPMailer фактически поддерживает SSL + SMTP.
(Первый результат поиска вашего имени хоста вашего SMTP-сервера: http://podpora.a.beola.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');
Это может показаться выстрелом в темноте, но убедитесь, что PHP соблюден OpenSSL, если SMTP требует SSL.
Чтобы проверить использование phpinfo()
Надеюсь, поможет!
Да, вам нужно, чтобы OpenSSL работал правильно. Мой сайт резервного копирования работал, мой живой сервер не сделал этого. Разница? На сервере Live не было OpenSSL в конфигурации PHP.
попробуйте порт 25 вместо 456.
Я получил ту же ошибку при использовании порта 456, и сменил его на 25, работая для меня.
SMTP -> FROM SERVER:
SMTP -> FROM SERVER:
SMTP -> ОШИБКА: EHLO не принимается с сервера:
это типично для попытки подключения к службе SSL с клиентом, который не использует SSL
Ошибка SMTP: не удалось выполнить проверку подлинности.
отсутствие сюрприза там, где не удалось запустить аутентификацию SMTP, не является вариантом.
phpmailer не делает неявного SSL (aka TLS при подключении, SMTPS). За исключением перезаписи smtp.class.php, чтобы включить поддержку для него, он не может делать то, что вы просите.
Используйте порт 587 с явным SSL (иначе TLS, STARTTLS).
У меня была очень похожая проблема для чего-то вроде часа, пока я не понял, что пошло не так. Моя проблема была в том, что я использовал SSL , а не ssl . В коде используется регистр, чувствительный к регистру . AlexV направил меня к источнику проблемы. То, что helo / ehlo-stuff кажется неуместным.
Простой smtp-клиент с php-потоковым соком с командой tts / 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; }