ActionMailer Observer:可以传递额外的属性吗?

时间:2018-01-08 22:02:28

标签: ruby-on-rails actionmailer

我有一个ActionMailer Observer,它会在每封电子邮件上被触发,并将一些信息写入日志数据库表,以跟踪谁发送电子邮件。我想添加一些元数据,如登录用户,电子邮件类型等。

class MailObserver
  def self.delivered_email(message)
    if message.header[:client_id]
      EmailLog.create!(:client_id => message.header[:client_id].to_s,
                       :to => message.to ? message.to.join(',') : nil,
                       :cc => message.cc ? message.cc.join(',') : nil,
                       :bcc => message.bcc ? message.bcc.join(',') : nil,
                       :subject => message.subject.to_s,
                       :content => message.multipart? ? message.text_part.body.decoded : message.body.decoded,
                       :reference_type => message.header[:reference_type].to_s,
                       :reference => message.header[:reference].to_s,
                       :user_id => message.header[:user_id].to_s)
    end
  end
end

ActionMailer::Base.register_observer(MailObserver)

创建邮件时,所有这些信息都可用。

我目前通过message.header传递此数据,但值显示在实际发送的电子邮件中

是否有更好的方法将信息从ActionMailers传递给Observers,同时防止实际发送这些数据?

2 个答案:

答案 0 :(得分:0)

您是否考虑过在邮件本身上使用回调?

class MyMailer < ApplicationMailer
  after_action :log_email!

  ...

  private

  def log_email!
    EmailLog.create! # should be able to access instance variables from your mailer method here to reference what you need
  end
end

希望有所帮助!

答案 1 :(得分:0)

仔细查看mail gem,除了标题之外,您无法对Mail对象上的元数据进行任何操作。

我考虑的一种方法是将message_id与用户详细信息等保持在一起,然后在观察器中再次检索它,然后执行记录。

我要玩的另一个是自己设置消息ID,并用用户ID加载消息ID,等等,但这与设置标头非常相似。

可能的话,您可以设置标头,然后在拦截器中再次取消设置标头。