Rails7 Action Mailer发送Gmail邮件报timeout方法未定义500错误
问题原因
该报错是版本兼容问题:Ruby 3.1及以上版本对标准库Net::SMTP做了API调整,移除了原有的timeout=实例方法,拆分出open_timeout、read_timeout两个独立超时配置项。而Rails 7部分版本的SMTP投递适配器没有适配这个变更,会默认尝试调用已被移除的timeout方法,直接触发NoMethodError。
修复方案
- 第一步:清理冗余配置
你当前配置里重复对ActionMailer::Base直接赋值delivery_method、smtp_settings的写法会引发配置加载优先级问题,所有邮件配置统一通过Rails配置对象config.action_mailer设置即可,不需要单独给ActionMailer::Base类赋值。 - 第二步:显式声明超时参数
在smtp_settings配置中手动添加open_timeout和read_timeout配置项,绕过框架默认调用不存在的timeout方法的逻辑。 - 修正后的可运行配置如下(放在对应运行环境的配置文件中,比如开发环境就放在
config/environments/development.rb):
config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp config.action_mailer.perform_caching = false config.action_mailer.default_url_options = { host: 'localhost:3000', protocol: 'http' } config.action_mailer.perform_deliveries = true config.action_mailer.default charset: "utf-8" config.action_mailer.smtp_settings = { address: "smtp.gmail.com", port: 587, domain: 'localhost:3000', authentication: :plain, user_name: '你的Gmail邮箱地址', password: '已生成的Gmail应用专用密码', enable_starttls_auto: true, open_timeout: 5, read_timeout: 5 }
- 第三步:保存配置后重启Rails服务,再触发邮件发送流程即可正常投递。
补充说明:该问题不需要升级或降级Rails、Ruby相关gem包,只要显式补上两个超时配置参数、清理掉重复的类级别赋值就能解决。
内容的提问来源于stack exchange,提问作者Daniel Brito
相关产品推荐
相关产品推荐

