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

时间:2011-07-04 13:45:03

标签: ruby-on-rails-3 actionmailer interceptor

我正在尝试设置rails应用程序,以便我可以根据某些条件是否为真来选择不同的邮件传递方法。

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

ActionMailer::Base.add_delivery_method :foo
ActionMailer::Base.add_delivery_method :bar

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

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

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

4 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:9)

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

因此完全有可能这样做:

class SomeMailer < ActiveMailer::Base
  default :delivery_method => Proc.new { some_condition ? :foo : :bar }
end

我不确定我是否确定我喜欢这个解决方案,但它暂时有用,而且只会在相对较短的时间内完成。

答案 2 :(得分:3)

您可以创建一个单独的ActionMailer子类并更改delivery_method + smtp_settings,如下所示:

class BulkMailer < ActionMailer::Base  
  self.delivery_method = Rails.env.production? ? :smtp : :test
  self.smtp_settings = {
    address:   ENV['OTHER_SMTP_SERVER'],
    port:      ENV['OTHER_SMTP_PORT'],
    user_name: ENV['OTHER_SMTP_LOGIN'],
    password:  ENV['OTHER_SMTP_PASSWORD']
  }

  # Emails below will use the delivery_method and smtp_settings defined above instead of the defaults in production.rb

  def some_email user_id
    @user = User.find(user_id)
    mail to: @user.email, subject: "Hello #{@user.name}"
  end
end

答案 3 :(得分:2)

请注意,您还可以打开应用程序的配置,以动态更改应用程序范围内的交付方式:

SomeRailsApplication::Application.configure do
  config.action_mailer.delivery_method = :file
end

如果您在创建帐户时发送帐户确认电子邮件,则此功能在db/seeds.rb中非常有用。