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........
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top