2011-08-27 22 views
6

给出一个Mailer比如在Rails 3中,有没有办法来覆盖其上的delivery_method对ActionMailer使用不同的delivery_method只适用于单个电子邮件?

我想通过一个高优先级的传输,推动某些邮件了,和其他人使用一个忙,低优先级的方法。

我可以调整运行时的配置,并再次改变它,但是这是充满了潜在的副作用。

+0

您是否使用延迟作业或任何其他排队系统?如果是的话,你最有可能使用它们来包裹你的所有电子邮件。您可以设置一个EMAIL_ENV(每个都有不同的ActionMailer配置),类似于RAILS_ENV,并使用不同的EMAIL_ENV启动不同的工作人员。如果某些邮件通过应用程序直接传递,您可以对EMAIL_ENV有合理的默认值。 – rubish

+1

其实,这正是我正在做的。我没有描述我的问题,因为它实际上存在:)我通过自己的':queued'传递方法(进入Resque,进行一些额外的跟踪)发送邮件,然后从Resque我需要通过SMTP发送它们。事实证明,在ActionMailer :: Base的子类中设置'delivery_method'(类方法)实际上并没有全局影响,并且不需要我做什么:)我们通过Resque队列发送其他邮件,所以我没有想改变整个环境(我知道我可以以不同的方式配置不同的工作人员)。 – d11wtq

+0

很高兴知道这样的事情存在,并没有全球影响。 – rubish

回答

6

事实证明,这样做会影响只是这个特定的梅勒,在不改变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 

这些似乎并没有被记录,但工作。

+0

你可以详细说一下':high_priority'或者指向我的资源。我刚刚实施了EMAIL_ENV方法,但尚未将其推向生产。我倾向于尝试更简单的解决方案。 :) – rubish

+0

以上只是假设你已经编写了你自己的传递方法,并用'ActionMailer :: Base.add_delivery_method:high_priority,YourHighPrioritySender'(它只是实现'deliver!')将​​它添加到动作邮件程序中。如果您使用的是开箱即​​用的交付方式,您可以用':smtp'代替':high_priority'。 – d11wtq

+0

我会发表一个要旨(将不得不把它贬低一点,因为它是工作的东西)。 – d11wtq

0

我以前做的是,在一些电子邮件被通过的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 
+0

更改ActionMailer :: Base像这样有全球影响,并可能导致竞争条件,我认为。 – d11wtq

相关问题