Patch by Per Cederqvist, who writes:

"""
 - It needlessly used the makefile() method for each response that is
   read from the SMTP server.

 - If the remote SMTP server closes the connection unexpectedly the
   code raised an IndexError.  It now raises an SMTPServerDisconnected
   exception instead.

 - The code now checks that all lines in a multiline response actually
   contains an error code.
"""

The Dragon approves.
diff --git a/Lib/smtplib.py b/Lib/smtplib.py
index 47e1faf..bd221dc 100755
--- a/Lib/smtplib.py
+++ b/Lib/smtplib.py
@@ -187,21 +187,30 @@
 
           - server response string corresponding to response code (multiline
             responses are converted to a single, multiline string).
+
+        Raises SMTPServerDisconnected if end-of-file is reached.
         """
         resp=[]
-        self.file = self.sock.makefile('rb')
+	if self.file is None:
+	    self.file = self.sock.makefile('rb')
         while 1:
             line = self.file.readline()
+	    if line == '':
+		self.close()
+		raise SMTPServerDisconnected("Connection unexpectedly closed")
             if self.debuglevel > 0: print 'reply:', `line`
             resp.append(string.strip(line[4:]))
             code=line[:3]
-            #check if multiline resp
+	    # Check that the error code is syntactically correct.
+	    # Don't attempt to read a continuation line if it is broken.
+	    try:
+		errcode = string.atoi(code)
+	    except ValueError:
+		errcode = -1
+		break
+            # Check if multiline response.
             if line[3:4]!="-":
                 break
-        try:
-            errcode = string.atoi(code)
-        except(ValueError):
-            errcode = -1
 
         errmsg = string.join(resp,"\n")
         if self.debuglevel > 0: