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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:40:00