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
相关产品推荐
相关产品推荐

