// come risolvere
Mailgun "401 Forbidden": chiave API sbagliata o regione EU/US non corrispondente
Mailgun restituisce 401 Forbidden o Unauthorized. Controlla il tipo di chiave API, il nome utente "api" e se il tuo dominio usa l'endpoint US o EU.
Cosa significa
La tua applicazione ha chiamato l'API di Mailgun e ha ricevuto un HTTP 401 Unauthorized. Il corpo della risposta spesso è solo la parola Forbidden, il che confonde. Il riferimento API di Mailgun indica che 401 significa chiave API mancante o non valida, mentre 403 significa che la chiave è valida ma l'accesso a quella risorsa è negato. In pratica, un 401 deriva quasi sempre da uno dei problemi qui sotto.
Perché succede
- Regione non corrispondente. Ogni dominio di invio viene creato nella regione US o EU. Un dominio creato in EU deve essere chiamato su
https://api.eu.mailgun.net/, un dominio US suhttps://api.mailgun.net/. Chiamare quello sbagliato fallisce anche con una chiave valida. Molte librerie e molti plugin usano per impostazione predefinita l'endpoint US. - Tipo di chiave sbagliato. Mailgun ha diverse chiavi: la Mailgun API key privata (a livello di account), le domain sending keys (solo invio, per un dominio), la chiave di firma dei webhook HTTP e la chiave pubblica di verifica. Le ultime due non possono inviare email.
- Una sending key usata per un altro dominio o endpoint. Una domain sending key funziona solo per
/messagese/messages.mimesul dominio per cui è stata creata. Usarla per chiamare/v3/domainso un altro dominio fallisce. - Basic Auth errata. Il nome utente deve essere esattamente
apie la password la chiave. Alcuni codici inviano la chiave come nome utente, oppure aggiungono spazi o virgolette. Le chiavi più vecchie iniziano conkey-, e questo prefisso fa parte della chiave. - Chiave eliminata o rigenerata. Le chiavi vengono mostrate una sola volta; un collega potrebbe aver ruotato la chiave che hai ancora nel
.env. - Lista di IP autorizzati: se l'accesso all'API è limitato ad alcuni indirizzi IP nelle impostazioni di sicurezza dell'account, le chiamate da un nuovo server vengono rifiutate.
Un 404 "Domain not found" di solito significa che il nome di dominio nell'URL è sbagliato o esiste nell'altra regione.
Come verificare
- Nel pannello di Mailgun apri Send, Domains: l'elenco mostra la regione di ogni dominio (US o EU).
- Prova la tua chiave con
curl, usando l'endpoint di quella regione:
curl -s --user 'api:YOUR_API_KEY' \ https://api.eu.mailgun.net/v3/mg.yourdomain.com/messages \ -F from='Test <hello@mg.yourdomain.com>' \ -F to='you@example.com' \ -F subject='Mailgun test' \ -F text='Hello'
Se ottieni una risposta JSON con un id e "Queued", chiave e regione sono corrette e il problema è nella configurazione della tua applicazione. Se fallisce, prova l'altro endpoint: se uno funziona e l'altro no, è un problema di regione. Togli .eu per un dominio US.
Come risolvere
1. Imposta la regione nella tua libreria. Esempi:
// mailgun.js (Node)
const mg = new Mailgun(FormData).client({
username: 'api',
key: process.env.MAILGUN_API_KEY,
url: 'https://api.eu.mailgun.net', // only for EU domains
});
# Laravel .env
MAILGUN_DOMAIN=mg.yourdomain.com
MAILGUN_SECRET=your-private-or-sending-key
MAILGUN_ENDPOINT=api.eu.mailgun.net
# Symfony Mailer
MAILER_DSN=mailgun+api://KEY:mg.yourdomain.com@default?region=euNei plugin SMTP per WordPress, scegli l'opzione Region corrispondente. Poi:
- Usa la chiave giusta. Crea una nuova chiave API privata o una domain sending key nel pannello di Mailgun (API security / sending keys) e salvala subito: non la vedrai più. Usa la sending key solo per inviare dal suo dominio.
- Cerca caratteri nascosti: niente virgolette dentro il valore, niente spazio finale o a capo dovuti al copia e incolla.
- Aggiorna la lista di IP autorizzati se ne usi una, con l'IP pubblico del server che chiama l'API.
- Per SMTP, l'errore equivalente è un fallimento di autenticazione
535. Le credenziali SMTP sono per dominio e per regione: usasmtp.eu.mailgun.orgper i domini EU esmtp.mailgun.orgper quelli US, con il login SMTP del dominio (per esempiopostmaster@mg.yourdomain.com). Se usi PHPMailer, consulta PHPMailer "Could not authenticate".
Se la chiamata viene accettata ma il messaggio è rifiutato perché usi ancora il dominio sandbox, leggi sandbox di Mailgun: solo destinatari autorizzati. Se il tuo dominio non è ancora verificato, sistema prima il suo DNS con dominio Mailgun non verificato.
Verifica che sia risolto
Invia un messaggio dalla tua applicazione all'indirizzo unico nella home page di Delivmail. Se arriva, l'autenticazione funziona; il report ti dice poi se SPF, DKIM e DMARC sono superati per il tuo dominio Mailgun. Poi invia di nuovo i messaggi falliti con 401 e tieni regione e chiave in un unico punto della configurazione, così il prossimo deploy non riporterà l'errore.
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
- Amazon SES SMTP "535 Authentication Credentials Invalid": come risolvereAmazon SES rifiuta il tuo login SMTP con 535 Authentication Credentials Invalid. Usa vere credenziali SMTP, la Region e l'endpoint giusti, e provale.
- Amazon SES "Throttling: Maximum sending rate exceeded" (454): come risolvereAmazon SES restituisce "Maximum sending rate exceeded" o "Daily message quota exceeded". Controlla le quote, rallenta gli invii e chiedi un aumento.
- Dominio Mailgun non verificato: correggi i record SPF, DKIM, MX e CNAMEMailgun mostra il tuo dominio come non verificato o rifiuta di inviare da esso. Aggiungi i record SPF e DKIM giusti, evita gli errori DNS comuni e verifica.
- Mailgun "Sandbox subdomains are for test purposes only" (403): come risolvereMailgun rifiuta di inviare dal tuo dominio sandbox a un indirizzo che non è un destinatario autorizzato. Autorizza gli indirizzi di test o aggiungi il tuo dominio.
- Mailgun 605 "Not delivering to previously bounced address": come risolvereMailgun rifiuta l'invio con il codice 605 perché l'indirizzo ha già dato bounce. Scopri quando rimuoverlo dalla lista dei bounce e quando lasciarlo lì.