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

Rails 7调用deliver_now报错,寻求可用deliver_now的邮件发送方案

Rails 7中Mailer使用deliver_now报错的解决方法

问题根源

deliver_now是Rails Action Mailer为邮件对象扩展的方法,而deliver是底层Mail gem原生提供的方法。你遇到的错误是因为当前返回的是原生Mail::Message对象,没有被Action Mailer注入扩展方法,所以找不到deliver_now。

导致问题的核心原因:

  • 手动实例化Mailer类并调用方法,未触发Action Mailer内部的扩展加载机制
  • 使用Ruby关键字send作为邮件动作方法名,存在潜在冲突

修复方案

1. 规范Mailer类写法

遵循Rails Action Mailer设计规范,不要自定义初始化方法,改为通过邮件动作方法传递参数,同时避免使用关键字作为方法名:

class Mailer < ApplicationMailer
  # 替换send为send_notification,规避关键字冲突
  def send_notification(emails)
    mail(
      to: emails,
      from: 'example@gmail.com',
      subject: 'example'
    )
  end
end

2. 调整MailService调用逻辑

Action Mailer推荐通过类方法调用邮件动作,框架会自动处理实例化和扩展注入,确保返回的邮件对象带有deliver_now方法:

class MailService 
  def initialize(sender:)
    @sender = sender
  end    

  def submit_mail(emails)
    # 通过类方法调用邮件动作,再调用deliver_now
    @sender.send_notification(emails).deliver_now
  end 
end

3. 正确调用代码

# 传入Mailer类作为sender参数
mail_service = MailService.new(sender: Mailer)
mail_service.submit_mail('johndoe@gmail.com')

原理说明

当通过Action Mailer类方法调用邮件动作时,框架会自动创建Mailer实例,并为返回的Mail::Message对象注入Action Mailer扩展方法(包括deliver_now、deliver_later等);而手动实例化Mailer并调用方法时,这个注入过程不会触发,只能使用原生的deliver方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:11:27