2024年3月19日Google SMTP应用密码突发失效求助
Rails Action Mailer 用谷歌SMTP+App Password发邮件,显示成功但无已发送记录且App Password无使用痕迹
问题概述
- 未改动代码,使用Ruby on Rails Action Mailer通过谷歌SMTP发邮件,采用App Password,不受2024年低安全性应用停用政策影响
- 已尝试生成新App Password、重新开启/关闭双重认证,问题依旧
- 核心异常:后端收到谷歌返回的发送成功响应,但邮件未出现在谷歌账号的已发送文件夹;App Password页面显示新密码无使用记录,旧密码最后使用日期为3月18日
- 额外测试:端口465无法发送,切换到587可获取成功响应,但问题仍存在;另一个谷歌账号用同样方案也无效
排查建议
1. 确认App Password的生成规范
- 生成App Password时,必须选择「Mail」应用类型,不要选「Other (Custom name)」,部分场景下自定义类型会有隐性权限限制
- 核对谷歌账号安全性页面,确保双重认证处于开启状态(App Password仅对开启双认证的账号生效)
2. 验证环境变量加载正确性
- 打开Rails控制台,执行
ENV["email_requests"]和ENV["email_requests_password"],确认输出的邮箱和App Password与谷歌后台生成的完全一致(注意不要有多余空格、大小写错误) - 可以临时把配置里的密码换成硬编码的App Password做测试,排除环境变量加载失败的问题
3. 检查邮件发送逻辑是否实际执行
- 确认调用Action Mailer的代码没有被条件分支跳过,若用了异步发送(比如Sidekiq),要检查异步队列是否正常运行、任务是否被执行
- 在发送邮件的代码前后加日志,比如:
查看日志确认参数正确,且确实触发了发送动作Rails.logger.info "准备发送邮件,使用账号:#{ENV["email_requests"]}" Rails.logger.info "使用的App Password:#{ENV["email_requests_password"]}" YourMailer.your_method.deliver_now Rails.logger.info "邮件发送请求已提交"
4. 手动模拟SMTP发送流程
- 用telnet手动连接谷歌SMTP服务器,模拟发送流程,排查是否是Rails配置之外的问题:
注:base64编码可以用命令生成:# 连接服务器 telnet smtp.gmail.com 587 # 发送EHLO命令 EHLO gmail.com # 启动TLS加密 STARTTLS # 认证(把<base64字符串>替换成你生成的编码) AUTH PLAIN <base64编码的"你的邮箱\0你的App Password"> # 设置发件人 MAIL FROM:<your-email@gmail.com> # 设置收件人 RCPT TO:<recipient@example.com> # 开始写邮件内容 DATA Subject: 测试邮件 这是测试内容。 . # 退出连接 QUITecho -n "your-email@gmail.com\0your-app-password" | base64
完成后检查谷歌账号的已发送文件夹,若手动发送也无记录,说明是谷歌账号层面的问题;若手动发送成功,再回到Rails配置排查
5. 调整Action Mailer配置细节
- 尝试添加
openssl_verify_mode: 'none'到smtp_settings,排除SSL证书验证问题(仅测试用,生产环境不建议) - 把
authentication: "plain"改成authentication: :login,部分环境下认证方式兼容性不同
原配置代码
config.action_mailer.smtp_settings = { address: "smtp.gmail.com", port: 587, domain: "gmail.com", authentication: "plain", enable_starttls_auto: true, user_name: ENV["email_requests"], password: ENV["email_requests_password"] }
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

