Как мне захватить выходные данные электронного письма в Rails и поместить его в переменную

#ruby-on-rails #actionmailer

#ruby-on-rails #actionmailer

Вопрос:

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

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

Ответ №1:

Как указал МаКстретч, observer — лучший способ обрабатывать каждое сообщение, доставляемое почтовой программой. Однако, если вы хотите просто записать 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
  

Комментарии:

1. По какой-то причине MyMailer.foobar выдает ошибку «неопределенный метод ‘foobar’ для MyMailer: Class» … где имена функций и классов были изменены для защиты виновных. Странно, что сначала это работало.

2. Разобрался… версия Rails 2 должна быть ‘mail = MyMailer.create_foobar(…)’ …

3. Если вам нужно записать HTML и текст отдельно: mail.parts[0].body (текст) mail.parts[1].body (HTML)

Ответ №2:

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

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

Объект observer должен реализовать метод:delivered_email (сообщение), который будет вызываться один раз для каждого электронного письма, отправленного после отправки электронного письма.

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

Комментарии:

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