tutte le guide

// come risolvere

PHPMailer "SMTP Error: Could not authenticate": come risolvere

PHPMailer fallisce con SMTP Error: Could not authenticate? Attiva l'output di debug, poi correggi login, porta, cifratura o impostazioni del provider.

Cosa significa

PHPMailer si è connesso al server SMTP, ma il server ha rifiutato nome utente e password. PHPMailer mostra un breve messaggio:

SMTP Error: Could not authenticate.

Questo testo breve nasconde il vero motivo. La risposta del server (spesso un codice 535) è visibile solo con l'output di debug attivo. Non confonderlo con SMTP connect() failed, che significa che PHPMailer non è nemmeno riuscito a raggiungere il server (host sbagliato, porta bloccata, problema TLS).

Perché succede

  • Nome utente o password errati. La maggior parte dei provider vuole l'indirizzo email completo come nome utente. Le password con caratteri speciali possono essere troncate o alterate quando vengono salvate in un file .env o in una configurazione con virgolette.
  • Il provider non accetta più la password normale. Gmail richiede una password per app (vedi Gmail 535 5.7.8 username and password not accepted). Microsoft 365 ha spesso SMTP AUTH disattivato (vedi Microsoft 365 535 5.7.139).
  • Credenziali SMTP specifiche. Servizi come Amazon SES, SendGrid o Mailgun usano credenziali SMTP dedicate, non il login del tuo account (per SES, vedi Amazon SES 535 credenziali non valide).
  • Coppia porta e cifratura sbagliata. La porta 465 richiede TLS implicito (ENCRYPTION_SMTPS); la porta 587 richiede STARTTLS (ENCRYPTION_STARTTLS). Alcuni server non offrono affatto il login prima che la cifratura sia attiva.
  • L'hosting reindirizza SMTP. Alcuni hosting condivisi indirizzano tutto lo SMTP in uscita verso il proprio server. Il tuo login arriva quindi al server sbagliato e fallisce.
  • Account bloccato dopo troppi tentativi falliti, o per un controllo di sicurezza del provider.

Come verificare

Attiva l'output di debug per un solo test (non lasciarlo mai attivo in produzione, mostra lo scambio di login):

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

Leggi le righe che iniziano con SERVER -> CLIENT:

  • Una riga 535 dopo AUTH indica il motivo del provider (credenziali errate, password per app richiesta, SMTP AUTH disattivato…).
  • Se il saluto 220 o il certificato mostrano un hostname che non è quello del tuo provider, il tuo hosting sta reindirizzando SMTP.
  • Se nessun AUTH compare nell'elenco 250 dopo EHLO, il server non offre il login su questa porta o prima di TLS.

Testa lo stesso login fuori da PHP con swaks, dallo stesso server:

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

Se swaks funziona, il problema è nella tua configurazione PHP (virgolette nella password, variabile sbagliata). Se anche swaks fallisce, il problema è l'account o il provider.

Come risolvere

  1. Usa esattamente le impostazioni del tuo provider: host, porta, cifratura e formato del nome utente indicati nella sua documentazione.
  2. Conserva la password in modo sicuro e verifica che venga letta correttamente (durante un test stampa la sua lunghezza, non la password).
  3. Usa il tipo di credenziale giusto: una password per app per Gmail, credenziali SMTP per SES o altri servizi, e SMTP AUTH attivato sulla casella per Microsoft 365. PHPMailer supporta anche OAuth2 (XOAUTH2) per Gmail e Microsoft 365 se preferisci non usare password.
  4. Abbina porta e cifratura: 587 con ENCRYPTION_STARTTLS, oppure 465 con ENCRYPTION_SMTPS.
  5. Su un hosting condiviso, chiedi all'hosting se lo SMTP in uscita viene reindirizzato, e usa il loro server SMTP o consenti lo SMTP esterno dal pannello, se lo offrono.
  6. Sblocca l'account se il provider lo ha bloccato, poi riprova una sola volta invece che in un ciclo.

Quando la posta parte, assicurati che sia autenticata per il tuo dominio; i moduli di contatto e i siti WordPress hanno altre insidie trattate in le email del sito finiscono nello spam.

Verifica che sia risolto

Esegui di nuovo lo script con il debug attivo: dovresti vedere 235 Authentication successful (la formulazione varia) e poi 250 dopo i dati del messaggio. Imposta come destinatario l'indirizzo unico indicato nella home page di Delivmail e leggi il report per controllare SPF, DKIM e DMARC. Poi disattiva il debug e invia al destinatario reale.

Verifica che sia risolto

Una modifica DNS può richiedere da pochi minuti a qualche ora. Poi invia una nuova email di test o scansiona di nuovo il tuo dominio.

Guide correlate