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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 08:24:21