diff --git a/mime.py b/mime.py
index df9537323dc77fad50719e96fb33e6b07a964587..80a5a832fafacc1e77e9b6111c5121a3e493e2f2 100644
--- a/mime.py
+++ b/mime.py
@@ -1,4 +1,7 @@
 # $Log$
+# Revision 1.3  2005/06/02 15:00:17  customdesigned
+# Configure banned extensions.  Scan zipfile option with test case.
+#
 # Revision 1.2  2005/06/02 04:18:55  customdesigned
 # Update copyright notices after reading article on /.
 #
@@ -87,6 +90,16 @@ from email import Errors
 
 from types import ListType,StringType
 
+def zipnames(txt):
+  fp =  StringIO.StringIO(txt)
+  zipf = zipfile.ZipFile(fp,'r')
+  names = []
+  for nm in zipf.namelist():
+    names.append(('zipname',nm))
+    if nm.lower().endswith('.zip'):
+      names += zipnames(zipf.read(nm))
+  return names
+
 class MimeGenerator(Generator):
     def _dispatch(self, msg):
         # Get the Content-Type: for the message, then try to dispatch to
@@ -177,13 +190,10 @@ class MimeMessage(Message):
       names.append((attr,val))
     names += [("filename",self.get_filename())]
     if scan_zip:
-      for key,name in names:
+      for key,name in tuple(names):	# copy by converting to tuple
 	if name and name.lower().endswith('.zip'):
 	  txt = self.get_payload(decode=True)
-	  fp =  StringIO.StringIO(txt)
-	  zipf = zipfile.ZipFile(fp,'r')
-	  for nm in zipf.namelist():
-	    names.append(('zipname',nm))
+	  names += zipnames(txt)
     return names
 
   def ismodified(self):
diff --git a/test/ziploop b/test/ziploop
new file mode 100644
index 0000000000000000000000000000000000000000..97b55468c23b4dd7e20d67e52710bc3b2ad1158a
--- /dev/null
+++ b/test/ziploop
@@ -0,0 +1,47 @@
+From ttaie1@thfalcon.com Thu Jun 16 10:23:13 2005
+Received: from thfalcon.com (unknown [202.90.113.150])
+	by thfalcon.com (Postfix) with ESMTP id 32F0DD819C
+	for <stuart@bmsi.com>; Thu, 16 Jun 2005 15:42:08 +0700 (ICT)
+From: ttaie1@thfalcon.com
+To: stuart@bmsi.com
+Subject: Returned mail: see transcript for details
+Date: Thu, 16 Jun 2005 15:50:10 +0700
+MIME-Version: 1.0
+Content-Type: multipart/mixed;
+	boundary="----=_NextPart_000_0014_E4E04420.5619685C"
+X-Priority: 3
+X-MSMail-Priority: Normal
+X-Mailer: Microsoft Outlook Express 6.00.2600.0000
+X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
+Message-Id: <20050616084208.32F0DD819C@thfalcon.com>
+Received-SPF: pass (mail.bmsi.com: guessing: domain of thfalcon.com designates 203.147.3.44 as permitted sender) client-ip=203.147.3.44; envelope-from=ttaie1@thfalcon.com; helo=thfalcon.com;
+
+This is a multi-part message in MIME format.
+
+------=_NextPart_000_0014_E4E04420.5619685C
+Content-Type: text/plain;
+	charset=us-ascii
+Content-Transfer-Encoding: 7bit
+
+Message could not be delivered
+
+
+------=_NextPart_000_0014_E4E04420.5619685C
+Content-Type: application/octet-stream;
+	name="stuart@bmsi.com.zip"
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment;
+	filename="stuart@bmsi.com.zip"
+
+UEsDBAoAAAAAAM6r0DL7SfbCBAEAAAQBAAAFABUAdC56aXBVVAkAA7MnskK4J7JCVXgEAIYD
+ZQBQSwMECgAAAAAANVXCMtpXacQaAAAAGgAAADMAFQB6aXAuZG9jICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVVVAkAA6Yan0KmGp9CVXgEAIYDZQBUaGlz
+IHByb2dyYW0gd2FzIGEgdmlydXMuClBLAQIXAwoAAAAAADVVwjLaV2nEGgAAABoAAAAzAA0A
+AAAAAAEAAAC0gQAAAAB6aXAuZG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgIC5leGVVVAUAA6Yan0JVeAAAUEsFBgAAAAABAAEAbgAAAIAAAAAAAFBLAQIXAwoA
+AAAAAM6r0DL7SfbCBAEAAAQBAAAFAA0AAAAAAAAAAAC0gQAAAAB0LnppcFVUBQADsyeyQlV4
+AABQSwUGAAAAAAEAAQBAAAAAPAEAAAAA
+
+------=_NextPart_000_0014_E4E04420.5619685C--
+
+
diff --git a/testmime.py b/testmime.py
index 004f43e2743088c146a21241d278cf802b0cd35a..3920d5b3c7c8b6e20fe06167d86faa6b608f0a95 100644
--- a/testmime.py
+++ b/testmime.py
@@ -1,4 +1,7 @@
 # $Log$
+# Revision 1.2  2005/06/02 15:00:17  customdesigned
+# Configure banned extensions.  Scan zipfile option with test case.
+#
 # Revision 1.1.1.2  2005/05/31 18:23:49  customdesigned
 # Development changes since 0.7.2
 #
@@ -126,10 +129,12 @@ class MimeTestCase(unittest.TestCase):
     self.failUnless(name == "Jim&amp;amp;Girlz.jpg","name=%s"%name)
 
   def testZip(self,vname="zip1",fname='zip.zip'):
-    self.testDefang('zip1',1,'zip.zip')
+    self.testDefang(vname,1,'zip.zip')
     msg = mime.message_from_file(open('test/'+vname,"r"))
     mime.defang(msg,scan_zip=False)
     self.failIf(msg.ismodified())
+    # test zip within zip
+    self.testDefang('ziploop',1,'stuart@bmsi.com.zip')
 
   def testHTML(self,fname=""):
     result = StringIO.StringIO()
@@ -153,3 +158,5 @@ if __name__ == '__main__':
     for fname in sys.argv[1:]:
       fp = open(fname,'r')
       msg = mime.message_from_file(fp)
+      mime.defang(msg,scan_zip=True)
+      print msg.as_string()