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:
- El error está siendo lanzado por PEAR smtp aquí
- Que falla cuando llama a Net_SMTP::connect()
- que es un contenedor alrededor de Net_Socket::connect()
- que es más bien elaborada envoltura alrededor de php.net/manual/en/function.fsockopen.php
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.
Confirme la conectividad del sistema con internet: abra el terminal cmd y escriba
ping smtp.gmail.com
Confirmar firewall: Ingrese lo siguiente en cmd terminal
telnet smtp.gmail.com 465
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''; }
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'',
La sección "Use el servidor SMTP de Gmail" de esta guía dice que necesita habilitar "Aplicaciones menos seguras" .
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.