2011-04-28 47 views

回答

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 
+0

出于某种原因MyMailer.foobar正在抛出一个错误“未定义的方法foobar”MyMailer:类“...其中功能和类的名称已被改变,以保护有罪。奇怪的是,它起初工作。 – concept47 2011-04-28 21:41:50

+0

想通了...... Rails 2版应该是'mail = MyMailer.create_foobar(...)'... – concept47 2011-04-28 21:50:19

+0

哎呀,对不起。纠正。 – 2011-04-28 21:52:19

2

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

动作邮件程序提供挂钩到 Mail观察者和拦截器方法。 这些允许您注册邮件 传递生命周期期间调用的对象 。

一个观察者对象必须实现 :这 将被用于电子邮件发送后发送每封电子邮件 一度被称为delivered_email(消息)方法。

的拦截对象必须实现 的:delivering_email(消息)方法 发送电子邮件 之前将被调用,方便用户进行 修改电子邮件它 击中投递代理之前。您的对象 应该直接将 修改为 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 
+0

我忘了提到这是在Rails 2 – concept47 2011-04-28 19:14:33

相关问题