Laravel配置Gmail SMTP发邮件报535认证失败如何解决
SMTP 535认证失败排查与解决方案
Gmail SMTP返回535用户名密码不接受错误,核心原因是Gmail已禁止使用账号登录密码直接走第三方SMTP认证,同时现有配置和代码存在几处会触发拦截的问题,按以下步骤逐一排查修复即可:
第一步:修正基础配置与代码错误
- 统一发件人地址:当前
.env中MAIL_FROM_ADDRESS设为null,代码里硬编码的发件人是xyz@gmail.com,和SMTP登录账号phptest01072003@gmail.com不一致,Gmail会直接判定为伪造发件人拦截请求。需要将.env中MAIL_FROM_ADDRESS的值改为和MAIL_USERNAME一致的邮箱地址,同时删除代码里硬写的$message->from(...)行,由Laravel自动读取配置生成发件人信息。 - 清除配置缓存:修改
.env文件后必须执行php artisan config:clear,否则Laravel会继续读取缓存中的旧配置,修改不生效。 - 可选逻辑优化:当前代码把发信成功提示放在
withErrors方法中传递,这个方法是专门用来返回表单校验错误的,成功提示建议改用->with('success', 'MAIL SENT SUCCESSFULLY')传递,避免前端提示样式错乱,该问题不影响SMTP认证流程。
第二步:使用Gmail应用密码替代账号登录密码(个人项目优先选这个方案,配置最简单)
Gmail现在仅支持两种SMTP认证方式:应用密码、OAuth2,直接填账号登录密码必然报错。使用应用密码的前提是Gmail账号已经开启两步验证,操作流程:
- 进入Gmail账号的安全设置页面
- 找到「应用密码」入口(仅开启两步验证后才会显示该选项)
- 应用类型选择「邮件」,设备选择当前部署项目的服务器/开发设备,点击生成
- 将生成的16位应用密码替换
.env中MAIL_PASSWORD字段的原有值,不要填写平时登录Gmail用的账号密码
第三步:备选方案(不想开两步验证时使用):配置XOAUTH2认证
如果不想开启两步验证,就不能用LOGIN/PLAIN认证方式,需要走XOAUTH2流程:
- 在Google云控制台创建OAuth2凭据,获取客户端ID、客户端密钥、刷新令牌
- 安装Laravel对应的Gmail OAuth2驱动扩展包
- 将获取到的OAuth凭据填入
.env对应配置项,将邮件认证驱动改为XOAUTH2即可
该方案配置流程比应用密码复杂,非必要不选。
第四步:连通性验证
改完配置清缓存后先在测试环境验证发信,如果还是报错,逐一确认:
- 填写的应用密码没有多输空格、漏输字符
- 服务器出方向的587端口没有被防火墙、安全组拦截
- 服务器IP没有被Gmail列入黑名单(国内云服务器IP经常会被Gmail拦截,出现这种情况建议换用第三方邮件服务)
修正后的参考配置
.env邮件部分配置:
MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=phptest01072003@gmail.com MAIL_PASSWORD=生成的16位Gmail应用密码 MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=phptest01072003@gmail.com MAIL_FROM_NAME="${APP_NAME}"
修正后的发信代码:
public function html_email() { $data = array('name'=>"HJ KING"); Mail::send('layout.forgotpasswordmodel', $data, function($message) { $message->to(session('forgotemail'), 'HII, '.session('forgotfname'))->subject('ForgotPassword'); // 移除硬编码的发件人配置,统一读取.env }); return redirect()->back()->with('success', 'MAIL SENT SUCCESSFULLY'); }
内容的提问来源于stack exchange,提问作者hjking01072003
相关产品推荐
相关产品推荐

