Python日志模块中的SMTPHandler一次发送一封邮件。如何阻止此行为?

22 投票
2 回答
35161 浏览
提问于 2025-04-17 06:38

我正在尝试使用Python的logging模块来发送包含日志的电子邮件。我的问题是,每次我写入一条日志时,都会发送一封电子邮件。我该如何将日志消息排队,并在脚本结束时只发送一封电子邮件呢?

我觉得这可能是通过emit()方法来实现的,但我不知道该怎么用。

import logging, logging.handlers
log = logging.getLogger("mylogger")
log.setLevel(logging.DEBUG)
h2 = logging.handlers.SMTPHandler(mailhost='mailserver',
                            fromaddr='noreply@example.com',
                            toaddrs=['me@example.com'],
                            subject='The log',
                            credentials=('user','pwd'),
                            secure=None)
h2.setLevel(logging.INFO)
h2.setFormatter(f)
log.addHandler(h2)

log.info("Did something")
log.info("Did something else")
log.info("This would send a third email. :-(")

2 个回答

2

只需要创建一个SMTPHandler的子类,就能实现你想要的功能。比如,你可以重写emit方法,这样每当记录到第三条信息时就发送一封邮件。

注意:根据你选择的实现方式,如果你只记录了一次或两次,可能根本不会发送邮件。也许可以考虑延迟发送:在发送邮件之前等一秒钟。如果在一秒后没有收到其他信息,就发送邮件;如果有新信息,就把这条信息加到要发送的邮件里,然后再等一秒……以此类推……(延迟发送需要在一个单独的线程中进行,可以考虑使用Timer

11

可以看看我在类似问题上给的 这个回答。这里有一个可以使用的示例处理器,具体内容在 这里;你可以根据自己的需求进行调整。

撰写回答