防止Rails记录电子邮件附件

时间:2012-01-31 02:59:38

标签: ruby-on-rails logging actionmailer

当我发送带附件的电子邮件时,数据以十六进制记录并填满我的整个日志。有没有办法禁用附件记录?我知道我可以使用config.action_mailer.logger = nil禁用邮件记录。

3 个答案:

答案 0 :(得分:15)

不幸的是,如果日志记录级别设置为:debug(非生产环境的默认级别),则附件将包含在日志中。这意味着在生产中你应该没问题,但是你的开发和临时环境在测试期间可能会膨胀。您可以拒绝整个应用程序的日志记录(config.log_level = :info),但这显然不太理想。

您可以配置自定义记录器:

config.action_mailer.logger = ActiveSupport::BufferedLogger.new("mailer.log")
config.action_mailer.logger.level = ActiveSupport::BufferedLogger::Severity::INFO

Rails 4

config.action_mailer.logger = ActiveSupport::Logger.new("mailer.log")
config.action_mailer.logger.level = ActiveSupport::Logger::Severity::INFO

这将拆分日志,但您可以将日志记录级别更改隔离到操作邮件程序。

答案 1 :(得分:0)

Application.rb中,您可以尝试过滤附件参数。我相信这应该可以解决问题,但我自己没有测试过它

config.filter_parameters += [:attachment]  

答案 2 :(得分:0)

如果仍然希望调试日志级别,则可以通过重写ActionMailer的LogSubscriber类来从日志输出中删除附件。查看actionmailer gem中的类,并进行相应调整。对于我的Rails 4.2.10安装,相关文件为: gems/actionmailer-4.2.10/lib/action_mailer/log_subscriber.rb

我的模块是:

module ActionMailer
  class LogSubscriber < ActiveSupport::LogSubscriber
    def deliver(event)
      info do
        recipients = Array(event.payload[:to]).join(', ')
        "\nSent mail to #{recipients}, Subject: #{event.payload[:subject]}, on #{event.payload[:date]} (#{event.duration.round(1)}ms)"
      end

      debug { remove_attachments(event.payload[:mail]) }
    end

  def remove_attachments(message)
    new_message = ''
    skip = false
    message.each_line do |line|
      new_message << line unless skip
      skip = true if line =~ /Content-Disposition: attachment;/
      skip = false if skip && line =~ /----==_mimepart/
    end
    new_message
  end
 end
end

将此文件保存到您的app /文件夹下任意位置的.rb文件中。