// comment corriger
Mailgun « 401 Forbidden » : mauvaise clé API ou confusion entre région EU et US
Mailgun renvoie 401 Forbidden ou Unauthorized. Vérifiez le type de clé API, le nom d'utilisateur « api » et si votre domaine utilise le point d'accès US ou EU.
Ce que ça veut dire
Votre application a appelé l'API Mailgun et a reçu un HTTP 401 Unauthorized. Le corps de la réponse se limite souvent au mot Forbidden, ce qui prête à confusion. La référence de l'API Mailgun indique qu'un 401 signifie que la clé API est absente ou invalide, alors qu'un 403 signifie que la clé est valide mais que l'accès à cette ressource est refusé. En pratique, un 401 vient presque toujours de l'un des problèmes ci-dessous.
Pourquoi cela arrive
- Région qui ne correspond pas. Chaque domaine d'envoi est créé dans la région US ou dans la région EU. Un domaine créé dans l'EU doit être appelé sur
https://api.eu.mailgun.net/, un domaine US surhttps://api.mailgun.net/. Appeler le mauvais échoue même avec une bonne clé. Beaucoup de bibliothèques et de plugins utilisent par défaut le point d'accès US. - Mauvais type de clé. Mailgun a plusieurs clés : la Mailgun API key privée (au niveau du compte), les domain sending keys (envoi uniquement, pour un seul domaine), la clé de signature des webhooks HTTP et la clé publique de vérification. Les deux dernières ne permettent pas d'envoyer d'emails.
- Une clé d'envoi utilisée pour un autre domaine ou un autre point d'accès. Une domain sending key ne fonctionne que pour
/messageset/messages.mimesur le domaine pour lequel elle a été créée. Appeler/v3/domainsou un autre domaine avec elle échoue. - Mauvaise authentification Basic Auth. Le nom d'utilisateur doit être exactement
apiet le mot de passe la clé. Certains codes envoient la clé comme nom d'utilisateur, ou ajoutent des espaces ou des guillemets. Les anciennes clés commencent parkey-, et ce préfixe fait partie de la clé. - Clé supprimée ou régénérée. Les clés ne s'affichent qu'une fois ; un collègue a peut-être renouvelé la clé que vous avez encore dans
.env. - Liste d'IP autorisées : si l'accès à l'API est limité à certaines adresses IP dans les réglages de sécurité du compte, les appels d'un nouveau serveur sont refusés.
Un 404 « Domain not found » signifie généralement que le nom de domaine dans l'URL est faux ou qu'il existe dans l'autre région.
Comment vérifier
- Dans le panneau Mailgun, ouvrez Send, Domains : la liste indique la région de chaque domaine (US ou EU).
- Testez votre clé avec
curl, en utilisant le point d'accès de cette région :
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'
Si vous obtenez une réponse JSON avec un id et « Queued », la clé et la région sont bonnes et le problème vient de la configuration de votre application. En cas d'échec, essayez l'autre point d'accès : si l'un fonctionne et pas l'autre, c'est un problème de région. Retirez .eu pour un domaine US.
Comment corriger
1. Indiquez la région dans votre bibliothèque. Exemples :
// 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=euDans les plugins SMTP de WordPress, choisissez l'option Region correspondante. Ensuite :
- Utilisez la bonne clé. Créez une nouvelle clé API privée ou une domain sending key dans le panneau Mailgun (API security / sending keys) et enregistrez-la tout de suite : vous ne la reverrez plus. N'utilisez la clé d'envoi que pour envoyer sur son propre domaine.
- Traquez les caractères invisibles : pas de guillemets dans la valeur, pas d'espace ni de retour à la ligne final issu d'un copier-coller.
- Mettez à jour la liste d'IP autorisées si vous en utilisez une, avec l'IP publique du serveur qui appelle l'API.
- En SMTP, l'erreur équivalente est un échec d'authentification
535. Les identifiants SMTP sont propres à chaque domaine et à chaque région : utilisezsmtp.eu.mailgun.orgpour les domaines EU etsmtp.mailgun.orgpour les domaines US, avec l'identifiant SMTP du domaine (par exemplepostmaster@mg.yourdomain.com). Si vous utilisez PHPMailer, voir PHPMailer « Could not authenticate ».
Si l'appel est accepté mais que le message est refusé parce que vous utilisez encore le domaine sandbox, lisez sandbox Mailgun : destinataires autorisés uniquement. Si votre domaine n'est pas encore vérifié, corrigez d'abord son DNS avec domaine Mailgun non vérifié.
Vérifier que c'est corrigé
Envoyez un message depuis votre application à l'adresse unique de la page d'accueil de Delivmail. S'il arrive, l'authentification fonctionne ; le rapport vous dit alors si SPF, DKIM et DMARC passent pour votre domaine Mailgun. Renvoyez ensuite les messages qui avaient échoué en 401, et regroupez la région et la clé à un seul endroit de votre configuration pour que le prochain déploiement ne ramène pas l'erreur.
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
- Amazon SES SMTP « 535 Authentication Credentials Invalid » : la solutionAmazon SES refuse votre connexion SMTP avec 535 Authentication Credentials Invalid. Utilisez de vrais identifiants SMTP, la bonne Région et le bon serveur.
- Amazon SES « Throttling: Maximum sending rate exceeded » (454) : la solutionAmazon SES renvoie « Maximum sending rate exceeded » ou « Daily message quota exceeded ». Vérifiez vos quotas, ralentissez l'envoi et demandez une hausse.
- Domaine Mailgun non vérifié : corrigez les enregistrements SPF, DKIM, MX et CNAMEMailgun affiche votre domaine comme non vérifié ou refuse d'envoyer depuis celui-ci. Ajoutez les bons SPF et DKIM, évitez les erreurs DNS courantes et validez.
- Mailgun « Sandbox subdomains are for test purposes only » (403) : la solutionMailgun refuse d'envoyer depuis votre domaine sandbox vers une adresse non autorisée. Autorisez vos adresses de test ou ajoutez votre propre domaine.
- Mailgun 605 « Not delivering to previously bounced address » : la solutionMailgun refuse d'envoyer avec le code 605 car l'adresse a déjà rebondi. Quand la retirer de la liste des rebonds, et quand la laisser.