Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何让ActionMailer记录发送的邮件,但不包括附件?_Ruby On Rails_Logging_Ruby On Rails 3.2_Actionmailer - Fatal编程技术网

Ruby on rails 如何让ActionMailer记录发送的邮件,但不包括附件?

Ruby on rails 如何让ActionMailer记录发送的邮件,但不包括附件?,ruby-on-rails,logging,ruby-on-rails-3.2,actionmailer,Ruby On Rails,Logging,Ruby On Rails 3.2,Actionmailer,我喜欢Rails自动记录应用程序发送的所有消息。我不喜欢的是它如何用大量无用的Base64编码文本填充我的日志文件。这使得查看日志文件非常痛苦,因为我必须跳过这些兆字节长的无法读取的噪声块。它还会导致日志文件增长过快,并填满磁盘 我如何让它仍然记录所有发送的邮件,但不包括任何附件?有没有办法告诉it部门在登录之前删除附件 通常我所感兴趣的是标题(主题,它被发送给了谁)和(至少在某些时候)消息正文文本 还有一个附件列表(文件名和类型)也没什么坏处,但看到所有附件的完整Base64转储肯定对我没有好

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

我如何让它仍然记录所有发送的邮件,但不包括任何附件?有没有办法告诉it部门在登录之前删除附件

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


还有一个附件列表(文件名和类型)也没什么坏处,但看到所有附件的完整Base64转储肯定对我没有好处!(如果我想检查附件是否正常发送,我已经知道如何添加邮件拦截器,将密件抄送的所有邮件发送到我的收件箱。)

邮件正文的日志记录在此处处理:

模块ActionMailer
类LogSubscriber
如果要完全排除邮件正文,可以将日志级别更改为排除“调试”。否则,您唯一的选择就是重写此方法并执行您自己的操作

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

另一个选项是更改ActionMailer使用的记录器,使其记录到自己的文件中。这至少可以保持标准Rails日志的干净


最后,我让它记录了每封发出的邮件的以下详细信息:

  • 标题
  • 电子邮件的结构(哪些部分包含在哪些其他部分中),包括附件列表,然后再删除所有附件 附件
  • 解码的、人类可读的、可搜索的消息体(Rails默认是记录编码的消息体,这对于人类来说是很难读取的) 并在任意位置打断单词,使搜索变得困难)
  • 为了实现这一点,我在我的应用程序中重写并替换了:

    其版本如下:

  • 创建邮件对象的副本
  • 呼叫
    mail.without_附件,以及
  • 仅日志:

  • mail.header.encoded
  • mail.inspect\u结构的输出(来自)
  • 为每个(非附件)部件调用
    部件的结果。已解码

  • 请查看整个内容。

    谢谢您的回答!很多好建议!我想使用Regexp只显示标题不会太糟糕。。。虽然我会尝试更多,让它也包括文本和html正文。确认,太糟糕了
    事件。有效负载[:mail]
    是一个字符串。如果我无论如何都要重写一个方法,我想知道,仅仅重写添加有效负载的方法(
    ActionMailer::Base.set_payload_for_mail
    )会更糟糕吗?现在就开始研究这个问题,如果我能让它工作,我会发布我的解决方案。。。
    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
    
    payload[:mail]       = mail.encoded