在运行时切换rails中的邮件传递方法

Fro*_*ost 10 actionmailer interceptor ruby-on-rails-3

我正在尝试设置rails应用程序,以便我可以在不同的邮件传递方法之间进行选择,具体取决于某些条件是否为真.

所以,给出两种交付方式:

ActionMailer::Base.add_delivery_method :foo
ActionMailer::Base.add_delivery_method :bar
Run Code Online (Sandbox Code Playgroud)

我以为我能够创建一个电子邮件拦截器来做这样的事情:

class DeliveryMethodChooser
  def self.delivering_email(message)
    if some_condition
      # code to use mail delivery method foo
    else
      # code to use mail delivery method bar
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

但问题是,我不确定如何实际设置更改给定邮件使用的邮件传递方法.有任何想法吗?甚至可以动态选择要使用的delivery_method吗?

小智 17

您也可以将:delivery_method选项传递给mail方法:

def notification
  mail(:from => 'from@example.com',           
       :to => 'to@example.com', 
       :subject => 'Subject',
       :delivery_method => some_condition ? :foo : :bar)
end
Run Code Online (Sandbox Code Playgroud)


Fro*_*ost 9

因此,事实证明您实际上可以将a Proc作为默认参数传递给ActionMailer.

因此完全可以这样做:

class SomeMailer < ActiveMailer::Base
  default :delivery_method => Proc.new { some_condition ? :foo : :bar }
end
Run Code Online (Sandbox Code Playgroud)

我不知道我真的知道我喜欢这个解决方案,但它工作的时间是和它只会是一个时间相对较短.