5

ご存知のように、python smtplibにはデバッグレベルがあります。これをtrueparamに設定すると、送信情報が出力されます。
問題は、デバッグ情報を取得してファイルにログインしようとしましたが、コマンドコンソールに残っているだけです。それらをログに記録するにはどうすればよいですか?

このような情報:

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.pyの823行目に直接smtplib出力されます。stderr

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をフォークし、logfileオプションを追加しました(とりわけ)。必要に応じて、それを試すことができます。また、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 に答える