有没有办法在Python中配置SMTPHandler来完成更高级的工作?
我使用标准SMTPHandler记录器捕获Python异常有没有办法将异常名称放入邮件的主题中?这比使用静态主题要好得多,因为Gmail(不仅仅是Gmail)可以根据主题对对话进行分组,因此它可以根据错误类型进行分组 例如,如果50个完全相同的错误发生+1个不同的错误,我会在我的收件箱中看到两个对话,而不是一组51封电子邮件,在这组邮件中我很容易忽略一个不同的 还有,有没有办法防止发送同样的错误。以某种方式定义我自己的功能,决定是否发送电子邮件。该函数将在参数中获取一些基本信息,以便作出决定(例如,缓存&查看是否已发送此类问题) 我浏览了文档,但找不到类似的东西。这似乎很简单如果SMTPHandler不能做到这一点,那么最好的、仍然简单的替代方案是什么?任何整洁的库有没有办法在Python中配置SMTPHandler来完成更高级的工作?,python,exception-handling,smtp,logging,Python,Exception Handling,Smtp,Logging,我使用标准SMTPHandler记录器捕获Python异常有没有办法将异常名称放入邮件的主题中?这比使用静态主题要好得多,因为Gmail(不仅仅是Gmail)可以根据主题对对话进行分组,因此它可以根据错误类型进行分组 例如,如果50个完全相同的错误发生+1个不同的错误,我会在我的收件箱中看到两个对话,而不是一组51封电子邮件,在这组邮件中我很容易忽略一个不同的 还有,有没有办法防止发送同样的错误。以某种方式定义我自己的功能,决定是否发送电子邮件。该函数将在参数中获取一些基本信息,以便作出决定(例
谢谢大家! 例如,您可以继承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:标题值可能不包含换行符或回车符