Come registro SMTP informazioni di debug in un file?
Domanda
Come sapete, pitone smtplib ha un debug level.When ho impostato un vero param, stamperà alcune informazioni di invio.
Il problema è, cerco di ottenere le informazioni di debug per accedere a un file, ma semplicemente rimanere sulla mia console cmd.
Come posso fare per loro accedere?
Informazioni in questo modo:
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........
Soluzione
Il smtplib
stampa direttamente a stderr
, per esempio la linea 823 in smtplib.py:
print>>stderr, 'connect fail:', host
Si sarebbe dovuto sia patch di scimmia sys.stderr prima si importa smtplib
o smtplib.stderr
prima si esegue il codice di posta.
Potrei anche suggerire l'applicazione di patch smtplib.stderr
con un oggetto personalizzato che ha un metodo write
per avvolgere il codice di registrazione (se si utilizza la libreria di registrazione per esempio):
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
domanda contiene alcuni utili esempi di applicazione di patch stderr con il contesto manager.
Altri suggerimenti
Qualche tempo fa ho biforcato smtplib, e ha aggiunto un'opzione di file di log (tra le altre cose). Si può provare che, se si vuole. Essa ha anche un nuovo nome, SMTP. py .
Quasi pulita, ma dal momento che non sembra oggetti SMTP consentono di specificare dove l'output di debug va:
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