PEAR Mail no se puede conectar a Gmail SMTP, no se pudo conectar al socket

Hechos

Estoy usando PEAR Mail, quiero usar gmail SMTP para enviar un correo. Tengo Apache / 2.4.27 (Win64) PHP / 7.2.0beta3, PEAR 1.10.15, Mail 1.4.1, Net_SMTP 1.8.0, Net_Socket 1.2.2.

Fui a php.ini y agregué extension = php_openssl.dll . El error.log no da ningún error relacionado con ssl.

Aquí está el código

 require_once "Mail.php"; $from = ''; $to = ''; $subject = 'Hi!'; $body = "Hi,\n\nHow are you?"; $headers = array( 'From' => $from, 'To' => $to, 'Subject' => $subject ); $smtp = Mail::factory('smtp', array( 'host' => 'ssl://smtp.gmail.com', 'port' => '465', 'auth' => true, 'username' => '[email protected]', 'password' => 'mypassword' )); $mail = $smtp->send($to, $headers, $body); if (PEAR::isError($mail)) { echo('

' . $mail->getMessage() . '

'); } else { echo('

Message successfully sent!

'); }

El problema

Me sale este error

Failed to connect to ssl://smtp.gmail.com:465 [SMTP: Failed to connect socket: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) (code: -1, response: )]

y no tengo ni idea de qué hacer, busqué en Google pero me confundí más.

Por favor, consejos sobre cómo solucionar esto. Gracias

Actualizar

Siguiendo las instrucciones de symcbean obtuve los siguientes resultados:

 bool(true) array(5) { [0]=> string(31) "alt3.gmail-smtp-in.l.google.com" [1]=> string(26) "gmail-smtp-in.l.google.com" [2]=> string(31) "alt4.gmail-smtp-in.l.google.com" [3]=> string(31) "alt1.gmail-smtp-in.l.google.com" [4]=> string(31) "alt2.gmail-smtp-in.l.google.com" } IPV4 address = 64.233.188.27 If you've got this far without errors then problem is with your SSL config Check you've got your cacerts deployed in one of the following locations 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 = If all good so far, then this bit should work.... fsockopen Warning: fsockopen(): SSL operation failed with code 1. OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in C:\Apache24\htdocs\phptest2.php on line 28 Warning: fsockopen(): Failed to enable crypto in C:\Apache24\htdocs\phptest2.php on line 28 Warning: fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) in C:\Apache24\htdocs\phptest2.php on line 28 bool(false) int(0) string(0) "" 

La línea 28 es esta línea var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr, 3.0));

Gracias de nuevo

Actualización # 2

Busqué en Google solo “fsockopen (): la operación SSL falló con el código 1.” de la primera advertencia.

Termina aquí . Cambié el puerto de correo de AVG, como la respuesta. El código de symcbean se ejecutó sin errores, pero mi código respondió con mail error : authentication failure [SMTP: Invalid response code received from server (code: 534, response: 5.7.14 Please log in via your web browser and 5.7.14 then try again. 5.7.14 Learn more at 5.7.14 https://support.google.com/mail/answer/78754 c1sm1243434wre.84 - gsmtp)]

Así que busqué en Google el code: 534, response: 5.7.14 y el final aquí , seguí las instrucciones de la primera respuesta de emgh3i, habilité las conexiones menos seguras y permití el acceso a mi cuenta de google

Y está funcionando perfectamente ahora.

La sección “Usar el servidor SMTP de Gmail” de esta guía indica que debe habilitar “Aplicaciones menos seguras” .

Pocos pasos de depuración:

1. verificar phpinfo

Recomiendo comprobar phpinfo() para comprobar si todos los módulos están habilitados. Buscar correo, fsocketopen.

2. Habilitar indicador de depuración

Habilite el indicador de debug para verificar exactamente cuál es el problema. Como abajo.

 $smtp = Mail::factory('smtp', array( 'host' => 'ssl://smtp.gmail.com', 'port' => '465', 'auth' => true, 'debug' => true, 'pipelining' => true, 'username' => '[email protected]', 'password' => 'xxx' )); 

Después de ejecutar el código anterior en mi máquina, obtuve la respuesta de seguimiento. El problema puede ser diferente al tuyo. Pero la depuración me ayudó. Como tengo 2FA habilitado, me dio error. Y también recibí un correo electrónico, que mi inicio de sesión ha sido bloqueado.

 DEBUG: Recv: 220 smtp.gmail.com ESMTP s65sm4891344pfi.36 - gsmtp DEBUG: Send: EHLO localhost DEBUG: Recv: 250-smtp.gmail.com at your service, [110.227.210.84] DEBUG: Recv: 250-SIZE 35882577 DEBUG: Recv: 250-8BITMIME DEBUG: Recv: 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH DEBUG: Recv: 250-ENHANCEDSTATUSCODES DEBUG: Recv: 250-PIPELINING DEBUG: Recv: 250-CHUNKING DEBUG: Recv: 250 SMTPUTF8 DEBUG: Send: AUTH LOGIN DEBUG: Recv: 334 VsadfSFcm5hbWU6 DEBUG: Send: cGF0ZWwuZ29wYhkafdaASFnbWFpbC5jb20= DEBUG: Recv: 334 UGFzc3dvcmQ6 DEBUG: Send: OWwzMy5zaHlAbTE4 DEBUG: Recv: 534-5.7.14 Please log in via your web browser and DEBUG: Recv: 534-5.7.14 then try again. DEBUG: Recv: 534-5.7.14 Learn more at DEBUG: Recv: 534 5.7.14 https://support.google.com/mail/answer/78754 s65sm4891344pfi.36 - gsmtp DEBUG: Send: RSET DEBUG: Send: QUIT DEBUG: Recv: 250 2.1.5 Flushed s65sm4891344pfi.36 - gsmtp DEBUG: Recv: 221 2.0.0 closing connection s65sm4891344pfi.36 - gsmtp authentication failure [SMTP: Invalid response code received from server (code: 534, response: 5.7.14 Please log in via your web browser and 5.7.14 then try again. 5.7.14 Learn more at 5.7.14 https://support.google.com/mail/answer/78754 s65sm4891344pfi.36 - gsmtp)] 

Actualizar:

Su problema parece que PHP ni siquiera puede conectarse al servidor de Gmail.

Su configuración de host no debe contener el protocolo. La razón por la que está fallando es porque probablemente esté intentando realizar una búsqueda de DNS en ssl://smtp.gmail.com y fallar.

Cambio

 'host' => 'ssl://smtp.gmail.com', 

a

 'host' => 'smtp.gmail.com', 

Tu código es correcto

Traté de probar mi cuenta de gmail. El envío de correo fue exitoso.

Verifique su conexión de socket

  

recurso (4) de tipo (secuencia)

int (0)

cadena (0) ""

Been Kyung-yoong es la única persona que ha hecho una contribución significativa para resolver el problema hasta ahora (¡+1 estado!). Puedo confirmar su resultado. Y yo recomendaría que intentes lo mismo. Actualmente intenta depurar una stack bastante compleja de componentes:

  • El error está siendo arrojado por PEAR smtp aquí
  • Que falla cuando llama a Net_SMTP :: connect ()
  • que es un contenedor alrededor de Net_Socket :: connect ()
  • que es una envoltura bastante elaborada alrededor de fsockopen ()

Been está haciendo su trabajo por usted, como la persona que publica la pregunta, debería crear un ejemplo mínimo, completo y verificable

Es de esperar que también proporcione información de diagnóstico más significativa.

Las razones más probables para que esto falle son:

  • el host en el que está ejecutando esto no puede enrutar las conexiones salientes a Internet (pero dado que parece que está usando una PC de escritorio, creo que ya lo habrá notado)
  • el código se ejecuta dentro de un entorno limitado de seguridad (pero MSWindows realmente no tiene tales cosas)
  • el host no puede resolver el nombre de host (consulte el primer punto sobre el enrutamiento)
  • el host puede conectarse pero no puede verificar el certificado

Por lo tanto, puede considerar esta implementación más elaborada de un script de prueba:

  $v) print "$k = $v\n"; } else { print "You've not configured your openssl installation on this host\n"; } print "\nIf all good so far, then this bit should work....\n"; print "fsockopen\n"; var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr, 3.0)); var_dump($errno); var_dump($errstr); 

Lo cual debería darte una respuesta como esta:

  DNS bool(true) array(5) { [0]=> string(31) "alt1.gmail-smtp-in.l.google.com" [1]=> string(31) "alt2.gmail-smtp-in.l.google.com" [2]=> string(31) "alt4.gmail-smtp-in.l.google.com" [3]=> string(26) "gmail-smtp-in.l.google.com" [4]=> string(31) "alt3.gmail-smtp-in.l.google.com" } IPV4 address = 74.125.131.26 If you've got this far without errors then problem is with your SSL config Check you've got your cacerts deployed in one of the following locations default_cert_file = /usr/lib/ssl/cert.pem default_cert_file_env = SSL_CERT_FILE default_cert_dir = /usr/lib/ssl/certs default_cert_dir_env = SSL_CERT_DIR default_private_dir = /usr/lib/ssl/private default_default_cert_area = /usr/lib/ssl ini_cafile = ini_capath = If all good so far, then this bit should work.... fsockopen resource(4) of type (stream) int(0) string(0) "" 

Dado que no podemos replicar su error, no podemos darle una respuesta definitiva sobre cuál es el problema, pero supongo que no ha configurado OpenSSL .

Antes de comenzar, permítanme prolocar que existen muchas soluciones y resultados posibles entre su servidor y el servidor de Google, por lo que pueden funcionar o no para diferentes personas.

1) SMTP no es muy seguro, por lo que Google puede rechazar su solicitud. Tuve este problema hace 6 meses y la solución fue habilitar aplicaciones inseguras en ‘myaccount.google.com’

enter image description here

2) Si eso no funciona para usted, entonces puede considerar cambiar los protocolos.

de

'host' => 'ssl://smtp.gmail.com',

a

'host' => 'tls://smtp.gmail.com:587';

Cuando algo falla y no conocemos la causa, tenemos que hacer una depuración. Así que aquí, en lugar de dar una respuesta, te pido que realices algunas pruebas

  1. confirmar la conectividad del sistema con internet: abra la terminal de cmd y escriba

     ping smtp.gmail.com 
  2. confirmar el firewall: ingrese el siguiente en la terminal del cmd

     telnet smtp.gmail.com 465 
  3. confirme la configuración de php: ingrese php -a en la terminal de cmd y ejecute el prompt php (copie / pegue y luego presione enter) siguiendo el código.

     $result = fsockopen('ssl://smtp.gmail.com', 465, $error_no, $error_message, 5); if ($result === false) { echo "error no: $error_no error message: $error_message"; echo print_r($result, true); } else { echo 'success'; } 
  4. confirme la biblioteca de Pear Mail y el acceso SMTP de Gmail: de nuevo en cmd y php prompt php -a ejecute su propio código (como lo publicó en este hilo)

Y sepamos dónde se rompe y cuál es el error. Solo después de eso podemos ayudar

En PHP 5.3, la sugerencia dada por otros acerca de “aplicaciones menos seguras”, que deben activarse al iniciar sesión en su cuenta de Google Gmail, resolvió todos mis problemas.

En PHP 7.2 tuve que hacer más: configurar ‘auth’ en PLAIN y luego agregar “verify_peer” y verify_peer_name para ssl socket_options como este:

 $mail= Mail::factory('smtp', array('host' => 'ssl://smtp.gmail.com', 'port' => '465', 'auth' => 'PLAIN', 'socket_options' => array('ssl' => array('verify_peer' => false, 'verify_peer_name' => false)), 'username' => '[email protected]', 'password' => 'myPassword' ));