Rails Heroku 上的 ActionMailer 拦截器

Rails ActionMailer interceptor on Heroku

我尝试在我的 Rails 应用程序中注册一些 ActionMailer 拦截器。 例如,在我的 /config/initializers/mailer.rb

if Rails.env.staging?
  class PrefixStagingMailSubject
    def self.delivering_email(mail)
      mail.subject = "TEST #{mail.subject}"
    end
  end
  ActionMailer::Base.register_interceptor(PrefixStagingMailSubject)
end

这在我的开发机器上运行良好。但它不在 Heroku 服务器上。

偶尔我发现它在 Devise 发送的邮件中有效(例如重设密码邮件)。这意味着拦截器虽然已经注册。

但在我的邮件中它仍然不起作用。例如我的 ReportsMailer

class ReportsMailer < ActionMailer::Base
  def report_email(email, title, public_url)
    subject = "The #{title} report you've requested was generated"
    body = <<-EOS
      The #{title} report you've requested was generated
      You can download it by clicking the link below:

      ------------
      #{public_url}
    EOS

    mail(to: email, subject: subject, body: body)
  end
end

可能是哪里出了问题?

有人可以帮助我吗? 谢谢。

所以我觉得很傻。
消息发送由 Sidekiq 处理。
但是我完全忘记了 Sidekiq 有它自己的 ENV.
我有 config/initializers/mailer.rb 和以下代码

if Rails.env.staging?
  class PrefixStagingMailSubject
    def self.delivering_email(mail)
      mail.subject = "TEST #{mail.subject}"
    end
  end
  ActionMailer::Base.register_interceptor(PrefixStagingMailSubject)
end

所以我认为问题是 Sidekiq 运行 没有指定
ENV 并有一些默认值 ENV(可能是开发)。

我像这样更新了我的 Procfile 文件

web: ...
worker: bundle exec sidekiq -e $SIDEKIQ_ENV ...

并在 Heroku 配置中设置 SIDEKIQ_ENV = staging

现在一切似乎工作正常。