web-dev-qa-db-fra.com

PEAR Mail incapable de se connecter à Gmail SMTP, échec de la connexion au socket

Faits

J'utilise PEAR Mail, je souhaite utiliser gmail SMTP pour envoyer un courrier. J'ai 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.

Je suis allé à php.ini et ajouté extension = php_openssl.dll. Le error.log ne donne aucune erreur liée à ssl.

Voici le code

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

Le problème

Je reçois cette erreur

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: )]

et je ne sais pas quoi faire, j'ai cherché sur Google mais je suis devenu plus confus.

S'il vous plaît des conseils sur la façon de résoudre ce problème. Je vous remercie

Mise à jour

En suivant les instructions de symcbean, j'ai obtenu les résultats suivants:

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 ligne 28 est cette ligne var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr, 3.0));

Merci encore

Mise à jour # 2

J'ai googlé juste "fsockopen (): l'opération SSL a échoué avec le code 1." du premier avertissement.

Finissez ici . J'ai changé le port de messagerie de l'AVG, comme la réponse. Le code de symcbean a fonctionné sans erreur, mais mon code a répondu avec 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)]

Donc, j'ai googlé code: 534, response: 5.7.14 et end-up ici , suivi les instructions de la première réponse de emgh3i, activé les connexions moins sécurisées et autorisé l'accès à mon compte Google

Et ça fonctionne parfaitement maintenant.

16
slevin

La section "Utiliser le serveur SMTP Gmail" de ce guide indique que vous devez activer "Applications moins sécurisées" .

6
Don't Panic

Quelques étapes de débogage:  

1. vérifier phpinfo

Je recommande de vérifier phpinfo() pour vérifier si tous les modules sont activés. Vérifiez le courrier, fsocketopen.

2. Activer le drapeau de débogage

Activez l'indicateur debug pour vérifier quel est le problème. Comme ci-dessous. 

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

Après avoir exécuté le code ci-dessus sur ma machine, je suis suivi réponse. La question peut être différente de la vôtre. Mais le débogage m'a aidé. Comme j'ai 2FA activé, cela m'a donné une erreur. Et j'ai aussi un mail, que mon login a été bloqué. 

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)]

Mettre à jour:

Votre problème semble que PHP ne parvient même pas à se connecter au serveur Gmail.

6
shyammakwana.me

Votre configuration Host ne devrait pas contenir le protocole. La raison pour laquelle il échoue est qu'il tente probablement d'exécuter une recherche DNS sur ssl://smtp.gmail.com et qu'il échoue.

Changement

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

à

'Host' => 'smtp.gmail.com',
6
Adam Lavin

Votre code est correct

J'ai essayé de tester mon compte Gmail. L'envoi du courrier a réussi.

Vérifiez votre connexion de prise

<?php

error_reporting(E_ALL);

var_dump(fsockopen("ssl://smtp.gmail.com", 465, $errno, $errstr));
var_dump($errno);
var_dump($errstr);

ressource (4) de type (flux)

int (0)

chaîne (0) ""

4
Been Kyung-yoon

Avant de commencer, permettez-moi d’indiquer au préalable qu'il existe de nombreuses solutions et résultats entre votre serveur et le serveur Google, de sorte que ces solutions peuvent ou non fonctionner pour différentes personnes.

1) SMTP n'est pas très sécurisé, Google peut donc rejeter votre demande. J'ai eu ce problème il y a 6 mois et la solution permettait des applications non sécurisées sous "myaccount.google.com".

 enter image description here

2) Si cela ne fonctionne pas pour vous, vous pouvez envisager de changer de protocole.

de

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

à

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

2
Aunt Jemima

Been Kyung-yoong est la seule personne à avoir apporté une contribution significative à la résolution du problème jusqu'à présent (+1 Been!). Je peux confirmer son résultat. Et je vous recommanderais d'essayer la même chose. Vous essayez actuellement de déboguer une pile de composants plutôt complexe:

Été fait votre travail pour vous - en tant que personne qui pose la question - devrait créer un exemple minimal, complet et vérifiable

Espérons que cela fournira également des informations de diagnostic plus significatives.

Les raisons les plus probables de cet échec sont les suivantes:

  • l'hôte sur lequel vous utilisez cette application ne peut pas acheminer les connexions sortantes vers Internet (mais comme vous semblez utiliser un ordinateur de bureau, je pense que vous l'avez peut-être déjà remarqué)
  • le code est exécuté dans un sandbox de sécurité (mais MSWindows n'a pas vraiment de telles choses)
  • l'hôte est incapable de résoudre le nom d'hôte (voir le premier point sur le routage)
  • l'hôte peut se connecter mais ne peut pas vérifier le certificat 

Par conséquent, vous pourriez envisager cette implémentation plus élaborée d'un script de test:

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

Ce qui devrait vous donner une réponse comme celle-ci:

 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) ""

Étant donné que nous ne pouvons pas reproduire votre erreur, nous ne pouvons pas donner de réponse définitive au problème, mais je suppose que vous n'avez pas configuré openSSL .

2
symcbean

Lorsque quelque chose échoue et que nous ne connaissons pas la cause, nous devons procéder au débogage. Alors ici, au lieu de mettre une réponse, je vous demande d’exécuter des tests 

  1. confirmer la connectivité du système avec Internet: Ouvrez le terminal cmd et tapez

    ping smtp.gmail.com
    
  2. confirmer le pare-feu: Entrez ce qui suit dans le terminal cmd

    telnet smtp.gmail.com 465
    
  3. confirmez la configuration php: entrez php -a au terminal cmd et sur l'invite php, exécutez (copiez/collez puis appuyez sur entrée) le code suivant.

    $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. confirmer la bibliothèque Pear Mail et l'accès SMTP à Gmail: de nouveau sur l'invite cmd et php php -a exécuter votre propre code (comme vous l'avez posté dans ce fil)

Et laisse savoir où il se casse, et quelle est l'erreur. Seulement après cela, nous pouvons aider

2
Nasir Iqbal

Dans PHP 5.3, les astuces données par d'autres sur les "applications moins sécurisées", qui doivent être activées une fois connecté à votre compte Google Gmail, ont résolu tous mes problèmes.

Dans PHP 7.2, je devais faire plus: définir "auth" sur PLAIN, puis ajouter "verify_peer" et verify_peer_name pour ssl socket_options comme ceci:

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