Отфильтровать адреса электронной почты из журналов ActionMailer
при отправке писем через Actionmailer в Rails он регистрирует что-то вроде:
Sent mail to example@example.com (72ms)
Rendered mailer/_header.html.erb (0.0ms)
...
Я хотел бы отфильтровать электронные письма из журналов фильтрация параметров ala
Sent mail to [FILTERED] (72ms)
Rendered mailer/_header.html.erb (0.0ms)
...
есть ли чистый способ сделать это? В качестве альтернативы, не регистрировать всю первую строку будет нормально.
2 ответов
вы можете сделать обезьяну-исправление для вашего текущего действия mailer:
- найти исходный код gem для вашей версии rails (в моем случае это в~/.rvm/gems/xxx@railsx/gems/actionmailer-x.x.x/lib/action_mailer
- найти метод, который содержит "отправленные сообщения"
-
создайте файл в каталоге " lib "с таким содержимым (скопируйте и вставьте код из шага 2 и измените "получатели" на "[FILTERED]":
module ActionMailer class LogSubscriber < ActiveSupport::LogSubscriber def deliver(event) return unless logger.info? #recipients = Array(event.payload[:to]).join(', ') info("\nSent mail to [FILTERED] (#{event.duration.round(1)}ms)") debug(event.payload[:mail]) end end end
для моей версии action_mailer код будет такой:
def deliver!(mail = @mail)
raise "no mail object available for delivery!" unless mail
unless logger.nil?
logger.info "Sent mail to [FILTERED]"
# instead of original logger.info "Sent mail to #{Array(recipients).join(', ')}"
logger.debug "\n#{mail.encoded}"
end
begin
__send__("perform_delivery_#{delivery_method}", mail) if perform_deliveries
rescue Exception => e # Net::SMTP errors or sendmail pipe errors
raise e if raise_delivery_errors
end
return mail
end
в исходном коде Rails ./actionmailer/lib/action_mailer/log_subscriber.rb
:
module ActionMailer
class LogSubscriber < ActiveSupport::LogSubscriber
def deliver(event)
return unless logger.info?
recipients = Array(event.payload[:to]).join(', ')
info("\nSent mail to #{recipients} (#{event.duration.round(1)}ms)")
debug(event.payload[:mail])
end
def receive(event)
return unless logger.info?
info("\nReceived mail (#{event.duration.round(1)}ms)")
debug(event.payload[:mail])
end
def logger
ActionMailer::Base.logger
end
end
end
Rails не предоставляет метод фильтрации электронной почты, поэтому вы можете:
- fork rails, удалите эту информацию и используйте свою раздвоенную версию rails.
- отредактируйте этот код, добавьте фильтр и сделайте запрос на вытягивание.