Laravel使用Gmail SMTP发找回密码邮件报530 STARTTLS错误如何解决
问题原因
- 核心配置错误:Gmail SMTP服务的587端口强制要求使用TLS加密,你当前.env文件中
MAIL_ENCRYPTION参数设置为null,未启用TLS加密,因此SMTP服务器返回530错误,要求先执行STARTTLS命令。 - 配置结构冗余:你使用的
config/mail.php文件中同时存在mailers.smtp数组内的加密、账号、密码配置,和数组外层的同名配置项,Laravel 7及以上版本优先读取mailers.smtp下的配置,冗余配置可能在异常场景下引发加载冲突。 - 配置未生效:若修改.env后仅执行
config:cache,未先清除旧缓存,或是使用队列发送邮件时未重启队列进程,都会导致新配置不生效。
可行解决方案
1. 修正.env邮件配置
将.env中的MAIL_ENCRYPTION参数值改为tls,修改后完整的邮件配置如下:
MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=MyEmail@gmail.com MAIL_PASSWORD=你的Gmail应用密码 MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=MyEmail@gmail.com MAIL_FROM_NAME="${APP_NAME}"
注意:如果你的Gmail账号开启了两步验证,此处必须填写账号生成的「应用密码」,不可使用账号登录密码;目前Gmail已经下线「低安全性应用」选项,未开启两步验证的账号无法通过SMTP发信,建议先开启两步验证后生成应用密码使用
2. 清理冗余配置(可选但推荐)
删除config/mail.php中mailers数组外层的三个冗余配置项,避免优先级冲突,需要删除的内容如下:
'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME','hospitalnuestrocorazon@gmail.com'), 'password' => env('MAIL_PASSWORD','################'),
3. 刷新配置并重启服务
依次执行以下命令确保配置生效:
- 清除旧配置缓存:
php artisan config:clear - 生产环境可重新生成配置缓存:
php artisan config:cache - 若使用队列发送邮件,必须重启队列进程:
php artisan queue:restart
验证配置
配置完成后可通过tinker快速测试发信,执行php artisan tinker进入交互模式后,运行以下代码:
Mail::raw('邮件测试内容', function ($message) { $message->to('接收测试的邮箱地址')->subject('Laravel邮件测试'); });
若无报错则代表配置生效。
内容的提问来源于stack exchange,提问作者Diego Utreras
相关产品推荐
相关产品推荐

