php sockets email ssl pear

php - PEAR Mail no pudo conectarse a Gmail SMTP, no pudo conectarse al socket



sockets email (8)

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 errores relacionados con ssl.

Aquí está el código

require_once "Mail.php"; $from = ''<[email protected]>''; $to = ''<[email protected]>''; $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(''<p>'' . $mail->getMessage() . ''</p>''); } else { echo(''<p>Message successfully sent!</p>''); }

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 este problema. 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 simplemente "fsockopen (): la operación SSL falló con el código 1". de la primera advertencia.

Termina here Cambié el puerto de correo de la AVG, como la respuesta. el código de symcbean se ejecuta sin errores, pero mi código respondió con un 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 code: 534, response: 5.7.14 here , seguí las instrucciones de la primera respuesta de emgh3i, habilité conexiones menos seguras y permití el acceso a mi cuenta de Google

Y está funcionando perfectamente ahora.


Tu codigo es correcto

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

Compruebe su conexión de zócalo

<?php error_reporting(E_ALL); var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr)); var_dump($errno); var_dump($errstr);

recurso (4) de tipo (flujo)

int (0)

cadena (0) ""


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

1) SMTP no es muy seguro, por lo que Google puede estar rechazando su solicitud. Tuve este problema hace 6 meses y la solución estaba habilitando aplicaciones inseguras en ''myaccount.google.com''

2) Si eso no funciona para usted, entonces puede considerar cambiar de protocolo.

desde

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

a

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


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

Been está haciendo su trabajo por usted, ya que la persona que publica la pregunta debe crear un ejemplo Mínimo, Completo y Verificable.

Esperamos que esto 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 como parece que está usando una computadora de escritorio, creo que ya lo habrá notado)
  • el código se ejecuta dentro de un recinto de seguridad (pero MSWindows realmente no tiene esas 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, podría considerar esta implementación más elaborada de un script de prueba:

<?php error_reporting(E_ALL); print "DNS/n"; var_dump(getmxrr(''gmail.com'',$result)); var_dump($result); $use_ip=gethostbyname($result[0]); print "IPV4 address = $use_ip/n"; print "/nIf you''ve got this far without errors then problem is with your SSL config/n"; $calocns=openssl_get_cert_locations(); if (count($calocns)) { print "Check you''ve got your cacerts deployed in one of the following locations/n"; foreach ($calocns as $k=>$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 que 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 dar una respuesta definitiva sobre cuál es el problema, pero supongo que no ha configurado openSSL .


Cuando algo falla y no sabemos la causa, tenemos que hacer la depuración. Así que aquí, en lugar de poner una respuesta, le solicito que ejecute algunas pruebas.

  1. Confirme la conectividad del sistema con internet: abra el terminal cmd y escriba

    ping smtp.gmail.com

  2. Confirmar firewall: Ingrese lo siguiente en cmd terminal

    telnet smtp.gmail.com 465

  3. confirme la configuración de php: ingrese php -a en el terminal cmd y en el comando php ejecute (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: nuevamente en cmd y php prompt php -a ejecute su propio código (como 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, el consejo dado por otros sobre "aplicaciones menos seguras", que deben activarse cuando inicie sesión en su cuenta de Google Gmail, resolvió todos mis problemas.

En PHP 7.2 tuve que hacer más: configurando ''auth'' en PLAIN y luego agregue "verify_peer" y Verify_peer_name para ssl socket_options como esto:

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


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

Cambio

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

a

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



Pocos pasos de depuración:

1. comprobar phpinfo

Recomiendo verificar phpinfo() para verificar si todos los módulos están habilitados. Compruebe si hay correo, fsocketopen.

2. Habilitar bandera de depuración

Habilitar 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 siguiente respuesta. El tema puede ser diferente al tuyo. Pero la depuración me ayudó. Como tengo 2FA habilitado, me dio error. Y también recibí un correo, que mi acceso 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.