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
相关产品推荐
相关产品推荐

