Как записать в файл отладочную информацию smtp? - PullRequest
4 голосов
/ 05 сентября 2011

Как вы знаете, 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........

Ответы [ 3 ]

11 голосов
/ 05 сентября 2011

smtplib печатает непосредственно на stderr, например, строка 823 в smtplib.py:

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

Вам придется либо обезьяньим патчем sys.stderr до васimport 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 с помощью менеджеров контекста.

1 голос
/ 05 сентября 2011

Некоторое время назад я раздвоил smtplib и добавил опцию logfile (среди прочего).Вы можете попробовать это, если хотите.У него также есть новое имя, SMTP.py .

0 голосов
/ 05 сентября 2011

Вряд ли чисто, но, поскольку кажется, что объекты 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
...