Rails 6开发环境Action Mailer SMTP认证失败求助
我之前也碰到过一模一样的坑!谷歌现在对SMTP登录的限制越来越严,“允许低安全性应用”这个选项其实已经快被淘汰了,而且对启用了两步验证的账号完全无效。结合你的配置和错误日志,给你几个针对性的解决步骤:
1. 优先检查两步验证(2FA)状态
如果你给谷歌账号开了两步验证,绝对不能用普通的邮箱密码,必须生成应用专用密码:
- 登录你的谷歌账号,进入「安全」设置页面
- 找到「应用专用密码」选项(需要先验证你的身份)
- 生成一个专门用于Rails邮件发送的密码,然后把
config.action_mailer.smtp_settings里的:password换成这个生成的密码
2. 确认“低安全应用访问”是否真的生效(仅适用于未开2FA的账号)
谷歌现在已经把“允许低安全性应用”的入口藏得很深了:
- 登录谷歌账号,搜索「Less secure app access」直接进入设置页
- 确保这个开关是打开的,但要注意:这个功能会在2024年之后完全移除,长期来看还是推荐用应用专用密码
3. 核对SMTP配置的细节
你的基础配置是对的,但要再确认几个点:
:user_name必须是完整的邮箱地址(比如name@gmail.com,不能只写name)- 密码没有拼写错误,建议用环境变量存储密码(比如
ENV['GMAIL_SMTP_PASSWORD']),避免硬编码出错 - 确保
enable_starttls_auto: true没有被遗漏,Gmail 587端口必须启用TLS
4. 解锁谷歌账号的可疑登录限制
有时候谷歌会把本地开发环境的SMTP登录判定为可疑操作:
- 登录你的谷歌邮箱,看看有没有「可疑登录提醒」的邮件
- 点击邮件里的「这是我本人操作」,解锁账号后再尝试发送邮件
5. 长期方案:改用OAuth2认证
如果上面的方法都临时解决了问题,但想更安全合规,推荐改用OAuth2认证:
- 可以使用
gmail_oauth2gem,或者Rails官方支持的OAuth2配置 - 这种方式不需要暴露密码,也符合谷歌未来的安全政策,避免以后再出问题
你的当前配置参考
config.action_mailer.raise_delivery_errors = true config.action_mailer.perform_deliveries = true config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :user_name => "name@gmail.com", :password => "gmail-password", :authentication => :plain, :enable_starttls_auto => true, } config.action_mailer.perform_caching = true config.action_mailer.default_url_options = { :host => "localhost:3000" }
错误日志参考
[ActiveJob] [ActionMailer::MailDeliveryJob] [3d533896-b670-404f-baa7-aaf9ecd8ff81] Error performing ActionMailer::MailDeliveryJob (Job ID: 3d533896-b670-404f-baa7-aaf9ecd8ff81) from Async(mailers) in 9827.83ms: Net::SMTPAuthenticationError (535-5.7.8 Username and Password not accepted. Learn more at ):
C:/Ruby26-x64/lib/ruby/2.6.0/net/smtp.rb:981:incheck_auth_response' C:/Ruby26-x64/lib/ruby/2.6.0/net/smtp.rb:736:inauth_plain'
C:/Ruby26-x64/lib/ruby/2.6.0/net/smtp.rb:728:inauthenticate' C:/Ruby26-x64/lib/ruby/2.6.0/net/smtp.rb:565:indo_start'
C:/Ruby26-x64/lib/ruby/2.6.0/net/smtp.rb:518:in `start'
内容的提问来源于stack exchange,提问作者abc

