smtplib, capturing output from set_debuglevel ??

Andrew Dalke adalke at mindspring.com
Sat Oct 9 00:34:47 CEST 2004


Tim Williams
> Yeah,  I did wonder about changing the code  (though it's not my first
> choice. I've done it before and caught a crab later),   or could I do it
> with Subclassing?
> 
>  I'm still close to Newbie status, so I can't immediately imagine what  I
> could change the smptblib code to write to,    or  how to subclass to get
> the behaviour I might need.

It can't be done with subclassing.  You'll need to copy smtplib
to a new file.  Call it 'smtplib2.py'.

Edit it so the class constructor takes an output file object

class SMTP:
     ...
     def __init__(self, host = '', port = 0, local_hostname = None,
                  debugfile = sys.stderr):
         ....
         self.debugfile = debugfile

This lets you attach an arbitrary file-like object to each
SMTP instance.

Then go through the class definition and change every place
that looks like

         if self.debuglevel > 0: print>>stderr, 'connect:', (host, port)

into

         self.debugmsg('connect:', (host, port))

and create a new method named 'debugmsg' which looks like

      def debugmsg(self, *args):
         self.debugfile.write(" ".join(map(str, args))) + "\n")

(Or the long way

      def debugmsg(self, *args):
         if args:
           self.debugfile.write(str(args[0]))
           for arg in args[1:]:
             self.debufile.write(" " + str(args[1]))
         self.debugfile.write("\n")

Another option, if you decide to go this route, is that you
can change the protocol and the debug messages.  For example,
if you want it to go to a list you can change this so as
to use a 'debug_msgqueue = []' and so debugmsg appends the
args to that list.

You can also change the actual messages sent by the library.

				Andrew
				dalke at dalkescientific.com



More information about the Python-list mailing list