#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
- Пример выше от http://blog.envylabs.com/2010/04/new-in-rails3-beta2 /
Комментарии:
1. Я забыл упомянуть, что это на Rails 2