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

Laravel 8 不使用env变量发送邮件时出现主机连接报错该如何解决

问题原因

你遇到的报错是因为邮件配置完全没有生效,系统还是读取了默认的mailhog作为发信主机,你当前的实现有3个核心错误:

  • 误用config()函数:config('配置键', '默认值')是读取配置的语法,第二个参数是读取不到配置时的 fallback 值,不会修改配置。要动态设置运行时配置,需要给config()传入关联数组参数:config(['配置键' => '配置值'])
  • 配置键名错误:Laravel 8 采用多邮件器架构,邮件相关配置都在mail配置组下,并非直接使用.env文件里的MAIL_*常量名作为顶级配置键
  • 缺失发件人配置:没有设置发件人地址和名称,会导致发信时出现额外错误

正确实现代码

// 动态设置运行时邮件配置,不需要依赖.env文件
config([
    'mail.default' => 'smtp',
    'mail.mailers.smtp.host' => 'smtp.gmail.com',
    'mail.mailers.smtp.port' => 587,
    'mail.mailers.smtp.encryption' => 'tls',
    'mail.mailers.smtp.username' => '你的Gmail邮箱地址',
    'mail.mailers.smtp.password' => '你的Gmail应用专用密码',
    'mail.from.address' => '发件人邮箱地址(需和上面的Gmail地址一致)',
    'mail.from.name' => '发件人显示名称'
]);

// 发信逻辑
$invitedUser = new Admin();
$invitedUser->email = "收件人邮箱地址";
$invitedUser->notify(new TestingNotification());

额外注意事项

  • 现在Gmail已经不支持直接使用账号密码发信,你需要先在Google账号后台开启两步验证,然后生成应用专用密码填入上面的密码配置项
  • 如果你的通知使用队列发送,动态配置只在当前请求进程生效,提前启动的队列进程不会读取到这个配置,需要改为同步发送,或者在队列任务执行时再重新设置一遍邮件配置

内容的提问来源于stack exchange,提问作者Pankaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:06