6

我希望从我们的暂存服务器发送的所有电子邮件的主题中都包含“[STAGING]”这个短语。在 Rails 3.2 中使用 ActionMailer 有没有一种优雅的方法来做到这一点?

4

3 回答 3

19

这是我根据现有答案使用ActionMailer Interceptor找到的一个优雅的解决方案。

# config/initializers/change_staging_email_subject.rb
if Rails.env.staging?
  class ChangeStagingEmailSubject
    def self.delivering_email(mail)
      mail.subject = "[STAGING] " + mail.subject
    end
  end
  ActionMailer::Base.register_interceptor(ChangeStagingEmailSubject)
end
于 2012-12-12T00:31:39.797 回答
5

这适用于 Rails 4.x

class UserMailer < ActionMailer::Base
  after_action do
    mail.subject.prepend('[Staging] ') if Rails.env.staging?
  end

  (...)
end
于 2017-08-02T03:22:47.047 回答
0

并非如此,继承就像它得到的一样优雅。

class OurNewMailer < ActionMailer::Base

  default :from => 'no-reply@example.com',
          :return_path => 'system@example.com'

  def subjectify subject
    return "[STAGING] #{subject}" if Rails.env.staging?
    subject
  end
end

然后,您可以从每个邮件程序继承。

# modified from the rails guides
class Notifier < OurNewMailer

  def welcome(recipient)
    @account = recipient
    mail(:to => recipient.email_address_with_name, :subject => subjectify("Important Message"))
  end
end

我认为这不像您希望的那样干净,但这会使它有点干涸。

于 2012-12-11T02:35:43.760 回答