Puedo usar PHPMailer, junto con Apache y PHP, a nivel local.
Cuando pruebo mi SSL config y mi cacerts puedo obtener

default_cert_file = C:\Program Files\Common Files\SSL/cert.pem
default_cert_file_env = SSL_CERT_FILE
default_cert_dir = C:\Program Files\Common Files\SSL/certs
default_cert_dir_env = SSL_CERT_DIR
default_private_dir = C:\Program Files\Common Files\SSL/private
default_default_cert_area = C:\Program Files\Common Files\SSL
ini_cafile = 
ini_capath = 

yo no

 var_dump(fsockopen("smtp.gmail.com", 465, $errno, $errstr, 3.0));
 var_dump($errno);
 var_dump($errstr);

y tengo

fsockopen resource(2) of type (stream) int(0) string(0) "" 

En mi php.ini he curl.cainfo = C:/php/cacert.pem en el curl parte y funciona.

Pero cuando trato de usar PHPMailer para enviar un correo desde localhost, sigo recibiendo

SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed 
Failed to enable crypto
unable to connect to ssl://smtp.gmail.com:465 (Unknown error)

También fui a la cuenta que se utiliza en el SMTP, en https://accounts.google.com/DisplayUnlockCaptcha y activarlo. Y a https://myaccount.google.com/lesssecureapps?pli=1 y habilitado menos segura de aplicaciones.
Supongo que esto es un error de SSL y no un PHPMailer. Francamente, estoy confundido no sé cómo solucionarlo. Disculpe mi ignorancia, cualquier ayuda por qué está mal y cómo solucionarlo , sería genial.

PS, esta mi archivo php que envía el correo. Gracias

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;    
require 'C:/php/PHPMailer/src/Exception.php';
require 'C:/php/PHPMailer/src/PHPMailer.php';
require 'C:/php/PHPMailer/src/SMTP.php';

$mail = new PHPMailer(true);                             
try {

    $mail->SMTPDebug = 3;
    $mail->isSMTP();                                      
    $mail->Host = 'smtp.gmail.com'; 
    $mail->SMTPAuth = true;                               
    $mail->Username = '[email protected]';                 
    $mail->Password = 'secret';                           
    $mail->SMTPSecure = 'ssl';                            
    $mail->Port = 465;                                    

    //Recipients
    $mail->setFrom('[email protected]');
    $mail->addAddress('[email protected]');     


    //Content
    $mail->isHTML(true);                                 
    $mail->Subject = 'subject';
    $mail->Body    = 'HTML message body <b>in bold!</b>';
    $mail->AltBody = 'body in plain text';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
}            
?>

Actualización

Cuando trato con $mail->SMTPSecure = 'ssl'; y $mail->Port = 465; puedo obtener

2017-10-01 13:04:25 Connection: opening to ssl://smtp.gmail.com:465, timeout=300, options=array()
2017-10-01 13:04:26 Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed [C:\php\PHPMailer\src\SMTP.php line 324]
2017-10-01 13:04:26 Connection failed. Error #2: stream_socket_client(): Failed to enable crypto [C:\php\PHPMailer\src\SMTP.php line 324]
2017-10-01 13:04:26 Connection failed. Error #2: stream_socket_client(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) [C:\php\PHPMailer\src\SMTP.php line 324]
2017-10-01 13:04:26 SMTP ERROR: Failed to connect to server: (0)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
Message could not be sent.Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

Cuando trato con $mail->SMTPSecure = 'tls'; y $mail->Port = 587; puedo obtener

2017-10-01 13:07:20 Connection: opening to smtp.gmail.com:587, timeout=300, options=array()
2017-10-01 13:07:21 Connection: opened
2017-10-01 13:07:21 SERVER -> CLIENT: 220 smtp.gmail.com ESMTP l4sm5217189wrb.74 - gsmtp
2017-10-01 13:07:21 CLIENT -> SERVER: EHLO localhost
2017-10-01 13:07:21 SERVER -> CLIENT: 250-smtp.gmail.com at your service, [85.75.196.114]250-SIZE 35882577250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250 SMTPUTF8
2017-10-01 13:07:21 CLIENT -> SERVER: STARTTLS
2017-10-01 13:07:21 SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
2017-10-01 13:07:21 Connection failed. Error #2: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed [C:\php\PHPMailer\src\SMTP.php line 403]
SMTP Error: Could not connect to SMTP host.
2017-10-01 13:07:21 CLIENT -> SERVER: QUIT
2017-10-01 13:07:21 SERVER -> CLIENT: 
2017-10-01 13:07:21 SMTP ERROR: QUIT command failed: 
2017-10-01 13:07:21 Connection: closed
SMTP Error: Could not connect to SMTP host.
Message could not be sent.Mailer Error: SMTP Error: Could not connect to SMTP host.
  • fsockopen sólo abre una conexión TCP, no hacer un enlace TLS, por lo que no nos dice nada. El uso de SMTPSecure = 'tls' y el puerto 587 puede mostrar más información en la salida de depuración.
  • Hice lo que dijiste y ahora me sale Error #2: stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed y, a continuación,SMTP Error: Could not connect to SMTP host.. Soy un principiante. Lo que me confunde es que mi SSL de configuración y de certificados de parecer bien, y sin embargo todavía me dan errores. Tal vez puedo actualizar mi certs? Gracias.
  • Mostrar lo que es en su salida de depuración, no sólo el último mensaje de error.
  • Comprobar la actualización de la pregunta.
  • OK, que al menos muestra que no estás siendo redirigido a otra parte. Sugiero el uso de openssl (como se describe en la guía de solución de problemas) para comprobar que los certificados de CA archivo está trabajando Google no será la publicación de un inválido cert.
  • Así que lo siento, que no puedo ayudarle a usted y a mí. No sé cómo hacer esto. O qué parte de la guía comprueba en realidad los certs. echo (extension_loaded('openssl')?'SSL loaded':'SSL not loaded')."\n"; ecos SSL loaded. Escrito openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587 en el cmd (windows 10) da 'openssl' is not recognized as an internal or external command, operable program or batch file. por Cierto, estoy buscando en esta guía https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting.
  • Ah, no sé cómo se debe instalar openssl en windows. La búsqueda de ese, o lo que es equivalente.
  • No sé si esto hace la diferencia, pero el código funcionó por cerca de 50 veces el uso de SMTPSecure = 'ssl' y $mail->Port = 465. Enviar unos 50 e-mails. Y, a continuación, sólo se detuvo de nuevo, mostrando dichos errores. Hacer openssl certificaciones tienen un límite de uso? O se trata de un azar, accidente feliz?
  • No, No uso el límite, pero Gmail no tiene que enviar límite de volumen. No estoy seguro de cómo lo que se manifiesta, aunque.
  • A continuación, de nuevo, supongo que si el error fue limitar relacionados, Google no permite la conexión. Por lo que el error sería algo así como «conexión cerrada», no «certificate verify failed». Esto me está matando!
  • Has encontrado una solución a este problema en la final? Estoy teniendo el mismo problema en Windows Server 2016 con PHP 7.0.25; enviado al menos 200 mensajes de correo electrónico en esta configuración y de repente dejó de funcionar. Por el camino, otros servidores SMTP (con TLS) están trabajando bien, es sólo smtp.gmail.com lo que no funciona. Tan extraño…

InformationsquelleAutor slevin | 2017-10-01

2 Comentarios

  1. 4

    Sólo tenía el mismo mensaje de error, tal vez usted tiene el mismo problema:

    • mi certificado es buena (yo puedo ir a la HTTPS dominio sin ningún problema)
    • no se puede ejecutar la misma solicitud a través de PHP, stream_context_create y stream_socket_client
    • Quiero certificado SSL para ser revisado

    Probar el mismo dominio a través de cURL devuelto:

    curl: (60) SSL certificate problem: certificate is not yet valid

    Resulta que mi máquina virtual en la que he corrido tanto en PHP y cURL tenía 11 días de error (11 de diciembre en lugar de 22 de diciembre).

    Mediante la fijación del equipo/de la máquina virtual fecha (utilizando ntp, ntpdate-debian o similares), el certificado de la prueba se ejecuta ahora bien, en tanto la curvatura de la línea de comandos o PHP.

    • Sí, este fue el problema, para mí ahora mismo. Este problema con Homestead me vuelve loco cada día: github.com/laravel/homestead/issues/799 Generalmente el síntoma es algo diferente. Yo no hubiera tenido este error en particular antes, pero tienes razón que la sincronización del reloj de arreglar.
  2. 0

    He encontrado esto en un nuevo servidor de Windows IIS recientemente. El cURL de llamar a mi propio dominio desde un archivo de comandos por lotes, ambos de los cuales se ejecutan en el mismo servidor.

    Había agregado

    127.0.0.1  mydomain.com

    el archivo hosts, y me había olvidado de quitar cuando he cambiado el DNS público.

    El servidor está detrás de Cloudflare, así que mi rizo fue conseguir un CF certificado de origen y no el real de un certificado servido por Cloudflare.

    La eliminación de la entrada de los ejércitos ha resuelto el problema.

Dejar respuesta

Please enter your comment!
Please enter your name here