MailGun API返回401 Forbidden问题:自研脚本失效,开源脚本正常
排查MailGun API 401 Forbidden错误的思路
我之前对接MailGun API时也踩过401的坑,结合你给出的开源脚本片段,咱们来一步步定位问题:
最可能的原因:HTTP认证方式错误
MailGun API要求使用Basic Auth认证,也就是把api_key作为用户名,密码留空。很多新手会不小心把密钥放在请求参数里,或者完全漏掉认证配置——这是导致401的头号原因。
对比你提供的开源脚本片段,它大概率在后续的CURL配置里加了这行关键代码:
curl_setopt($ch, CURLOPT_USERPWD, "api:" . $config['api_key']);
你自己的脚本是不是漏掉了这一行?如果是的话,MailGun服务器根本无法识别你的身份,直接返回401。
其他可能的排查点
如果认证方式没问题,再检查以下几个地方:
- 请求URL正确性:确认你脚本里的API URL和开源脚本一致,比如是不是用了
v3版本,域名有没有拼写错误(比如多空格、少字符)。开源脚本的URL格式是https://api.mailgun.net/v3/{domain}/messages,别写成v2或者其他端点。 - 请求参数格式:比如
from字段必须是"显示名称 <邮箱地址>"的格式,而且邮箱地址的域名必须和你配置的发送域名一致。你自己的脚本里是不是格式不对? - CURL选项缺失:比如有没有开启
CURLOPT_POST、正确设置CURLOPT_POSTFIELDS传递表单数据,或者有没有禁用SSL验证(虽然不推荐,但某些环境下关闭CURLOPT_SSL_VERIFYPEER才能正常请求)。
快速验证方法
用curl命令手动测试,确认你的密钥和域名确实有效:
curl -s --user 'api:key-mailgunkey' https://api.mailgun.net/v3/SendingDomain/messages \ -F from='Mailgun <user@SendingDomain>' \ -F to='test@example.com' \ -F subject='Test Email' \ -F text='Hello from MailGun'
如果这个命令能成功发送邮件,说明你的密钥和域名没问题,问题肯定出在脚本的实现细节上;如果命令也返回401,那就要重新检查你拿到的API密钥是不是有问题(比如是不是用了测试密钥而不是生产密钥)。
补全开源脚本的完整逻辑(参考)
为了方便你对比,我把你给出的片段补全成完整可用的函数:
function send_mailgun($email, $body) { $domain = "SendingDomain"; $config = array(); $config['api_key'] = "key-mailgunkey"; $config['api_url'] = "https://api.mailgun.net/v3/" . $domain . "/messages"; $message = array(); $message['from'] = "Mailgun <user@SendingDomain>"; $message['to'] = $email; $message['subject'] = "Your Email Subject"; $message['text'] = $body; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $config['api_url']); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $message); curl_setopt($ch, CURLOPT_USERPWD, "api:" . $config['api_key']); // 核心认证配置 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 可选:如果你的环境SSL证书有问题,临时关闭验证(不推荐生产环境用) // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); curl_close($ch); return $response; }
把你自己的脚本和这个版本逐行对比,应该能很快找到问题所在。
内容的提问来源于stack exchange,提问作者YesItsMe
相关产品推荐
相关产品推荐

