我喜欢Rails自动记录从应用程序发出的所有消息。我不喜欢的是它如何使用大量无用的Base64编码文本填充我的日志文件。这使得浏览日志文件变得很痛苦,因为我必须跳过这些兆字节长的无法读取的噪声块。它还会导致日志文件增长太快并填满磁盘。
如何让它仍然记录发送的所有邮件,但不包含任何附件?有没有办法告诉它在记录之前去除附件?或者什么?
通常我感兴趣的只是标题(主题,发送给谁)和(至少在某些时候)消息正文。
附件(文件名和类型)的列表也没有坏处 - 但是看到所有附件的完整Base64转储肯定没有用! (如果我想查看并查看附件是否正常,我已经知道如何添加一个邮件拦截器,将bcc的所有外发邮件添加到我的收件箱中。)
答案 0 :(得分:2)
我最终记录了发送出去的每封邮件的以下详细信息:
为实现这一目标,我在我的应用中覆盖了ActionMailer::Base.set_payload_for_mail
并替换了this line:
payload[:mail] = mail.encoded
版本:
答案 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