mirror of
https://github.com/python/cpython.git
synced 2025-07-12 13:55:34 +00:00
Merge: #5713: Handle 421 error codes during sendmail by closing the socket.
This is a partial fix to the issue of servers disconnecting unexpectedly; in this case the 421 says they are disconnecting, so we close the socket and return the 421 in the appropriate error context. Original patch by Mark Sapiro, updated by Kushal Das, with additional tests by me.
This commit is contained in:
commit
f1a40b4ec5
3 changed files with 80 additions and 11 deletions
|
@ -751,7 +751,10 @@ class SMTP:
|
|||
esmtp_opts.append(option)
|
||||
(code, resp) = self.mail(from_addr, esmtp_opts)
|
||||
if code != 250:
|
||||
self.rset()
|
||||
if code == 421:
|
||||
self.close()
|
||||
else:
|
||||
self.rset()
|
||||
raise SMTPSenderRefused(code, resp, from_addr)
|
||||
senderrs = {}
|
||||
if isinstance(to_addrs, str):
|
||||
|
@ -760,13 +763,19 @@ class SMTP:
|
|||
(code, resp) = self.rcpt(each, rcpt_options)
|
||||
if (code != 250) and (code != 251):
|
||||
senderrs[each] = (code, resp)
|
||||
if code == 421:
|
||||
self.close()
|
||||
raise SMTPRecipientsRefused(senderrs)
|
||||
if len(senderrs) == len(to_addrs):
|
||||
# the server refused all our recipients
|
||||
self.rset()
|
||||
raise SMTPRecipientsRefused(senderrs)
|
||||
(code, resp) = self.data(msg)
|
||||
if code != 250:
|
||||
self.rset()
|
||||
if code == 421:
|
||||
self.close()
|
||||
else:
|
||||
self.rset()
|
||||
raise SMTPDataError(code, resp)
|
||||
#if we got here then somebody got our mail
|
||||
return senderrs
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue