Heroku部署Laravel用Mailgun发信报401错误如何排查解决
401 Mailgun发信错误排查方案
这个报错核心是Heroku环境下请求Mailgun接口时鉴权未通过,既然本地环境发信正常,说明Mailgun账号本身、本地配置逻辑没有问题,按以下优先级排查即可:
- 最高发原因:Heroku未加载Mailgun配置
Heroku默认不会读取随代码提交的.env文件,该文件默认在.gitignore忽略列表中,部署时根本不会上传到Heroku服务器,你本地写在.env里的密钥、域名配置在生产环境是空值,请求自然被Mailgun拒绝返回401。
解决操作:- 打开Heroku控制台对应项目的Settings页,找到Config Vars配置块
- 逐条添加和本地
.env完全一致的配置项:MAIL_MAILER=mailgunMAILGUN_DOMAIN=sandboxa0575477a07c4d46bc474dfd7d104316.mailgun.orgMAILGUN_SECRET=6fb8c8fdbd262ef08ff062388c8cb9f4-02fa25a3-ff2ddce5
- 本地装了Heroku CLI的话可以直接执行命令批量配置,执行完会自动重启服务:
heroku config:set MAIL_MAILER=mailgun MAILGUN_DOMAIN=sandboxa0575477a07c4d46bc474dfd7d104316.mailgun.org MAILGUN_SECRET=6fb8c8fdbd262ef08ff062388c8cb9f4-02fa25a3-ff2ddce5 -a 替换成你的Heroku应用名
- 第二高发原因:Laravel配置缓存未刷新
部署Laravel项目时通常会执行php artisan config:cache生成配置缓存提升性能,如果是先跑了缓存命令再加的环境变量,新配置不会被加载,还是会用旧的空值发请求。
解决操作:# 进入Heroku应用的命令行环境 heroku run bash -a 替换成你的Heroku应用名 # 清除旧配置缓存 php artisan config:clear # 重新生成配置缓存 php artisan config:cache - 其他偶发原因排查
- 检查Heroku Config Vars里填的配置值有没有多余的首尾空格、多余的引号,这类隐形字符会直接导致密钥校验失败
- 检查项目
config/services.php中的mailgun配置,不要硬编码固定的域名、密钥值,必须是从环境变量读取的格式:'mailgun' => [ 'domain' => env('MAILGUN_DOMAIN'), 'secret' => env('MAILGUN_SECRET'), ],
- 配置校验方法
所有配置改完后,在Heroku命令行执行php artisan tinker,输入config('services.mailgun')回车,打印出来的domain、secret值和你配置的完全一致,再测试发信即可恢复正常。
不要尝试把本地
.env文件提交到Heroku代码仓库来解决配置问题,这种方式既不符合Heroku部署规范,还会泄露敏感配置信息,存在安全隐患。
内容的提问来源于stack exchange,提问作者php_dev
相关产品推荐
相关产品推荐

