我有一个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,同时防止实际发送这些数据?
答案 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,等等,但这与设置标头非常相似。
可能的话,您可以设置标头,然后在拦截器中再次取消设置标头。