5

如您所知,python smtplib 具有调试级别。当我将其设置为 true 参数时,它会打印一些发送信息。
问题是,我尝试获取调试信息以登录文件,但它们只是留在我的 cmd 控制台上。我该怎么做才能记录它们?

像这样的信息:

connect: ('192.168.1.101', 25)
connect: (25, '192.168.1.101')
reply: '220 ESMTP on WinWebMail [3.8.1.3] ready.  http://www.winwebmail.com\r\n'

reply: retcode (220); Msg: ESMTP on WinWebMail [3.8.1.3] ready.  http://www.winw
ebmail.com
connect: ESMTP on WinWebMail [3.8.1.3] ready.  http://www.winwebmail.com
send: 'ehlo [169.254.63.67]\r\n'
reply: '250-SIZE\r\n'
reply: '250 AUTH LOGIN\r\n'
reply: retcode (250); Msg: SIZE
AUTH LOGIN
bla bla bla bla........
4

3 回答 3

11

smtplib直接打印到stderrsmtplib.py 中的第 823 行:

print>>stderr, 'connect fail:', host

您必须导入运行邮件代码之前对 sys.stderr 进行猴子补丁。smtplib smtplib.stderr

smtplib.stderr我可能还建议使用具有包装日志代码的方法的自定义对象进行修补write(例如,如果您正在使用日志库):

import logging
import smtp

class StderrLogger(object):

    def __init__(self):
        self.logger = logging.getLogger('mail')

    def write(self, message):
        self.logger.debug(message)

org_stderr = smtp.stderr
smtp.stderr = StderrLogger()

# do your smtp stuff

smtp.stderr = org_stderr

这个问题包含一些使用上下文管理器修补 stderr 的有用示例。

于 2011-09-05T03:09:02.850 回答
1

前段时间我分叉了 smtplib,并添加了一个日志文件选项(除其他外)。如果你愿意,你可以试试。它还有一个新名称SMTP.py

于 2011-09-05T05:46:15.153 回答
0

几乎不干净,但由于 SMTP 对象似乎没有提供指定调试输出去向的能力:

import sys
orig_std = (sys.stdout, sys.stderr)
sys.stdout = sys.stderr = open("/path/to/log", "a")
# smtplib stuff
sys.stdout, sys.stderr = orig_std
于 2011-09-05T02:35:51.127 回答