2010-09-01 8 views
14

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

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'); 

Любые идеи?

ответ

25

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

SMTP Error: Could not authenticate.

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

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

$mail->SMTPSecure = 'tls'; 

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

$mail->SMTPSecure = 'ssl'; 

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

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

Возможно, this example может помочь (GMail secure SMTP).

+0

Это действительно помогло, я не понимаю, что я нужен префикс ssl, если поставщик SMTP этого не указывает. Спасибо. – cypher

+1

вы также можете указать ваше имя хоста протоколом (т. Е. '$ Mail-> Host =" tls: // ".SMTP_SERVER;') И использовать 'port 465' –

4

Попробуйте отправить электронное письмо через этот 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'); 
+1

Да PHPMailer поддерживает SSL (TLS) SMTP. – AlexV

2

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

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

Надеется, что это помогает!

+0

почему голос? – Mikey1980

1

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

0

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

, что характерно в попытке подключиться к услуге SSL с клиентом, который не использует SSL

SMTP Error: Could not authenticate.

не сюрприз там, не сумев запустить SMTP разговор authentigation это не вариант ,.

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

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

0

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

2

попробовать порт 25 вместо 456.

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

0

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

работает с gmail.com с Authenticate:

<?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; 
} 
Смежные вопросы