7

在 Rails 中通过 Actionmailer 发送电子邮件时,它会记录如下内容:

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)
  ...

有没有一种干净的方法可以做到这一点?或者,不记录整个第一行也可以。

4

2 回答 2

1

在 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 没有提供过滤电子邮件的方法,因此您可以:

  • 分叉导轨,删除此信息,并使用您的分叉版本的导轨。
  • 编辑此代码,添加一些过滤器,然后发出拉取请求。
于 2013-04-30T00:41:54.063 回答
0

您可以为当前的动作邮件程序进行猴子修补:

  1. 查找您的 rails 版本的 gem 源代码(在我的情况下,它位于 ~/.rvm/gems/xxx@railsx/gems/actionmailer-xxx/lib/action_mailer
  2. 找到一个包含“Sent mail to”的方法
  3. 在“lib”目录中创建一个文件,内容如下(复制并粘贴步骤 2 中的代码,并将“recipients”更改为“[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
于 2013-05-05T13:04:37.783 回答