You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Heroku上Ruby应用使用Gmail SMTP偶发Net::SMTPAuthenticationError问题

问题成因
  • Heroku免费dyno连续30分钟无访问流量就会进入休眠状态,重新被唤醒时会重置所有运行时缓存,之前建立的SMTP会话会直接失效,需要重新发起身份校验
  • Heroku dyno重启后会随机分配出口IP,Gmail的安全策略会把陌生IP的登录请求判定为可疑操作,直接拦截SMTP校验请求
  • 你参考的旧方案用到的「允许低安全性应用访问」功能,谷歌早在2022年就对普通个人Gmail账号全面下线,该配置本身就不具备长期有效性,很容易触发校验失败
谷歌账号侧永久修复配置

必须先给你的Gmail账号开启两步验证,这是后续配置的前置要求:

  • 进入谷歌账号「安全性」管理页面,找到应用专用密码入口,选择对应应用/设备分类生成16位无空格的专用密码
  • 把你Ruby应用SMTP配置里的原Gmail账号登录密码,替换成刚才生成的应用专用密码

应用专用密码不受IP变动、登录态过期影响,也不会触发常规账号的安全拦截规则,完全适配Heroku免费dyno的重启逻辑。
如果你的发信量每月超过100封,建议升级到Google Workspace账号,配置SMTP中继服务,可自定义信任IP段、发信额度更高,完全规避个人账号的各类SMTP限制。

Ruby应用适配优化

调整生产环境的Action Mailer SMTP配置,避免休眠唤醒后首次发信报错,配置示例如下:

# config/environments/production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  address:              'smtp.gmail.com',
  port:                 587,
  domain:               '替换为你的Heroku应用域名',
  user_name:            '替换为你的Gmail完整账号',
  password:             '替换为你生成的16位应用专用密码',
  authentication:       'plain',
  enable_starttls_auto: true,
  open_timeout:         5,
  read_timeout:         5
}
  • 新增超时配置,避免休眠后首次建立SMTP连接超时直接抛出异常
  • 不要开启SMTP连接池复用,每次发信新建连接即可适配dyno重启后的场景

内容的提问来源于stack exchange,提问作者me1960

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:27:00