如何在Laravel应用中正确配置Mailgun?邮件发送失败求助
解决Laravel Mailgun邮件无法发送的问题及正确配置指南
嘿,咱们来搞定你遇到的这个Mailgun配置问题——你踩了一个超常见的小坑!从你给出的.env配置来看,核心问题出在MAILGUN_DOMAIN的取值上,下面一步步帮你修正并梳理正确的配置流程:
第一步:修正.env的核心错误
你现在把MAILGUN_DOMAIN填成了完整的API URL,但这个配置项只需要填写你的Mailgun专属域名(沙箱环境是sandboxxxxxxxxxxxxxxx.mailgun.org格式,生产环境就是你自己绑定的域名),不需要带https://api.mailgun.net/v3/前缀。
修正后的.env配置示例(区分Laravel版本):
Laravel 6.x及以上版本
MAIL_MAILER=mailgun MAILGUN_DOMAIN=sandboxxxxxxxxxxxxxxx.mailgun.org MAILGUN_SECRET=key-xxxxxxxxxxxxxx MAIL_FROM_ADDRESS=你在Mailgun验证过的邮箱@xxx.com MAIL_FROM_NAME="${APP_NAME}"
Laravel 5.x版本
MAIL_DRIVER=mailgun MAILGUN_DOMAIN=sandboxxxxxxxxxxxxxxx.mailgun.org MAILGUN_SECRET=key-xxxxxxxxxxxxxx MAIL_FROM_ADDRESS=你在Mailgun验证过的邮箱@xxx.com MAIL_FROM_NAME="${APP_NAME}"
划重点:Laravel 6+把
MAIL_DRIVER改成了MAIL_MAILER,别搞错版本对应关系!
第二步:完成必要的后续检查
- 清除配置缓存:修改.env后必须执行这两个命令,避免Laravel读取旧的缓存配置:
php artisan config:clear php artisan cache:clear - 核对密钥和域名:去Mailgun后台确认
MAILGUN_SECRET是你的API密钥(开头是key-),域名是后台显示的完整沙箱/自定义域名,不要漏写后缀。 - 验证收件邮箱:沙箱环境下,只有你在Mailgun后台添加并验证过的邮箱才能收到测试邮件,未验证的邮箱会被Mailgun静默拦截,而且Laravel不会抛出错误(因为请求已经成功发送到Mailgun服务器了)。
- 快速测试邮件发送:可以临时加个路由测试:
Route::get('/test-mail', function () { \Illuminate\Support\Facades\Mail::raw('这是Laravel Mailgun的测试邮件', function ($message) { $message->to('你的验证邮箱@xxx.com') ->subject('Laravel Mailgun测试'); }); return '邮件已发送,请去收件箱或垃圾邮件文件夹查看!'; });
访问这个路由后,去Mailgun后台的「Logs」页面查看发送记录,如果有记录但收件箱没收到,大概率是邮件被归类为垃圾邮件,或者需要检查收件邮箱的设置。
额外注意事项
- 如果你用的是Laravel 9及以上版本,确保已经安装了Guzzle HTTP客户端(Laravel默认会带,但如果没装的话执行这个命令):
composer require guzzlehttp/guzzle - 生产环境部署时,记得把沙箱域名换成你自己在Mailgun绑定并验证过的域名,同时配置好DKIM、SPF等DNS记录,这能大幅提升邮件的送达率。
内容的提问来源于stack exchange,提问作者TheNastyPasty
相关产品推荐
相关产品推荐

