Метод доставки почты в рельсах во время выполнения

Я пытаюсь настроить приложение 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

Проблема заключается в том, что я не уверен, как на самом деле установить изменение того, какой метод доставки почты используется для данного сообщения. Есть идеи? Можно ли даже динамически выбирать, какой метод доставки следует использовать?

Ответ 1

Итак, оказывается, что вы действительно можете передать Proc в качестве параметра по умолчанию на ActionMailer.

Таким образом, вполне возможно сделать это:

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

Я не уверен, что я действительно уверен, что мне нравится это решение, но оно работает пока, и это будет только на относительно короткий промежуток времени.

Ответ 2

Вы также можете передать параметр: delivery_method в почтовый метод:

def notification
  mail(:from => '[email protected]',           
       :to => '[email protected]', 
       :subject => 'Subject',
       :delivery_method => some_condition ? :foo : :bar)
end

Ответ 3

Вы можете создать отдельный подкласс ActionMailer и изменить параметры доставки_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

Ответ 4

Обратите внимание, что вы также можете открыть конфигурацию приложения для динамического изменения способа доставки в масштабе всего приложения:

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

Это может быть полезно в db/seeds.rb, если вы отправляете электронные письма с подтверждением учетной записи при создании учетной записи, например.