toutes les fiches

// comment corriger

PHPMailer « SMTP Error: Could not authenticate » : comment le corriger

PHPMailer échoue avec SMTP Error: Could not authenticate ? Activez le mode debug, puis corrigez l'identifiant, le port, le chiffrement ou les réglages du fournisseur.

Ce que ça veut dire

PHPMailer s'est connecté au serveur SMTP, mais le serveur a refusé l'identifiant et le mot de passe. PHPMailer affiche un message court :

SMTP Error: Could not authenticate.

Ce texte court cache la vraie raison. La réponse du serveur (souvent un code 535) n'est visible qu'avec le mode debug activé. Ne confondez pas avec SMTP connect() failed, qui signifie que PHPMailer n'a même pas pu joindre le serveur (mauvais hôte, port bloqué, problème TLS).

Pourquoi cela arrive

  • Mauvais identifiant ou mot de passe. La plupart des fournisseurs veulent l'adresse email complète comme identifiant. Les mots de passe avec des caractères spéciaux peuvent être tronqués ou modifiés quand ils sont stockés dans un fichier .env ou une configuration avec des guillemets.
  • Le fournisseur n'accepte plus le mot de passe normal. Gmail exige un mot de passe d'application (voir Gmail 535 5.7.8 username and password not accepted). Microsoft 365 a souvent le SMTP AUTH désactivé (voir Microsoft 365 535 5.7.139).
  • Identifiants SMTP spécifiques. Des services comme Amazon SES, SendGrid ou Mailgun utilisent des identifiants SMTP dédiés, et non l'identifiant de votre compte (pour SES, voir Amazon SES 535 credentials invalid).
  • Mauvaise combinaison port / chiffrement. Le port 465 demande du TLS implicite (ENCRYPTION_SMTPS) ; le port 587 demande du STARTTLS (ENCRYPTION_STARTTLS). Certains serveurs ne proposent aucune connexion avant que le chiffrement soit actif.
  • L'hébergeur redirige le SMTP. Certains hébergements mutualisés redirigent tout le SMTP sortant vers leur propre serveur. Votre identifiant arrive alors sur le mauvais serveur et échoue.
  • Compte verrouillé ou bloqué après trop de tentatives échouées, ou contrôle de sécurité du fournisseur.

Comment vérifier

Activez le mode debug pour un seul test (ne le laissez jamais en production, il affiche l'échange de connexion) :

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->SMTPDebug  = SMTP::DEBUG_SERVER;
$mail->Host       = 'smtp.example.com';
$mail->Port       = 587;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->SMTPAuth   = true;
$mail->Username   = 'you@yourdomain.com';
$mail->Password   = getenv('SMTP_PASSWORD');

Lisez les lignes qui commencent par SERVER -> CLIENT :

  • Une ligne 535 après AUTH donne la raison du fournisseur (identifiants incorrects, mot de passe d'application requis, SMTP AUTH désactivé…).
  • Si le message d'accueil 220 ou le certificat affiche un nom d'hôte qui n'est pas celui de votre fournisseur, votre hébergeur redirige le SMTP.
  • Si aucun AUTH n'apparaît dans la liste 250 après EHLO, le serveur ne propose pas de connexion sur ce port ou avant le TLS.

Testez le même identifiant en dehors de PHP avec swaks, depuis le même serveur :

swaks --server smtp.example.com:587 --tls --auth LOGIN \
  --auth-user you@yourdomain.com --to you@yourdomain.com

Si swaks fonctionne, le problème vient de votre configuration PHP (guillemets autour du mot de passe, mauvaise variable). Si swaks échoue aussi, c'est le compte ou le fournisseur.

Comment corriger

  1. Utilisez exactement les réglages de votre fournisseur : hôte, port, chiffrement et format d'identifiant indiqués dans sa documentation.
  2. Stockez le mot de passe de façon sûre et vérifiez qu'il est lu correctement (affichez sa longueur pendant un test, pas le mot de passe).
  3. Utilisez le bon type d'identifiant : un mot de passe d'application pour Gmail, des identifiants SMTP pour SES ou d'autres services, et le SMTP AUTH activé sur la boîte pour Microsoft 365. PHPMailer prend aussi en charge OAuth2 (XOAUTH2) pour Gmail et Microsoft 365 si vous préférez ne pas utiliser de mot de passe.
  4. Associez le bon port au bon chiffrement : 587 avec ENCRYPTION_STARTTLS, ou 465 avec ENCRYPTION_SMTPS.
  5. Sur un hébergement mutualisé, demandez à l'hébergeur si le SMTP sortant est redirigé, et utilisez son serveur SMTP ou autorisez le SMTP externe dans le panneau s'il le propose.
  6. Débloquez le compte si le fournisseur l'a bloqué, puis réessayez une seule fois plutôt qu'en boucle.

Une fois que les emails partent, assurez-vous qu'ils sont authentifiés pour votre domaine ; les formulaires de contact et les sites WordPress ont des pièges supplémentaires, traités dans les emails de votre site arrivent en spam.

Vérifiez que c'est corrigé

Relancez le script avec le mode debug : vous devez voir 235 Authentication successful (la formulation varie), puis 250 après les données du message. Mettez comme destinataire l'adresse unique affichée sur la page d'accueil de Delivmail et lisez le rapport pour vérifier le SPF, le DKIM et le DMARC. Désactivez ensuite le mode debug et envoyez au vrai destinataire.

Vérifiez que c'est corrigé

Une modification DNS peut prendre de quelques minutes à quelques heures. Ensuite, envoyez un nouvel email de test ou scannez à nouveau votre domaine.

Fiches liées