Как мне перехватить вывод письма в Rails и поместить его в переменную - PullRequest
6 голосов
/ 28 апреля 2011

Вывод сообщения электронной почты, отправленного из вывода ActionMailer в журнал, я хотел знать, смогу ли я получить этот вывод в переменную, чтобы сохранить его в файле.

Ps. Я забыл упомянуть, что это на Rails 2

Ответы [ 2 ]

7 голосов
/ 28 апреля 2011

Как указывал McStretch, наблюдатель - лучший способ обработать каждое сообщение, отправленное почтовой программой.Однако, если вы хотите захватить 1 или 2 особых случая, вы можете сделать следующее:

Предполагая, что у вас есть подкласс ActionMailer с именем MyMailer и электронное письмо с именем 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
2 голосов
/ 28 апреля 2011

Вы можете использовать методы register_interceptor или register_observer в ActionMailer, чтобы сделать что-то до или после отправки почты, соответственно.Состояние документации ActionMailer:

Action Mailer предоставляет хуки в методы обозревателя и перехватчика почты.Они позволяют регистрировать объекты, которые вызываются в течение жизненного цикла доставки почты.

Объект-наблюдатель должен реализовывать метод: delivery_email (message), который будет вызываться один раз для каждого письма, отправленного после того, как письмо было отправлено.

В объекте-перехватчике должен быть реализован метод: deliverying_email (message), который будет вызываться до отправки электронного письма, что позволит вам внести изменения в электронное письмо до того, как оно попадет агентам доставки.Ваш объект должен внести необходимые изменения непосредственно в переданный экземпляр Mail :: 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
...