Rails,每次发送电子邮件时如何保留db表日志

时间:2011-11-06 23:13:58

标签: ruby-on-rails ruby-on-rails-3 actionmailer

我的应用程序有一个带有多种邮件程序方法的UserMailer,其中大多数是通过延迟作业发送的。

我想要的是一个数据库表,每次发送邮件时都会创建一个记录。该应用程序使用sendgrid发送,但我不相信sendgrid 100%,并希望在应用程序上保留一个记录进行调试。

当发送邮件并将其记录在数据库中时,是否存在一种全局捕获的高级方法,而不是强制将逻辑添加到邮件程序中?

由于

2 个答案:

答案 0 :(得分:2)

您可以创建一个Observer类并拦截注册观察者的AcctionMailer类中的每个传递。

看看这个答案:

How do I create a Mailer Observer

答案 1 :(得分:1)

我通过使用电子邮件模型来解决这个问题,使用"来"和" guid"字符串字段。

def self.deliver(which, to, guid, *args)
  transaction do
    if self.where(:email => to, :guid => guid).first.nil?
      if record = Email.create(:email => to, :guid => guid, :template => which) and !record.new_record?
        Mailer.send("deliver_#{which}", to, *args)
      end
    end
  end
end

这适用于Rails 2.3邮件程序,因此Rails 3的调用稍有不同,但核心概念仍然存在。您不必直接调用邮件程序,而是调用:

Email.deliver(email_name, receipient, some_guid_you_generate_for_this_email, *args_to_be_sent_to_mailer)

这将检查数据库,以确保您不会将同一封电子邮件重新发送到指定地址,并会记录您将来可以检查的所有已发送电子邮件。