Laravel服务器Mail::send SMTP认证失败,本地运行正常问题咨询
问题:Laravel服务器Mail::send函数失效但本地正常运行
近期我们的Laravel服务器上的Mail::send函数突然停止工作,但本地运行该函数却一切正常。
代码示例
Mail::send( 'emails.hello', $data, function ($message) use ($data) { $message->from('admin@example.org', 'Admin'); $message->to('recipient@example.org', 'Admin') ->replyTo($data['email'], $data['name']) ->subject('Contact Request'); } );
环境配置说明
服务器与本地实例的.env配置完全一致,且已执行php artisan config:cache确保加载当前.env文件:
MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=xxx MAIL_PASSWORD=xxx MAIL_ENCRYPTION=tls
两者均运行Laravel 5.5.50,服务器PHP版本为7.2.24,本地为7.4.33。
服务器返回错误信息
Failed to authenticate on SMTP server with username "xxx" using 3 possible authenticators. Authenticator LOGIN returned Expected response code 235 but got code "535", with message "535-5.7.8 Username and Password not accepted.
我的邮箱已开启双因素认证,使用应用密码进行验证。请问这是Laravel配置问题还是Google邮箱配置问题?
问题排查与分析
从错误信息535-5.7.8 Username and Password not accepted来看,核心是SMTP认证失败,结合本地正常、服务器异常的差异,大概率是Google邮箱侧的配置/限制问题,而非Laravel配置问题,具体排查方向如下:
- 服务器IP被Google安全机制拦截:Google会对陌生或异常IP的SMTP登录行为进行拦截。你可以登录Google账号的安全中心,查看最近的登录记录,确认服务器IP是否被标记为可疑,若有则手动允许该IP的访问权限。
- 应用密码有效性验证:虽然本地能正常使用,但要确认服务器
.env中的MAIL_PASSWORD是否完全匹配正确的应用密码(注意不要有空格、大小写错误)。另外,当Google账号的安全设置变更时,应用密码可能会失效,建议重新生成一个应用密码替换到服务器.env中,替换后务必执行php artisan config:cache刷新配置缓存。 - 服务器网络限制检查:排查服务器的防火墙、安全组是否拦截了587端口的出站请求,导致无法连接Google SMTP服务器。可以在服务器上执行
telnet smtp.gmail.com 587测试是否能正常建立连接。 - Laravel与PHP版本兼容性(低概率):虽然错误指向认证而非连接,但服务器PHP7.2与Laravel5.5的组合,可能存在TLS握手的兼容性问题。可以尝试将
MAIL_ENCRYPTION改为ssl、MAIL_PORT改为465测试,但需确保Google账号允许SSL方式的SMTP访问。
内容的提问来源于stack exchange,提问作者brassmookie
相关产品推荐
相关产品推荐

