Erreur SMTP : Impossible de se connecter à l'hôte SMTP PHP MAILER
- Base De Connaissances /
- Creation sites web /
- Erreur SMTP : Impossible de se connecter à l'hôte SMTP PHP MAILER
"Erreur SMTP : Impossible de se connecter à l'hôte SMTP.
Cela peut également apparaître comme SMTP connect() failed ou Called Mail() sans être connecté dans la sortie de débogage. This is often reported as a PHPMailer problem, but it's almost always down to local DNS failure, firewall blocking (for example as GoDaddy does) or another issue on your local network. Cela signifie que PHPMailer est incapable de contacter le serveur SMTP que vous avez spécifié dans la propriété Host, mais ne dit pas exactement pourquoi. Cela signifie que PHPMailer est incapable de contacter le serveur SMTP que vous avez spécifié dans la propriété Host, mais ne dit pas exactement pourquoi
Certaines techniques pour diagnostiquer la source de cette erreur sont décrites ci-dessous.
GoDaddy
Le populaire hébergeur américain GoDaddy impose des contraintes très strictes (au point de devenir presque inutiles) sur l'envoi d'un e-mail. Ils bloquent le SMTP sortant vers les ports 25, 465 et 587 vers tous les serveurs sauf le leur. Ce problème fait l'objet de nombreuses questions frustrantes dans Stack Overflow . Si vous trouvez que votre script fonctionne sur votre machine locale, mais pas lorsque vous le téléchargez sur GoDaddy, c'est ce qui vous arrive.La solution est extrêmement mal documentée par GoDaddy : vous devez envoyer via leurs serveurs, et également désactiver toutes les fonctionnalités de sécurité, nom d'utilisateur et mot de passe (super, hein ? !), vous donnant cette configuration pour PHPMailer :
$mail->isSMTP(); $mail->Host = 'relay-hosting.secureserver.net'; $mail->Port = 25; $mail->SMTPAuth = false; $mail->SMTPSecure = false;
GoDaddy refuse également d'envoyer avec une adresse De appartenant à n'importe quel domaine aol, gmail, yahoo, hotmail, live, aim ou msn (voir leurs docs). En effet, tous ces domaines déploient des mesures anti-falsification SPF et DKIM, et falsifier votre adresse d'expédition est une falsification.
Lire la transcription SMTP
Si vous définissez SMTPDebug = 2 ou supérieur, vous verrez ce que dit le serveur SMTP distant. Très souvent, cela vous dira exactement ce qui ne va pas - des choses comme "Mot de passe incorrect", ou parfois l'URL d'une page pour vous aider à diagnostiquer le problème. Lisez ce qu'il dit. Google le fait souvent - voir ci-dessous pour plus d'informations sur leur paramètre "Autoriser les applications moins sécurisées".
Échecs DNS
Celles-ci sont souvent considérées comme des délais d'expiration de connexion ou "Échec temporaire de la résolution de nom", "Impossible de résoudre l'hôte", "Échec de getaddrinfo" ou des erreurs similaires. Vérifiez que votre DNS fonctionne en utilisant l'outil dig (du paquet dnsutils sur Debian/Ubuntu):
dig +short smtp.gmail.com
Vous obtiendrez quelque chose comme ça si votre DNS fonctionne:
gmail-smtp-msa.l.google.com. 173.194.67.108 173.194.67.109
Si cela échoue, PHPMailer ne pourra pas envoyer d'e-mail car il ne pourra pas obtenir la bonne adresse IP pour se connecter. Si vous n'avez peut-être pas de nom dans le DNS, vous pouvez utiliser une adresse IP directement comme nom d'hôtee. Pour résoudre ce problème, vous devez comprendre pourquoi votre DNS ne fonctionne pas - peut-être n'avez-vous pas configuré vos résolveurs ?
Vérifiez qu'il est bien là
Même un serveur avec tous les services désactivés répondra généralement à de simples pings, donc si vous savez que votre DNS est correct, vérifiez que le serveur est bien là:
ping smtp.gmail.com
Vous devriez voir quelque chose comme ça (appuyez sur ctrl-C pour l'arrêter):
PING gmail-smtp-msa.l.google.com (74.125.133.108): 56 data bytes 64 bytes from 74.125.133.108: icmp_seq=0 ttl=43 time=72.636 ms 64 bytes from 74.125.133.108: icmp_seq=1 ttl=43 time=68.841 ms 64 bytes from 74.125.133.108: icmp_seq=2 ttl=43 time=68.500 ms
Vérifiez qu'il s'agit d'un serveur de messagerie
Il se peut qu'un autre service soit en cours d'exécution sur le port SMTP auquel vous essayez de vous connecter. Vous pouvez vérifier cela en utilisant l'outil telnet, comme celui-ci (en se connectant à gmail sur son port de service de soumission):
telnet smtp.gmail.com 587
Cela devrait vous donner quelque chose comme ça:
En essayant 173.194.67.109... Connecté à gmail-smtp-msa.l.google.com. Le caractère d'échappement est '^]'. 220 mx.google.com ESMTP ex2sm16805587wjd.30 - gsmtp
(Entrez quitter pour en sortir). Si le port 587 ne fonctionne pas, vous pouvez essayer le port 465 ou le port 25 et utiliser celui qui fonctionne - mais gardez à l'esprit que le port 25 ne prend souvent pas en charge le cryptage (voir les notes de cryptage).
S'il ne produit aucune sortie ou quelque chose qui ne commence pas par 220, soit votre serveur est en panne, soit vous avez le mauvais serveur.
Redirection du pare-feu
Une autre chose à surveiller ici est que le nom avec lequel le serveur de messagerie répond doit être lié au serveur que vous avez demandé, comme vous pouvez le voir dans l'exemple ci-dessus - nous avons demandé smtp.gmail.com et a obtenu gmail-smtp-msa.l.google.com, qui ressemble à quelque chose à voir avec google - si à la place vous voyez quelque chose comme le nom de votre FAI, cela pourrait signifier que le pare-feu de votre FAI vous redirige de manière transparente vers ses propres serveurs de messagerie, et vous êtes susceptible de voir des échecs d'authentification et de vérification de certificat TLS (voir ci-dessous pour plus d'informations) car vous vous connectez au mauvais serveur. Cela est très susceptible de se produire sur le port 25, mais moins susceptible de se produire sur les ports 465 et 587, c'est donc une autre raison d'utiliser le chiffrement !
Blocage SELinux
Si vous voyez une erreur comme SMTP -> ERREUR: Échec de connexion au serveur: Autorisation refusée (13), vous pouvez exécuter SELinux empêchant PHP ou le serveur Web d'envoyer des e-mails. Ceci est particulièrement probable sur RedHat / Fedora / Centos. À l'aide de la commande getsebool, nous pouvons vérifier si le démon httpd est autorisé à établir une connexion sur le réseau et à envoyer un e-mail:
getsebool httpd_can_sendmail getsebool httpd_can_network_connect
Cette commande renverra un booléen activé ou désactivé. S'il est éteint, nous pouvons l'allumer:
sudo setsebool -P httpd_can_sendmail 1 sudo setsebool -P httpd_can_network_connect 1
Si vous exécutez PHP-FPM via FastCGI, vous devrez peut-être l'appliquer au démon fpm plutôt qu'à httpd.
Blocage IPv6
Certains fournisseurs de services (dont Digital Ocean) fournissent une connectivité IPv6 pour les serveurs mais bloquent le SMTP sortant sur IPv6 tout en l'autorisant sur IPv4. Cela peut être contourné en définissant explicitement la propriété Host sur une adresse IPv4 (la fonction gethostbyname ne fait que des recherches IPv4):
$mail->Host = gethostbyname('smtp.gmail.com');
Le seul problème avec cette approche est que vous finissez par demander à vous connecter à une adresse IPv4 explicite, ce qui vous fera généralement échouer lors de la vérification du nom du certificat. Vous pouvez désactiver cela (voir Options SMTP ailleurs dans ce document), mais cela devrait être considéré comme une mauvaise solution de contournement - la bonne solution consiste à réparer votre réseau.
Remarque : Lorsque vous utilisez le service Digital Ocean, vérifiez si votre port SMTP est réellement déverrouillé, car il s'agit d'une société basée aux États-Unis, il contient une série de directives pour ne pas tomber dans le spam, vous devez donc demander le déverrouillage et suivre les étapes pour confirmer avec Digital Océan le but de l'envoi de vos emails avec PHPMailer.
Échecs d'authentification
Si votre authentification échoue, il y a plusieurs causes probables:
-
Vous avez le mauvais nom d'utilisateur ou mot de passe.
-
Votre connexion est redirigée vers un autre serveur (comme ci-dessus).
-
Vous avez spécifié une authentification sans cryptage.
Généralement, vous ne souhaitez pas envoyer un nom d'utilisateur ou un mot de passe via un lien non crypté. Certains schémas d'authentification SMTP ajoutent un niveau de sécurité minimal (envoi de hachages courts plutôt que de texte clair), mais ceux-ci n'offrent qu'une protection minimale, et la plupart des serveurs n'autorisent donc pas l'authentification sans chiffrement. Corrigez cela en définissant SMTPSecure = 'tls' et Port = 587 ainsi qu'en définissant le Nom d'utilisateur et propriétés Mot de passe.
Utilisation du cryptage
Vous devez utiliser le cryptage à chaque occasion, sinon vous invitez toutes sortes de possibilités désagréables pour le phishing, le vol d'identité, l'écoute clandestine, les informations d'identification volées, etc.
PHPMailer utilise le cryptage TLS ; TLS est simplement le « nouveau » (depuis 1998 !) nom de SSL. Les deux noms sont essentiellement interchangeables.
La configuration TLS / SSL que vous utilisez pour le courrier électronique n'a rien à voir avec les certificats que vous pouvez utiliser sur votre site Web ; vous pouvez toujours utiliser des e-mails cryptés même si votre site n'a pas de certificat.
Vérifiez que vous avez l'extension openssl
Pour utiliser n'importe quel type de cryptage, vous devez activer l'extension PHP openssl. Si vous ne l'avez pas installé ou s'il est mal configuré, vous risquez d'avoir des problèmes lors de la phase STARTTLS des connexions. Vérifiez cela en regardant la sortie de phpinfo() ou php -i (recherchez une section 'openssl'), ou openssl répertorié dans la sortie de php -m, ou exécutez cette ligne de code:
Saveurs de chiffrement
Il existe deux "saveurs" de chiffrement de transport disponibles pour les e-mails :
-
"SMTPS", également appelé " implicite", car il suppose que vous allez utiliser le cryptage dès le début de la connexion. Dans PHPMailer, ce mode est sélectionné en définissant SMTPSecure = 'ssl', et nécessite généralement Port = 465.
-
"SMTP+STARTTLS", également appelé "explicite", car il se connecte initialement de manière non sécurisée, puis demande explicitement que la connexion commence à utiliser le chiffrement. Dans PHPMailer, ce mode est sélectionné en définissant SMTPSecure = 'tls', et nécessite généralement Port = 587, bien qu'il puisse fonctionner sur n'importe quel port.
SMTPS sur le port 465 est officiellement obsolète depuis 1998 et n'était utilisé que par les produits Microsoft qui n'ont pas reçu le mémo ; les normes recommandent d'utiliser plutôt SMTP+STARTTLS sur le port 587. Cependant, SMTPS sur le port 465 est sur le point de redevenir une solution recommandée.
$mail->SMTPSecure = 'tls'; $mail->Host = 'smtp.gmail.com'; $mail->Port = 587; //ou plus succinctement: $mail->Host = 'tls://smtp.gmail.com:587';
ou
$mail->SMTPSecure = 'ssl'; $mail->Host = 'smtp.gmail.com'; $mail->Port = 465; //ou plus succinctement: $mail->Host = 'ssl://smtp.gmail.com:465';
Ne mélangez pas ces modes ; ssl sur le port 587 ou tls sur le port 465 ne fonctionnera pas.
TLS opportuniste
PHPMailer 5.2.10 a introduit TLS opportuniste - s'il voit que le serveur annonce le cryptage TLS (après que vous vous êtes connecté au serveur), il active automatiquement le cryptage, même si vous n'avez pas défini SMTPSecure code>. Cela pourrait causer des problèmes si le serveur annonce TLS avec un certificat invalide, mais vous pouvez le désactiver avec $mail->SMTPAutoTLS = false; .
Ouvrir un ticket
Soumettez une demande d'assistance