我正在尝试设置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吗?
答案 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
中非常有用。