Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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
有没有办法在Python中配置SMTPHandler来完成更高级的工作?_Python_Exception Handling_Smtp_Logging - Fatal编程技术网

有没有办法在Python中配置SMTPHandler来完成更高级的工作?

有没有办法在Python中配置SMTPHandler来完成更高级的工作?,python,exception-handling,smtp,logging,Python,Exception Handling,Smtp,Logging,我使用标准SMTPHandler记录器捕获Python异常有没有办法将异常名称放入邮件的主题中?这比使用静态主题要好得多,因为Gmail(不仅仅是Gmail)可以根据主题对对话进行分组,因此它可以根据错误类型进行分组 例如,如果50个完全相同的错误发生+1个不同的错误,我会在我的收件箱中看到两个对话,而不是一组51封电子邮件,在这组邮件中我很容易忽略一个不同的 还有,有没有办法防止发送同样的错误。以某种方式定义我自己的功能,决定是否发送电子邮件。该函数将在参数中获取一些基本信息,以便作出决定(例

我使用标准SMTPHandler记录器捕获Python异常有没有办法将异常名称放入邮件的主题中?这比使用静态主题要好得多,因为Gmail(不仅仅是Gmail)可以根据主题对对话进行分组,因此它可以根据错误类型进行分组

例如,如果50个完全相同的错误发生+1个不同的错误,我会在我的收件箱中看到两个对话,而不是一组51封电子邮件,在这组邮件中我很容易忽略一个不同的

还有,有没有办法防止发送同样的错误。以某种方式定义我自己的功能,决定是否发送电子邮件。该函数将在参数中获取一些基本信息,以便作出决定(例如,缓存&查看是否已发送此类问题)

我浏览了文档,但找不到类似的东西。这似乎很简单如果SMTPHandler不能做到这一点,那么最好的、仍然简单的替代方案是什么?任何整洁的库


谢谢大家!

例如,您可以继承SMTPHandler类并增强或替换其功能

class A(object):
    def __init__(self):
        self.email = "jjj@jjj.com"

    def send_error(self, error):
        send_mail(self.email, error)

class B(A):
    def __init__(self):
        A.__init__(self)

    def send_error(self, error):
        if not error.sent:
            A.send_mail(self, error)
        else:
            #do nothing
            pass

您只需要创建自己的子类

对于第一个请求:您只需要覆盖
getSubject(record)
方法。在从日志中导入格式化程序后,请查看
帮助(格式化程序)
,了解可以在主题中添加哪些内容

对于第二个请求:必须重写
emit(record)
方法。检查记录并自行决定是否发送。如果是这样,那么只需调用
super(SMTPHandler,self).emit(record)
方法

class MySMTPHandler(SMTPHandler):

    def getSubject(self, record):
        return "My Error Format from the record dict"

    def emit(self, record):
        #check for record in self.already_send or something
        if sendit:
           super(MySMTPHandler,self).emit(record)

简单而灵活的方法是不仅格式化电子邮件内容,而且格式化电子邮件主题。这需要子类化logging.handlers.SMTPHandler

这样,如果您配置的主题中有任何变量引用,它将根据需要展开。以下是包括测试代码的实现:

    import logging, logging.handlers
    class TitledSMTPHandler(logging.handlers.SMTPHandler):
        def getSubject(self, record):
            formatter = logging.Formatter(fmt=self.subject)
            return formatter.format(record)

    # below is to test
    logging.getLogger().addHandler(TitledSMTPHandler(
        ('your.smtp.server',587), 
        'email@from.address', 'email@to.address', 
        '%(asctime)s Error: %(message)s', 
        ('SMTP login', 'SMTP password'), ()
    ))

    logging.error("TestError")
将SMTP配置替换为您的配置,运行代码,您将收到一封电子邮件,其中错误消息位于主题中(也位于电子邮件正文中)

如果在日志配置文件中定义处理程序,请记住转义参数引用。e、 g.
%(asctime)s
应变为
%%(asctime)s
,以防止configparser过早地进行插值——但是,python 3.1中及其之前未包含
%%
转义


拜托,如果你一次只问一个问题,你会帮到其他谷歌人很多。您应该开始两个主题,一个是“有没有办法将异常名称放入邮件主题?”另一个是“有没有办法防止发送仍然相同的错误?”

为了集中讨论一个话题,我只回答你的第一个问题。也许你认为这两个问题可能相互依赖,因此必须一起问,而它们只是一起出现在你的脑海中。我认为还是可以建议你把问题的标题改为强调一个问题,而不是说“高级材料”

如果问题是一个开放主题和/或无法很好地定义(例如“我想要高级的东西,其他人都用什么?”),我还建议访问comp.lang.python

返回格式化程序。格式(记录)
应该是->
返回格式化程序。格式消息(记录)
,否则您将得到:ValueError:标题值可能不包含换行符或回车符