You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by fe...@apache.org on 2004/08/30 23:40:37 UTC

svn commit: rev 37217 - in spamassassin/trunk: lib/Mail/SpamAssassin t t/data/nice

Author: felicity
Date: Mon Aug 30 14:40:35 2004
New Revision: 37217

Added:
   spamassassin/trunk/t/data/nice/mime9
Modified:
   spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm
   spamassassin/trunk/t/mimeparse.t
Log:
bug 3735: deal with parsing messages that themselves have a content-type of message/rfc822.  add in a test mail and appropriately mimeparse.t modifications to test that we properly deal with multi-level message/rfc822 encodings.

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm	(original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Message.pm	Mon Aug 30 14:40:35 2004
@@ -555,25 +555,39 @@
   $part_msg->{'boundary'} = $boundary;
   $part_msg->{'name'} = $filename if $filename;
 
-  $msg->add_body_part($part_msg);
-
   # If this part is a message/* part, and the parent isn't also a
   # message/* part (ie: the main part) go ahead and parse into a tree.
-  if ($part_msg->{'type'} =~ /^message\b/i && $msg->{'type'} ne $part_msg->{'type'}) {
+  if ($part_msg->{'type'} =~ /^message\b/i) {
     # Get the part ready...
     my $message = $part_msg->decode();
+    my $msg_obj = Mail::SpamAssassin::Message->new({message=>$message, parsenow=>1});
 
     if ($message) {
-      $part_msg->add_body_part(
-        Mail::SpamAssassin::Message->new({message=>$message, parsenow=>1})
-      );
+      # main message is a message/* part ...
+      if ($msg == $part_msg) {
+        $msg->add_body_part($msg_obj);
+      }
+      else {
+        # Add the new part as a child to the parent
+        # NOTE: if the message only has this one part, we'll be recursive so delete
+        # the body_parts list appropriately.
+        $msg->add_body_part($part_msg);
+
+        $part_msg->add_body_part($msg_obj);
+      }
     }
 
     return;
   }
 
+  # Add the new part as a child to the parent
+  # NOTE: if the message only has this one part, we'll be recursive so delete
+  # the body_parts list appropriately.
+  $msg->add_body_part($part_msg);
+
   # now that we've added the leaf node, let's go ahead and kill
-  # body_parts (used for sub-trees).  it could end up being recursive,
+  # body_parts (used for sub-trees).  there's no point for a leaf to have it,
+  # and if the main and child parts are the same, we'll end up being recursive,
   # and well, let's avoid that. ;)
   #
   # BTW: please leave this after add_body_parts() since it'll add it back.

Added: spamassassin/trunk/t/data/nice/mime9
==============================================================================
--- (empty file)
+++ spamassassin/trunk/t/data/nice/mime9	Mon Aug 30 14:40:35 2004
@@ -0,0 +1,458 @@
+From user@aol.com  Wed Feb 18 16:25:21 2004
+Return-path: <us...@server11.arteryserver11.net>
+Envelope-to: user@example.com
+Delivery-date: Wed, 18 Feb 2004 18:42:47 +0000
+Received: from user by server11.arteryserver11.net with local-bsmtp (Exim 4.24)
+	id 1AtWef-0007YH-Cj
+	for user@example.com; Wed, 18 Feb 2004 18:42:47 +0000
+Received: from [205.188.139.136] (helo=imo-d20.mx.aol.com)
+	by server11.arteryserver11.net with esmtp (Exim 4.24)
+	id 1AtWef-0007Y2-44
+	for user@example.com; Wed, 18 Feb 2004 18:42:41 +0000
+Received: from user@aol.com
+	by imo-d20.mx.aol.com (mail_out_v36_r4.14.) id o.23.3af50667 (4262)
+	 for <us...@example.com>; Wed, 18 Feb 2004 13:42:23 -0500 (EST)
+From: user@aol.com
+Message-ID: <23...@aol.com>
+Date: Wed, 18 Feb 2004 13:42:22 EST
+Subject: Fwd: Fw: New University....
+To: user@example.com
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="part1_23.3af50667.2d650c0e_boundary"
+X-Mailer: AOL 5.0 for Mac sub 46
+
+--part1_23.3af50667.2d650c0e_boundary
+Content-Type: text/plain; charset="US-ASCII"
+Content-Transfer-Encoding: 7bit
+
+I just had to share this with all of you!
+
+--part1_23.3af50667.2d650c0e_boundary
+Content-Type: message/rfc822
+Content-Disposition: inline
+
+Return-Path: <us...@example.com>
+Received: from  rly-ya01.mx.aol.com (rly-ya01.mail.aol.com [172.18.141.33]) by air-ya02.mail.aol.com (v98.6) with ESMTP id MAILINYA24-13e40337c8181; Wed, 18 Feb 2004 09:54:28 -0500
+Received: from  mail.deltacounty.com (mail.deltacounty.com [156.108.140.66]) by rly-ya01.mx.aol.com (v98.5) with ESMTP id MAILRELAYINYA18-13e40337c8181; Wed, 18 Feb 2004 09:53:54 -0500
+Received: from Delta County-MTA by mail.deltacounty.com
+	with Novell_GroupWise; Wed, 18 Feb 2004 07:53:53 -0700
+Message-Id: <s0...@mail.deltacounty.com>
+X-Mailer: Novell GroupWise Internet Agent 6.0.2
+Date: Wed, 18 Feb 2004 07:53:31 -0700
+From: "Foo BarBaz" <us...@example.com>
+To: user@example.com
+Subject: Fwd: Fw: New University....
+Mime-Version: 1.0
+Content-Type: message/rfc822
+X-AOL-IP: 156.108.140.66
+
+Received: from m11.nyc.untd.com
+	by mail.deltacounty.com; Sat, 14 Feb 2004 12:54:19 -0700
+Received: from cookie.untd.com by cookie.untd.com for <"IdYffSwumi6wA8UbKGMM+P8lG9LgcPawmOQAcxZ/RpMO5f+lY1OlrG==">; Sat, 14 Feb 2004 11:53:49 PST
+Received: (from user@example.com) 
+ by m11.nyc.untd.com (jqueuemail) id JNDGJDKK; Sat, 14 Feb 2004 11:53:49 PST
+To: user@example.com
+Date: Sat, 14 Feb 2004 12:52:11 -0700
+Subject: Fw: New University....
+Message-ID: <20...@example.com>
+X-Mailer: Juno 5.0.33
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary=--__JNP_000_3c67.4591.1173
+From: Foo BarBaz <us...@example.com>
+
+
+----__JNP_000_3c67.4591.1173
+Content-Type: multipart/alternative; boundary=--__JNP_000_611f.0dd6.5940
+
+
+
+----__JNP_000_611f.0dd6.5940
+Content-Type: text/plain; charset=us-ascii  
+Content-Transfer-Encoding: 7bit
+
+
+----- Forwarded Message -----
+From: "example user" <us...@example.com>
+To: Undisclosed-recipients:;
+Date: Sat, 14 Feb 2004 09:58:21 -0700
+Subject: New University....
+Message-ID: <BA...@example.com>
+
+Subject:  New University....
+
+----__JNP_000_611f.0dd6.5940
+Content-Type: text/html; charset=us-ascii  
+Content-Transfer-Encoding: quoted-printable
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML xmlns:v xmlns:o><HEAD>
+<META http-equiv=3DContent-Type content=3Dtext/html;charset=3DUS-ASCII>
+<META content=3D"MSHTML 6.00.2737.800" name=3DGENERATOR>
+<STYLE>@page Section1 {size: 8.5in 11.0in; margin: 1.0in 1.25in 1.0in 1.25in=
+; }
+P.MsoNormal {
+    FONT-SIZE: 12pt; MARGIN: 0in 0in 0pt; FONT-FAMILY: "Times New Roman"
+}
+LI.MsoNormal {
+    FONT-SIZE: 12pt; MARGIN: 0in 0in 0pt; FONT-FAMILY: "Times New Roman"
+}
+DIV.MsoNormal {
+    FONT-SIZE: 12pt; MARGIN: 0in 0in 0pt; FONT-FAMILY: "Times New Roman"
+}
+A:link {
+    COLOR: blue; TEXT-DECORATION: underline
+}
+SPAN.MsoHyperlink {
+    COLOR: blue; TEXT-DECORATION: underline
+}
+A:visited {
+    COLOR: purple; TEXT-DECORATION: underline
+}
+SPAN.MsoHyperlinkFollowed {
+    COLOR: purple; TEXT-DECORATION: underline
+}
+SPAN.EmailStyle17 {
+    COLOR: navy; FONT-FAMILY: Arial
+}
+DIV.Section1 {
+    page: Section1
+}
+</STYLE>
+</HEAD>
+<BODY lang=3DEN-US id=3DMailContainerBody  style=3D"PADDING-LEFT: 10px; FONT=
+-WEIGHT: bold; FONT-SIZE: 14pt; COLOR: #800080; BORDER-TOP-STYLE: none; PADD=
+ING-TOP: 15px; FONT-STYLE: italic; FONT-FAMILY: Harrington; BORDER-RIGHT-STY=
+LE: none; BORDER-LEFT-STYLE: none; TEXT-DECORATION: none; BORDER-BOTTOM-STYL=
+E: none"  vLink=3Dpurple link=3Dblue bgColor=3D#ffffff leftMargin=3D0 topMar=
+gin=3D0  name=3D"Compose message area" CanvasTabStop=3D"true" acc_role=3D"te=
+xt">
+<DIV>&nbsp;</DIV>
+<DIV style=3D""background: " #cccccc\?>----- Forwarded Message -----</DIV> <=
+DIV><B>From:</B> "example user" &lt;<A  href=3D"mailto:user@example.com">use=
+r@example.com</A>&gt;</DIV> <DIV><B>To:</B> Undisclosed-recipients:;</DIV> <=
+DIV><B>Date:</B> Sat, 14 Feb 2004 09:58:21 -0700</DIV> <DIV><B>Subject:</B>=20=
+New University....</DIV> <DIV><B>Message-ID:</B> &lt;<A  href=3D"mailto:BAY4=
+-DAV85tblpaAKvx0001131a@example.com">BAY4-DAV85tblpaAKvx0001131a@example.com=
+</A>&gt;</DIV> <DIV>&nbsp;</DIV> <DIV> <DIV> <DIV class=3DOutlookMessageHead=
+er dir=3Dltr align=3Dleft><FONT face=3DTahoma  size=3D2></FONT></DIV><FONT f=
+ace=3DArial color=3D#0000ff size=3D2></FONT></DIV> <DIV class=3DOutlookMessa=
+geHeader dir=3Dltr align=3Dleft><FONT face=3DTahoma  size=3D2><B>Subject:</B=
+>&nbsp; New University....<BR><BR></FONT></DIV> <DIV class=3DSection1> <P cl=
+ass=3DMsoNormal><FONT face=3D"Times New Roman" size=3D3><SPAN  style=3D"FONT=
+-SIZE: 12pt"></SPAN></FONT>&nbsp;</P></DIV></DIV></BODY></HTML>=20
+
+----__JNP_000_611f.0dd6.5940--
+
+----__JNP_000_3c67.4591.1173
+Content-Type: image/jpeg; name="NeverlandUniversity.jpg"
+Content-Transfer-Encoding: base64
+
+/9j/4RczRXhpZgAATU0AKgAAAAgADQEOAAIAAAAgAAAAqgEPAAIAAAAYAAAAygEQAAIAAAAI
+AAAA4gESAAMAAAABAAEAAAESAAMAAAABAAEAAAEaAAUAAAABAAAA6gEbAAUAAAABAAAA8gEo
+AAMAAAABAAIAAAExAAIAAAAQAAAA+gEyAAIAAAAUAAABCgE8AAIAAAAQAAABHgITAAMAAAAB
+AAIAAIdpAAQAAAABAAABLgAABOpPTFlNUFVTIERJR0lUQUwgQ0FNRVJBICAgICAgICAgAE9M
+WU1QVVMgT1BUSUNBTCBDTy4sTFREAEMyMTAwVVoAAEgAAAABAAAASAAAAAEAAFF1aWNrVGlt
+ZSA2LjUuMQAyMDA0OjA4OjI3IDE1OjQwOjI5AE1hYyBPUyBYIDEwLjMuNQAAF4KaAAUAAAAB
+AAACSIKdAAUAAAABAAACUIgiAAMAAAABAAIAAIgnAAMAAAABAGQAAJAAAAcAAAAEMDIyMJAD
+AAIAAAAUAAACWJAEAAIAAAAUAAACbJEBAAcAAAAEAQIDAJECAAUAAAABAAACgJIEAAoAAAAB
+AAACiJIFAAUAAAABAAACkJIHAAMAAAABAAUAAJIIAAMAAAABAAAAAJIJAAMAAAABAAAAAJIK
+AAUAAAABAAACmJJ8AAcAAAHMAAACoJKGAAcAAAB9AAAEbKAAAAcAAAAEMDEwMKABAAMAAAAB
+AAEAAKACAAQAAAABAAAGQKADAAQAAAABAAAEsKMAAAcAAAABAwAAAKMBAAcAAAABAQAAAAAA
+AAAAAAAKAAATiAAAAD8AAAAKMjAwNDowNjoxNiAyMTowMzo0OQAyMDA0OjA2OjE2IDIxOjAz
+OjQ5AAAAAAUAAAABAAAAAAAAAAoAAAAeAAAACgAAAE4AAAAKT0xZTVAAAQALAAACBAADAAAA
+JgQAAAECAwABAAAAAgAAAAICAwABAAAAAAAAAAMCAwABAAAAAAAAAAQCBQABAAAAMgQAAAUC
+BQABAAAAOgQAAAYCCAAGAAAAQgQAAAcCAgAFAAAATgQAAAgCAgA0AAAAVgQAAAkCBwAgAAAA
+kgQAAAAPBwCuAAAAsgQAAAAAAAAAAAAAAAAAAAAAAABkAAAAZAAAAAwDAABkAAAAMf9s/jj+
+mP+P/7//U1I5NUEAAABbcGljdHVyZUluZm9dIFJlc29sdXRpb249MiBbQ2FtZXJhIEluZm9d
+IFR5cGU9U1I5NUEAAAAAAAAAAABPTFlNUFVTIERJR0lUQUwgQ0FNRVJBAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAABZyseAAAAAAFiAAAgsQAAB2EAAB5OAAAeTgYLHwcGUgBBCZ4DagAA
+AAAAAAAAAAAA+BEAAAAeKR4AAAAgAAAAAAAAMBACSSoAMDkFFZgAAWIlAD8AABgcFB4YGQAA
+AQAFKwAAAAH/8E5BAAAAAgAAAAAPA8KQATkSIgAAW10BCwE7ICAjCyAMTqYA+ABXYfzrYA4U
+CgYAZADwEjRDIQAAAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgAAAHAQMAAwAAAAEABgAAARoABQAAAAEAAAVE
+ARsABQAAAAEAAAVMASgAAwAAAAEAAgAAAgEABAAAAAEAAAVUAgIABAAAAAEAABHXAhMAAwAA
+AAEAAQAAAAAAAABIAAAAAQAAAEgAAAABAAD/2P/gABBKRklGAAEBAQBIAEgAAP/+AAxBcHBs
+ZU1hcmsK/9sAhAAHBQUGBQUHBgYGCAcHCAoRCwoJCQoUDw8MERgVGRkXFRcXGh0lIBocIxwX
+FyEsISMnKCoqKhkfLjEtKTElKSooAQcICAoJChMLCxMoGxcbKCgoKCgoKCgoKCgoKCgoKCgo
+KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/xAGiAAABBQEBAQEBAQAAAAAAAAAA
+AQIDBAUGBwgJCgsBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQA
+AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0
+NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZ
+mqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3
++Pn6EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVi
+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
+ZSRZIJSjqcjBwRXq/hLxTf3EC/a9Qgj2jHP3iK8pg0MNIu25P/fODXtHw30/w7eae0b2TSX1
+qu+dpiWUrzhl7Y4PHX61nODa2N6dR002y9rnif7FpwkhG+WbIhZv4j3P0Ga84k1GON2lurkG
+dzl2Y/Mxq9r2st4j1CS+2+TbbQltCOPLiHTp3PU/WsqG2ieZJvLUbAfLAHr1Nb04ci8y3KUk
+dhonxQ8Q2Y/0DXZ5kTAaKZvNX6YbOPwr1Dwn8WbTWJTa60VsLyZkCXG4+Rxwcd0JHqSM9xXh
+KRxqzlECljliBjNJclxC7IcMi7vritXFNamEqSaPsVJo7kfaIwUxlFkz9/BIHTqO4rDk1awQ
+N9qKvNHN88rRBFPzbcrknAHf1wfWvnTwH8a7zw+V0fVWmn0hpcxyLhpLXk/dDAgrznb2xx6V
+7/qVrpuq/YLa5E3mTI00bq2WA2YPJHcdfp2rBR1OKc7bl620pbm9EgYtFErcEgKzHGPl5xgc
+9e44FaX9kJ/zyi/If4VzthBHp2+zs7m4jexco+5sq+4Bs49wfwq79svP+f3/AMdNU4yM1UT3
+R//Z//4ADEFwcGxlTWFyawr/2wCEAAEBAQEBAQEBAQECAgECAgMCAgICAgMDAwIDBAQEBAQE
+BAQEBQYFBAUGBQQEBQcFBgYGBwcHBAUHCAcHCAYHBwcBAgICAgICAwICAwcFBAUHBwcHBwcH
+BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHB//EAaIAAAEFAQEB
+AQEBAAAAAAAAAAABAgMEBQYHCAkKCwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoLEAAC
+AQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoW
+FxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaH
+iImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm
+5+jp6vHy8/T19vf4+foRAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRC
+kaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl
+ZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
+x8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/AABEIAF8AdwMBIQACEQEDEQH/2gAM
+AwEAAhEDEQA/AP6Mfin4J0n4T69b6BrfjrSr7U/NCXkGk+dcyaVuHyNefIEtQ5wqmV0BJzwA
+TXxvo/ibw/8AGv4i/B6T4aadr0fjyK/dbO5lW2nC3rKyyabFJAlxbWEUlu0VxcXEolkaKUQh
+kDAH9DzHP1jsF+5i4RfxJ2u+y+e/mfF5bkawuNfM+f8Ala0t3ez2el+mvU+xrnxZ4X+D3xXb
+RNX8f+JvEHxOtNJkjbUfEka2OhWUscTTyJbXVvCkcCwIzBwIBGyxxBWjZ3du10D4i+Dvir4s
+tPFX/CxNFl0e11OVobo38Vvc3txHbCYy6bZlbwX0yBSkVvM3zY8yORchK+TrVKnKpvqvz6H0
+lOMObkhFpLa+r33vvq9vx2PMf2pP+CqM2ieCtD+IX7Nej6LqeirBLaajDrsFxDr3hO9ad4Vl
+uNNLxlrOQrHF56Pt8yWJSxEmB8j/AA2/bo1vQrfwB8OLj43+IdU8CaroMcuuatq3hK01L/hE
+7jVZDZ6fZMhkebyLabyyXlmnWWKVM7XYsrpYdeySVuZ7379LW6Myn7Sc3VlGWmyVotfzRkpX
+Tl/w6ffldB/4KIeK/EH7R5t/h+klt+ztaK8GuNrt5esNVsrWMve3Fwkt0yQ7VWaW3gt/JkZj
+BGzYIReB/bA/4LifDb4S3XxD0L4U/DHw5rGoaVoVrpWlT2tvIkWvWrlZ9Ut0cYnSFt7xKY5J
+1ZoPMwBJuE1aCT1v7q183/wwRdWP7qnZOetrbJ/1t11Z+eusf8F9P2o/jh8N9RtPCPxC/wCE
+UtbG8mXWU0rT0tb+HYRFa2nmHe6wvh33q+9iCpfAIPgCftmy6rZw+HdS8HWOp6re2s0usap4
+n1nVdUvNWtJQke2ISzp5BZ1iLCI7v9HT5goZa7MPQ9pRVSgrJ9nu1+JhUocs71mpT7zjzWV9
+oq6jr1unfY9lt/GfwI8X/s8ftK+DdS8Nv4V8Qpb6T4n8I29hqmr3Nlf6vZSCOeGaJ2eLdLaT
+XUImlCeWJSFz8xr4u/aavfCuh+E9A8NfCzUNUstKNhbw6hNqtrCXv72XMsv2cQZSOLzDH952
+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
+mH5mpTgrtJ/fr+p5GHrWg1GrJK7XXpp+h//Z
+----__JNP_000_3c67.4591.1173--
+
+--part1_23.3af50667.2d650c0e_boundary--

Modified: spamassassin/trunk/t/mimeparse.t
==============================================================================
--- spamassassin/trunk/t/mimeparse.t	(original)
+++ spamassassin/trunk/t/mimeparse.t	Mon Aug 30 14:40:35 2004
@@ -77,6 +77,14 @@
 	  '05c9e1f1f3638a5191542b0c278debe38ac98a83',
 	  'e6e71e824aec0e204367bfdc9a9e227039f42815'
 	],
+
+	"$prefix/t/data/nice/mime9" => [
+	  join("\n",'multipart/mixed','text/plain','message/rfc822,message/rfc822,multipart/mixed,multipart/alternative,text/plain,text/html,image/jpeg'),
+	  '5cdcabdb89c5fbb3a5e0c0473599668927045d9c',
+	  'f80584aff917e03d54663422918b58e4689cf993',
+	  '0228600472b0820b3b326d9d7842eef3af811cb2',
+	  '0b9fb462ad496d926ef65db0da8da451d7815ab6',
+	],
 );
 
 my $numtests = 0;
@@ -92,10 +100,14 @@
   close(INP);
 
   my $res = join("\n",$mail->content_summary());
-  #print "---\n$res\n---\n";
+# print "---\n$res\n---\n";
   ok( $res eq shift @{$files{$k}} );
   if ( @{$files{$k}} ) {
     my @parts = $mail->find_parts(qr/./,1);
+
+#    my $i = 0;
+#    foreach (@parts) { print "> $i ",$parts[$i]->{type},"\n"; $i++; }
+
     foreach ( @{$files{$k}} ) {
       $res = 1;
       if ( $_ ne '' ) {
@@ -105,7 +117,7 @@
 	else {
 	  $res = Digest::SHA1::sha1_hex($parts[0]->decode());
 	}
-	#print ">> $res\n";
+#	print ">> ",$parts[0]->{'type'}," = $res\n";
         $res = $res eq $_;
       }
       ok ( $res );