如何让ActionMailer记录已发送的消息但不包括附件?

时间:2015-02-28 00:52:01

标签: ruby-on-rails logging ruby-on-rails-3.2 actionmailer

我喜欢Rails自动记录从应用程序发出的所有消息。我喜欢的是它如何使用大量无用的Base64编码文本填充我的日志文件。这使得浏览日志文件变得很痛苦,因为我必须跳过这些兆字节长的无法读取的噪声块。它还会导致日志文件增长太快并填满磁盘。

如何让它仍然记录发送的所有邮件,但不包含任何附件?有没有办法告诉它在记录之前去除附件?或者什么?

通常我感兴趣的只是标题(主题,发送给谁)和(至少在某些时候)消息正文。

附件(文件名和类型)的列表也没有坏处 - 但是看到所有附件的完整Base64转储肯定没有用! (如果我想查看并查看附件是否正常,我已经知道如何添加一个邮件拦截器,将bcc的所有外发邮件添加到我的收件箱中。)

2 个答案:

答案 0 :(得分:2)

我最终记录了发送出去的每封邮件的以下详细信息:

  1. 标题
  2. 电子邮件的结构(哪些部分属于其他部分),包括附件列表,然后剥离所有 附件
  3. 解码的,人类可读的,可搜索的邮件正文(Rails默认是记录编码的,这对于人类来说很难阅读 并在随机的地方打破单词,使其难以搜索)
  4. 为实现这一目标,我在我的应用中覆盖了ActionMailer::Base.set_payload_for_mail并替换了this line

    payload[:mail]       = mail.encoded
    

    版本:

    1. 创建Mail对象的副本
    2. 致电mail.without_attachments!
    3. 仅记录:

      1. mail.header.encoded
      2. mail.inspect_structure(来自my fork
      3. 的输出
      4. 为每个(非附件)部分调用part.decoded的结果。
    4. 查看整个gist

答案 1 :(得分:1)

此处处理邮件正文的记录:

https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/log_subscriber.rb#L14

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

      debug { event.payload[:mail] }
    end
    # ... more methods ...
  end
end

如果要完全排除邮件正文,可以更改日志级别以排除“debug”。否则你只能选择覆盖这个方法并做自己的事情。

不幸的是event.payload[:mail]是一个字符串。删除附件可能会很麻烦。使用正则表达式显示标题不会那么难。否则,您需要从该字符串重新创建Mail对象并提取您想要的内容。

另一个选择是更改ActionMailer使用的记录器,以便它记录到它自己的文件。这至少会使您的标准Rails日志保持清洁。

https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/railtie.rb#L12