• Guido van Rossum's avatar
    Changes by Per Cederquist and The Dragon. · 296e1430
    Guido van Rossum yazdı
    Per writes:
    
    """
    The application where Signum Support uses smtplib needs to be able to
    report good error messages to the user when sending email fails.  To
    help in diagnosing problems it is useful to be able to report the
    entire message sent by the server, not only the SMTP error code of the
    offending command.
    
    A lot of the functions in sendmail.py unfortunately discards the
    message, leaving only the code.  The enclosed patch fixes that
    problem.
    
    The enclosed patch also introduces a base class for exceptions that
    include an SMTP error code and error message, and make the code and
    message available on separate attributes, so that surrounding code can
    deal with them in whatever way it sees fit.  I've also added some
    documentation to the exception classes.
    
    The constructor will now raise an exception if it cannot connect to
    the SMTP server.
    
    The data() method will raise an SMTPDataError if it doesn't receive
    the expected 354 code in the middle of the exchange.
    
    According to section 5.2.10 of RFC 1123 a smtp client must accept "any
    text, including no text at all" after the error code.  If the response
    of a HELO command contains no text self.helo_resp will be set to the
    empty string ("").  The patch fixes the test in the sendmail() method
    so that helo_resp is tested against None; if it has the empty string
    as value the sendmail() method would invoke the helo() method again.
    
    The code no longer accepts a -1 reply from the ehlo() method in
    sendmail().
    
    [Text about removing SMTPRecipientsRefused deleted --GvR]
    """
    
    and also:
    
    """
    smtplib.py appends an extra blank line to the outgoing mail if the
    `msg' argument to the sendmail method already contains a trailing
    newline.  This patch should fix the problem.
    """
    
    The Dragon writes:
    
    """
    	Mostly I just re-added the SMTPRecipientsRefused exception
    (the exeption object now has the appropriate info in it ) [Per had
    removed this in his patch --GvR] and tweaked the behavior of the
    sendmail method whence it throws the newly added SMTPHeloException (it
    was closing the connection, which it shouldn't.  whatever catches the
    exception should do that. )
    
    	I pondered the change of the return values to tuples all around,
    and after some thinking I decided that regularizing the return values was
    too much of the Right Thing (tm) to not do.
    
    	My one concern is that code expecting an integer & getting a tuple
    may fail silently.
    
    (i.e. if it's doing :
    
          x.somemethod() >= 400:
    expecting an integer, the expression will always be true if it gets a
    tuple instead. )
    
    	However, most smtplib code I've seen only really uses the
    sendmail() method, so this wouldn't bother it.  Usually code I've seen
    that calls the other methods usually only calls helo() and ehlo() for
    doing ESMTP, a feature which was not in the smtplib included with 1.5.1,
    and thus I would think not much code uses it yet.
    """
    296e1430
smtplib.py 17.9 KB