Laravel集成Mailgun发送邮件返回成功但未收到邮件求助
排查Laravel+Mailgun邮件发送成功但Gmail收不到的问题
我来帮你一步步搞定这个问题,从你的配置和代码里能看到几个关键问题,咱们逐个解决:
1. .env配置完全错误(核心问题)
当你使用mailgun驱动时,根本不需要设置MAIL_HOST、MAIL_PORT这些SMTP相关参数,反而要配置Mailgun专属的环境变量。另外注意,Laravel 7及以上版本已经把MAIL_DRIVER改成了MAIL_MAILER,先把配置改成这样:
# Laravel 7+用MAIL_MAILER,6及以下用MAIL_DRIVER MAIL_MAILER=mailgun MAILGUN_DOMAIN=你的Mailgun验证域名 # 比如mg.yourdomain.com,要在Mailgun后台完成DNS验证 MAILGUN_SECRET=你的Mailgun API密钥 # 从Mailgun控制台获取 MAIL_FROM_ADDRESS=验证过的发件邮箱@你的Mailgun域名 # 必须是Mailgun域名下的邮箱,不能随便填 MAIL_FROM_NAME="你的应用名称"
解释一下:你之前填的localhost和25端口是给SMTP驱动用的,用Mailgun驱动时Laravel会直接调用Mailgun的API,所以那些参数完全没用,反而会导致配置混乱。
2. 代码里的失败判断时机错误
你的Mail::failures()放在了Mail::raw()的闭包里面,这时候邮件还没开始发送呢!Mail::raw()的闭包只是用来构建邮件内容,真正的发送操作是在闭包执行完之后才完成的,所以你的判断逻辑完全失效了。修正后的代码应该是这样:
Route::get('send_test_email', function(){ try { Mail::raw('Sending emails with Mailgun and Laravel is easy!', function($message) { $message->subject('Mailgun and Laravel are awesome!'); $message->to('*****@gmail.com'); }); // 邮件发送完成后再检查失败列表 if(count(Mail::failures()) > 0) { echo "<pre>"; print_r(Mail::failures()); die; } echo "SUCCESS";exit; } catch (\Exception $e) { return $e->getMessage(); } });
3. 额外排查步骤
除了上面的修正,还要检查这些点:
- Mailgun域名验证:必须在Mailgun后台完成DKIM、SPF等DNS记录的验证,否则邮件会被Mailgun拒绝发送,或者被Gmail直接拦截。
- 查看Mailgun日志:去Mailgun的控制台看「Logs」页面,这里会显示邮件的详细状态——是被Mailgun接受了,还是被退回,或者标记为垃圾邮件,这是最直接的排查依据。
- 检查Gmail垃圾邮件:新域名发送的第一封邮件很容易被扔进垃圾邮件文件夹,先去那里找找看。
- 清除Laravel配置缓存:修改.env之后,一定要执行
php artisan config:clear,否则Laravel会继续使用旧的缓存配置,导致新配置不生效。
内容的提问来源于stack exchange,提问作者Nikul Panchal
相关产品推荐
相关产品推荐

