Метод доставки почты в рельсах во время выполнения
Я пытаюсь настроить приложение 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
, если вы отправляете электронные письма с подтверждением учетной записи при создании учетной записи, например.