如何在Rails中捕获电子邮件的输出并将其放入变量中

时间:2011-04-28 17:58:17

标签: ruby-on-rails actionmailer

从ActionMailer输出发送到日志的电子邮件的输出,我想知道我是否可以将该输出转换为变量,以便将其存储在文件中。

Ps。我忘了提到这是在Rails 2上

2 个答案:

答案 0 :(得分:7)

正如McStretch指出的那样,观察者是处理邮件传递的每条消息的最佳方式。但是,如果您只想捕获1或2个特殊情况,则可以执行以下操作:

假设您有一个名为MyMailer的ActionMailer子类,以及一封名为foobar的电子邮件,

# Rails 2.x
mail = MyMailer.create_foobar(...) # instead of MyMailer.deliver_foobar(...)
File.open('filename.txt', 'wb') {|f| f.write(mail.body) }
MyMailer.deliver(mail)

# Rails 3.x
mail = MyMailer.foobar(...) # instead of MyMailer.foobar(...).deliver
File.open('filename.txt', 'wb') {|f| f.write(mail.body) }
mail.deliver

答案 1 :(得分:2)

您可以使用ActionMailer上的register_interceptorregister_observer方法分别在发送邮件之前或之后执行操作。 ActionMailer文档声明:

  

Action Mailer提供了钩子   邮件观察者和拦截器方法。   这些允许您注册对象   在邮件中调用的   交货生命周期。

     

观察者对象必须实现   :deliver_email(message)方法   每封电子邮件都会调用一次   电子邮件发送后发送。

     

拦截器对象必须实现   :deliver_email(message)方法   将在电子邮件之前调用   被发送,允许你做   修改之前的电子邮件   点击送货代理商。你的对象   应该做和需要修改   直接传入   邮件::邮件实例。

这些方法中的每一个都提供了一个Mail :: Message作为参数,因此您应该能够从该对象获取所需的数据并将其保存在某处:

class  MyInterceptor
  def self.delivering_email(mail)
    # do something before sending the email
  end
end

class MyObserver
  def self.delivered_email(mail)
     # do something after sending the email
  end
end