【问题标题】:How to log smtp debug information to a file?如何将 smtp 调试信息记录到文件中?
【发布时间】:2011-11-10 07:51:38
【问题描述】:

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

【问题讨论】:

    标签: python email smtp cmd smtplib


    【解决方案1】:

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

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

    您必须在导入smtplib smtplib.stderr 在运行邮件之前 修改sys.stderr 之前代码。

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

    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 的有用示例。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        很难清理,但似乎 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
        

        【讨论】:

        • 我在我的代码中使用了相同的方式,但是似乎std重定向只限于代码中,smtplib写入的stderr信息仍在控制台中。而我只是用一种肮脏的方式来临时解决它:在/lib/smtplib.py代码中添加“fsock = open('error.log', 'w') stderr = fsock”。
        猜你喜欢
        • 2011-11-23
        • 2015-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 1970-01-01
        • 2011-07-08
        相关资源
        最近更新 更多