You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:56:59