2010-09-01 37 views
14

Estoy tratando de enviar correos electrónicos SMTP utilizando PHPMailer, pero sigo recibiendo este mensaje de error, ¿alguna idea de cómo deshacerse de él?
Estoy tratando de conectar a través de SSL en el puerto 465.Envío de correos electrónicos a través de SMTP con 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. 

Mi código:

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(); 
     } 

Constantes definición:

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

¿Alguna idea?

Respuesta

25

Por lo que puedo ver, todo está bien con su código. Su error es:

SMTP Error: Could not authenticate.

Lo que significa que las credenciales que ha enviado son rechazadas por el servidor SMTP. Asegúrese de que el host, el puerto, el nombre de usuario y la contraseña sean buenos.

Si desea utilizar TLS, trate de añadir:

$mail->SMTPSecure = 'tls'; 

Si desea utilizar SSL, trate de añadir:

$mail->SMTPSecure = 'ssl'; 

Tenga en cuenta que:

  • Algunos Los servidores SMTP pueden prohibir las conexiones de "personas externas".
  • Algunos servidores SMTP no admiten conexiones SSL (o TLS).

Tal vez this example puede ayudar (GMail secure SMTP).

+0

En realidad, esto ayudó, no me daba cuenta de que yo necesita el prefijo 'ssl' si el proveedor SMTP no lo especifica. Gracias. – cypher

+1

también podría prefijar su nombre de host con el protocolo (es decir, '$ mail-> Host =" tls: // ".SMTP_SERVER;') Y usar 'puerto 465' –

4

Intente enviar un correo electrónico a través de ese servidor SMTP manualmente/desde un programa de correo electrónico interactivo (por ejemplo, Mozilla Thunderbird). A partir de los errores, parece que el servidor no aceptará sus credenciales. ¿Se está ejecutando SMTP en el puerto o es SSL + SMTP? Parece que no estás utilizando una conexión segura en el código que has publicado, y no estoy seguro de si PHPMailer realmente admite SSL + SMTP.

(Primera resultado de googlear el nombre de host del servidor SMTP: http://podpora.ebola.cz/idx.php/0/006/article/Strucny-technicky-popis-nastaveni-sluzeb.html parece decir "SMTPs el envío de correo: conexión segura SSL, el puerto: 465".)

Parece que PHPMailer es compatible con SSL; al menos desde this. Por lo tanto, tendrá que cambiar esta situación:

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

en esto:

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

Sí PHPMailer admite SSL (TLS) SMTP. – AlexV

2

Esto puede parecer como un tiro en la oscuridad pero asegúrese de PHP se ha cumplido con OpenSSL si SMTP requiere SSL.

Para comprobar el uso phpinfo()

espero que ayude!

+0

¿por qué el voto hacia abajo? – Mikey1980

1

Sí, necesita que OpenSSL funcione correctamente. Mi sitio de prueba de respaldo funcionó, mi servidor en vivo no. ¿Diferencia?El servidor en vivo no tenía OpenSSL dentro de la configuración de PHP.

0

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

eso es típico de intentar conectarse a un servicio SSL con un cliente que no está utilizando SSL

SMTP Error: Could not authenticate.

ninguna sorpresa no haber podido iniciar una conversación SMTP authentigation no es una opción ,.

phpmailer no realiza SSL implícitamente (también conocido como TLS on connect, SMTPS) En lugar de reescribir smtp.class.php para incluir soporte allí, no hay forma de hacer lo que usted pide.

Use el puerto 587 con SSL explícito (también conocido como TLS, STARTTLS).

0

Tuve un problema muy similar durante algo así como una hora, hasta que descubrí lo que salió mal. Mi problema fue que utilicé SSL, en lugar de ssl. Verificar es sensible a mayúsculas en el código. AlexV me guió a la fuente del problema. Ese helo/ehlo-material parece irrelevante.

2

puerto de prueba 25 en lugar de 456.

me dieron el mismo error al utilizar el puerto 456, y cambiándolo a 25 trabajado para mí.

0

cliente SMTP simple con toma de corriente php con el comando TLS/SSL SMTP STARTTLS: https://github.com/breakermind/PhpMimeParser/blob/master/PhpSmtpSslSocketClient.php

obras con gmail.com con autenticar:

<?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; 
} 
Cuestiones relacionadas