给出一个Mailer
比如在Rails 3中,有没有办法来覆盖其上的delivery_method
?对ActionMailer使用不同的delivery_method只适用于单个电子邮件?
我想通过一个高优先级的传输,推动某些邮件了,和其他人使用一个忙,低优先级的方法。
我可以调整运行时的配置,并再次改变它,但是这是充满了潜在的副作用。
给出一个Mailer
比如在Rails 3中,有没有办法来覆盖其上的delivery_method
?对ActionMailer使用不同的delivery_method只适用于单个电子邮件?
我想通过一个高优先级的传输,推动某些邮件了,和其他人使用一个忙,低优先级的方法。
我可以调整运行时的配置,并再次改变它,但是这是充满了潜在的副作用。
事实证明,这样做会影响只是这个特定的梅勒,在不改变ActionMailer::Base
全球。
class SomeMailer < ActionMailer::Base
self.delivery_method = :high_priority
def some_email(params)
end
end
你也可以做到这一点(警告:会影响AnotherMailer
所有实例),如果你有实例的前期:
mail = AnotherMailer.whatever_email
mail.delivery_handler.delivery_method = :something_else
这些似乎并没有被记录,但工作。
你可以详细说一下':high_priority'或者指向我的资源。我刚刚实施了EMAIL_ENV方法,但尚未将其推向生产。我倾向于尝试更简单的解决方案。 :) – rubish
以上只是假设你已经编写了你自己的传递方法,并用'ActionMailer :: Base.add_delivery_method:high_priority,YourHighPrioritySender'(它只是实现'deliver!')将它添加到动作邮件程序中。如果您使用的是开箱即用的交付方式,您可以用':smtp'代替':high_priority'。 – d11wtq
我会发表一个要旨(将不得不把它贬低一点,因为它是工作的东西)。 – d11wtq
我以前做的是,在一些电子邮件被通过的ActionMailer发送,其他人通过发送ArMailer一个Rails 2应用程序。这不是一个坏的解决方案,只要你不改变给药方法早在相同的传递,因为这可能会导致分娩方式不符合交付错误的情况下进行更改,这是我做了什么:
class Mailer1
def my_mail1
config
end
private
def config
ActionMailer::Base.delivery_method = :smtp
end
end
class Mailer2
def my_mail2
config
end
private
def config
ActionMailer::Base.delivery_method = :sendmail
end
end
更改ActionMailer :: Base像这样有全球影响,并可能导致竞争条件,我认为。 – d11wtq
您是否使用延迟作业或任何其他排队系统?如果是的话,你最有可能使用它们来包裹你的所有电子邮件。您可以设置一个EMAIL_ENV(每个都有不同的ActionMailer配置),类似于RAILS_ENV,并使用不同的EMAIL_ENV启动不同的工作人员。如果某些邮件通过应用程序直接传递,您可以对EMAIL_ENV有合理的默认值。 – rubish
其实,这正是我正在做的。我没有描述我的问题,因为它实际上存在:)我通过自己的':queued'传递方法(进入Resque,进行一些额外的跟踪)发送邮件,然后从Resque我需要通过SMTP发送它们。事实证明,在ActionMailer :: Base的子类中设置'delivery_method'(类方法)实际上并没有全局影响,并且不需要我做什么:)我们通过Resque队列发送其他邮件,所以我没有想改变整个环境(我知道我可以以不同的方式配置不同的工作人员)。 – d11wtq
很高兴知道这样的事情存在,并没有全球影响。 – rubish