Python 如何将smtp调试信息记录到文件中?

Python 如何将smtp调试信息记录到文件中?,python,email,smtp,cmd,smtplib,Python,Email,Smtp,Cmd,Smtplib,正如您所知,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\

正如您所知,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........

很难清理,但由于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

smtplib
直接打印到
stderr
,例如smtplib.py中的第823行:

print>>stderr, 'connect fail:', host
在导入
smtplib
之前,或者在运行邮件代码之前,您必须先安装monkey patch sys.stderr,或者运行

我还建议使用自定义对象修补
smtplib.stderr
,该自定义对象具有一个
write
方法来包装日志代码(例如,如果您使用日志库):


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

不久前,我分叉了smtplib,并添加了一个日志文件选项(以及其他内容)。如果你愿意,你可以试试。它还有一个新名称。

我在代码中使用了相同的方法,但似乎std重定向仅限于代码中,smtplib编写的STDER信息仍在控制台中。我只是用一种肮脏的方法临时解决它:在/lib/smtplib.py代码中添加“fsock=open('error.log','w')stderr=fsock”。
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