diff -r 203407036e46 Lib/smtplib.py --- a/Lib/smtplib.py Fri Jun 17 21:10:21 2011 +0200 +++ b/Lib/smtplib.py Fri Jun 17 23:29:56 2011 +0200 @@ -787,7 +787,14 @@ self.file.close() self.file = None if self.sock: - self.sock.close() + try: + self.sock.shutdown(socket.SHUT_RDWR) + except socket.error as e: + # The server might already have closed the connection + if e.errno != errno.ENOTCONN: + raise + finally: + self.sock.close() self.sock = None def quit(self): diff -r 203407036e46 Lib/test/mock_socket.py --- a/Lib/test/mock_socket.py Fri Jun 17 21:10:21 2011 +0200 +++ b/Lib/test/mock_socket.py Fri Jun 17 23:29:56 2011 +0200 @@ -7,6 +7,7 @@ # Mock socket module _defaulttimeout = None _reply_data = None +SHUT_RDWR = socket_module.SHUT_RDWR # This is used to queue up data to be read through socket.makefile, typically # *before* the socket object is even created. It is intended to handle a single @@ -98,6 +99,9 @@ def getpeername(self): return 'peer' + def shutdown(self, how): + pass + def close(self): pass