SMTPHandler中的颜色编码回溯并发送HTML

时间:2012-07-25 17:07:08

标签: python email logging html-email color-coding

我一直想让我的异常电子邮件更容易阅读/导航,我认为如果我可以对输出进行颜色编码,显然是追溯和一些JSON打印,它会让我的生活更轻松。

所以这个问题有两个方面:

  1. 如何为我的SMTPHandler设置格式化程序,使其吐出HTML,让SMTPHandler以HTML格式发送电子邮件而不仅仅是纯文本?

  2. 您是否了解任何可以轻松获取追溯和/或JSON并将输出颜色编码为HTML的库?

  3. 任何帮助非常感谢。谢谢!

1 个答案:

答案 0 :(得分:1)

此解决方案扩展了标准logging.SMTPHandler并使用pygments库创建了多彩的html版本的回溯。它不是很优雅,因为它必须使用formatter私有属性:_fmt来构造额外的日志信息,但它可以工作(你可以使用pygments或直接在html变量中自定义样式):

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate
import logging
from logging.handlers import SMTPHandler
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import PythonTracebackLexer
import smtplib


class ColorfulSMTPHandler(SMTPHandler):

    def emit(self, record):
        try:
            port = self.mailport
            if not port:
                port = smtplib.SMTP_PORT
            smtp = smtplib.SMTP(self.mailhost, port)
            msg = MIMEMultipart('alternative')
            msg['Subject'] = self.getSubject(record)
            msg['From'] = self.fromaddr
            msg['To'] = ",".join(self.toaddrs)
            msg['Date'] = formatdate()

            text = self.format(record)
            msg.attach(MIMEText(text, 'plain'))
            if record.exc_text:
                html_formatter = HtmlFormatter(noclasses=True)
                tb = highlight(record.exc_text, PythonTracebackLexer(), html_formatter)

                info = (self.formatter or logging._defaultFormatter)._fmt % record.__dict__
                info = '<p style="white-space: pre-wrap; word-wrap: break-word;">%s</p>' % info

                html = ('<html><head></head><body>%s%s</body></html>')% (info, tb)
                msg.attach(MIMEText(html, 'html'))
            if self.username:
                if self.secure is not None:
                    smtp.ehlo()
                    smtp.starttls(*self.secure)
                    smtp.ehlo()
                smtp.login(self.username, self.password)
            smtp.sendmail(self.fromaddr, self.toaddrs, msg.as_string())
            smtp.quit()
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.handleError(record)

编辑:您也可以使用我的记录处理程序来处理我的记录处理程序:https://github.com/paluh/great-justice-with-logging/blob/master/great_justice/logging.py#L85

它生成非常好的,信息丰富的回溯 - 在电子邮件和终端处理程序中使用相同的格式:

enter image description here