如您所知,python smtplib具有调试级别。当我将其设置为真正的参数时,它将打印一些发送信息。
问题是,我尝试将调试信息记录到一个文件中,但它们只停留在我的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........
答案 0 :(得分:11)
smtplib
直接打印到stderr
,例如smtplib.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
这个question包含一些使用上下文管理器修补stderr的有用示例。
答案 1 :(得分:1)
前段时间我分叉了smtplib,并添加了一个日志文件选项(以及其他内容)。如果你愿意,你可以试试。它还有一个新名称SMTP.py。
答案 2 :(得分: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