Отфильтровать адреса электронной почты из журналов 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:

  1. найти исходный код gem для вашей версии rails (в моем случае это в~/.rvm/gems/xxx@railsx/gems/actionmailer-x.x.x/lib/action_mailer
  2. найти метод, который содержит "отправленные сообщения"
  3. создайте файл в каталоге " 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.
  • отредактируйте этот код, добавьте фильтр и сделайте запрос на вытягивание.