使用Nest.js调用Mailgun发邮件遇401 Forbidden错误,求解决方案
解决Mailgun 401 Forbidden错误的方案
401错误本质是认证失败,结合你的代码和提供的信息,我整理了几个最可能的修复方向:
1. 确认API Key的正确性
首先,Mailgun的私有API Key必须以 key- 开头(比如 key-920d6161ca860e7b84d9de75e14e...),但从你打印的实例信息来看,你的API Key是 920d6161ca860e7b84d9de75e14exxx-xxx-xxx,没有key-前缀,这大概率是问题所在!
- 登录Mailgun控制台,找到你的域名对应的私有API Key(不是公钥),复制完整的带
key-前缀的字符串。 - 检查你的环境变量
MAILGUN_API_KEY是否正确配置,有没有多空格、少字符的情况。
2. 验证域名配置与区域匹配
你的域名是lokalne-dobrodziejstwa.pl,需要确认:
- 该域名在Mailgun控制台中已经完成DNS验证(MX、TXT等记录都配置正确,状态显示“Verified”)。如果域名未验证,Mailgun会拒绝发送请求。
- 如果你的域名是在Mailgun的欧盟(EU)区域创建的,默认的API host
api.mailgun.net不适用,需要修改为api.eu.mailgun.net。修改初始化代码:this.mg = Mailgun({ apiKey: this.configService.get('MAILGUN_API_KEY'), domain: this.configService.get('MAILGUN_API_DOMAIN'), host: 'api.eu.mailgun.net' // 新增这行,针对EU区域 });
3. 检查发件人邮箱的合规性
发件人rejestracja@lokalne-dobrodziejstwa.pl必须满足:
- 属于你在Mailgun中已验证的域名
lokalne-dobrodziejstwa.pl,不能使用未关联该域名的邮箱。 - 如果是新注册的域名,Mailgun可能会有初始发送限制,确保发件人邮箱没有被标记为可疑。
4. 代码优化(非401直接原因,但提升可读性)
mailgun-js的send方法本身就支持Promise,你可以简化Promise包装的代码,避免回调嵌套:
send(data: IMailGunData): Promise<Mailgun.messages.SendResponse> { console.log(data); console.log(this.mg); return this.mg.messages().send(data); // 直接返回方法的Promise }
最后,建议先通过Mailgun控制台的API测试工具发送一封测试邮件,确认API Key和域名配置无误后,再回到代码中调试,这样可以快速排除平台配置问题。
内容的提问来源于stack exchange,提问作者Pawel
相关产品推荐
相关产品推荐

