MIME-tools-5.515/0000755000175000017500000000000014612223175011533 5ustar dfsdfsMIME-tools-5.515/MYMETA.json0000644000175000017500000000315314612223142013416 0ustar dfsdfs{ "abstract" : "Tools to manipulate MIME messages", "author" : [ "Eryq , David F. Skoll , Dave O'Neill " ], "dynamic_config" : 0, "generated_by" : "Module::Install version 1.00, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "MIME-tools", "no_index" : { "directory" : [ "examples", "inc", "t" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "6.59", "Test::Deep" : "0", "Test::More" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "runtime" : { "recommends" : { "Convert::BinHex" : "0", "MIME::Base64" : "3.03" }, "requires" : { "File::Path" : "1", "File::Spec" : "0.6", "File::Temp" : "0.18", "IO::File" : "1.13", "IO::Handle" : "0", "MIME::Base64" : "2.2", "Mail::Field" : "1.05", "Mail::Header" : "1.01", "Mail::Internet" : "1.0203", "perl" : "5.008" } } }, "release_status" : "stable", "resources" : { "license" : [ "http://dev.perl.org/licenses/" ] }, "version" : "5.515", "x_module_name" : "MIME::Tools", "x_serialization_backend" : "JSON::PP version 4.07" } MIME-tools-5.515/testmsgs/0000755000175000017500000000000014612223175013404 5ustar dfsdfsMIME-tools-5.515/testmsgs/ak-0696-none.ref0000644000175000017500000000123310677325674016051 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/ak-0696.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "[Fwd: Re: 34Mbit/s Netz]", "Type" => "multipart/mixed", "To" => "andreas.koenig\@mind.de, kun\@pop.combox.de, 101762.2307\@compuserve.com", "From" => "Juergen Specht ", "Encoding" => "7bit", "Boundary" => "------------70522FC73543" }, "Part_1" => { "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "us-ascii" }, "Part_2" => { "Disposition" => "inline", "Type" => "message/rfc822", "Encoding" => "7bit" }, } MIME-tools-5.515/testmsgs/uu-zeegee.msg0000644000175000017500000001547010677325675016035 0ustar dfsdfsFrom: me To: you Subject: uudecoding I've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4YV-C8WM: M8Z5"X1C:Y1:ZU2WM[>Y1S[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R>$I;V^,I:VM MK<:EI>4O>^4M=:EI=:EK>>>EK?>>EM=ZMK>>EO=ZMM>^EK?^^EO?^MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[7]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+STCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?KNNM\2M?5A=WYG7^O;U'[%YG_J`1]5V%HB-?"%\#PA#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3$H-">LSB`.$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!MA#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end MIME-tools-5.515/testmsgs/simple.msg0000644000175000017500000000123510677325675015425 0ustar dfsdfsReturn-Path: eryq@rhine.gsfc.nasa.gov Date: Wed, 20 Dec 95 19:59 CST From: eryq@rhine.gsfc.nasa.gov To: sitaram@selsvr.stx.com Cc: johnson@killians.gsfc.nasa.gov,harvel@killians.gsfc.nasa.gov, eryq Subject: Request for Leave I will be taking vacation from Friday, 12/22/95, through 12/26/95. I will be back on Wednesday, 12/27/95. Advance notice: I may take a second stretch of vacation after that, around New Year's. Thanks, ____ __ | _/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) | _| _/ | | . | Hughes STX Corporation, NASA/Goddard Space Flight Cntr. |___|_|\_ |_ |___ | | |____/ http://selsvr.stx.com/~eryq/ `-' MIME-tools-5.515/testmsgs/frag.msg0000644000175000017500000025277610677325675015075 0ustar dfsdfsFrom - Fri May 26 10:59:48 2000 Return-Path: Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta05.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000524184032.XKFS1688.mta05.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for ; Wed, 24 May 2000 14:40:32 -0400 Received: from mail.desktop.com ([166.90.128.242]) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12ug50-00059f-00 for eryq@zeegee.com; Wed, 24 May 2000 14:40:30 -0400 Received: from mailandnews.com (jumpgate.desktop.com [166.90.128.243]) by mail.desktop.com (8.9.2/8.9.2) with ESMTP id LAA31102 for ; Wed, 24 May 2000 11:40:29 -0700 (PDT) (envelope-from omrec@mailandnews.com) Message-ID: <392C2385.4C402C55@mailandnews.com> Date: Wed, 24 May 2000 11:46:29 -0700 From: Sven Reply-To: omrec@mailandnews.com X-Mailer: Mozilla 4.7 [en] (WinNT; I) X-Accept-Language: en MIME-Version: 1.0 To: Eryq Subject: [Fwd: [Fwd: [Fwd: FW: Another Priceless Moment]]] Content-Type: multipart/mixed; boundary="------------ABE49921AF9E83E8F9A7667E" X-Mozilla-Status: 8001 This is a multi-part message in MIME format. --------------ABE49921AF9E83E8F9A7667E Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------ABE49921AF9E83E8F9A7667E Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Received: from mail.vynce.org [63.198.43.13] (vynce@vynce.org); Tue, 23 May 2000 22:00:16 -0400 X-Envelope-To: omrec Received: from vynce.org (166.90.128.243) by mail.vynce.org with ESMTP (Eudora Internet Mail Server 1.3.1); Tue, 23 May 2000 19:05:52 -0700 Message-ID: <392B389A.1968998B@vynce.org> Date: Tue, 23 May 2000 19:04:10 -0700 From: Vynce Organization: Desktop.com X-Mailer: Mozilla 4.61 [en] (Win98; U) X-Accept-Language: en MIME-Version: 1.0 To: omrec@mailandnews.com Subject: [Fwd: [Fwd: FW: Another Priceless Moment]] Content-Type: multipart/mixed; boundary="------------4CEB5E448DC077F35050C4BE" X-Mozilla-Status2: 00000000 This is a multi-part message in MIME format. --------------4CEB5E448DC077F35050C4BE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit just to add to your personal hell. --------------4CEB5E448DC077F35050C4BE Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Return-Path: Received: from iglou.com (192.107.41.3) by mail.vynce.org with SMTP (Eudora Internet Mail Server 1.3.1); Thu, 18 May 2000 16:10:02 -0700 Received: from [204.255.234.19] (helo=ntserver2.snesystems.com) by iglou.com with esmtp (8.9.3/8.9.3) id 12sZKw-0007JK-00; Thu, 18 May 2000 19:04:15 -0400 Received: from snesystems.com (sne-30.snesystems.com [204.255.234.30]) by ntserver2.snesystems.com with SMTP (Microsoft Exchange Internet Mail Service Version 5.5.2650.21) id LGJH8AYQ; Thu, 18 May 2000 19:03:40 -0400 Sender: root@mail.vynce.org Message-ID: <39247724.AF25EF83@snesystems.com> Date: Thu, 18 May 2000 19:05:08 -0400 From: root Reply-To: jasonc@snesystems.com Organization: SNE Systems, Inc. X-Mailer: Mozilla 4.72 [en] (X11; I; Linux 2.2.12-20 i686) X-Accept-Language: ja, en MIME-Version: 1.0 To: vynce@vynce.org Subject: [Fwd: FW: Another Priceless Moment] Content-Type: multipart/mixed; boundary="------------8B533A82922407D7C3D35A99" X-Mozilla-Status2: 00000000 This is a multi-part message in MIME format. --------------8B533A82922407D7C3D35A99 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit --------------8B533A82922407D7C3D35A99 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline Received: by ntserver2 id <01BFC0CA.C31F7A10@ntserver2>; Thu, 18 May 2000 09:12:47 -0400 Message-ID: <01D476341BDBD211B7C500A0CC209BA03DF5C6@ntserver2> From: Shawn Morgan To: Wayne Price , Tim Spayner , Gary Jones , Jason Chelliah Subject: FW: Another Priceless Moment Date: Thu, 18 May 2000 09:12:47 -0400 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----_=_NextPart_000_01BFC0CA.C32A4450" This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. ------_=_NextPart_000_01BFC0CA.C32A4450 Content-Type: text/plain; charset="iso-8859-1" -----Original Message----- From: Shawn Morgan [mailto:cephalos@home.com] Sent: Wednesday, May 17, 2000 8:18 PM To: Shawn Morgan Subject: Fw: Another Priceless Moment ----- Original Message ----- From: Michele Morgan To: Sent: Tuesday, May 16, 2000 10:31 PM Subject: Fw: Another Priceless Moment > > ------_=_NextPart_000_01BFC0CA.C32A4450 Content-Type: image/jpeg; name="aprilfools.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="aprilfools.jpg" /9j/4AAQSkZJRgABAgEASABIAAD/7Q4uUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQABOEJJTQQNAAAAAAAEAAAAeDhCSU0D8wAAAAAACAAAAAAAAAAAOEJJTQQKAAAAAAAB AAA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9m ZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4 AAAAAABwAAD/////////////////////////////A+gAAAAA//////////////////////////// /wPoAAAAAP////////////////////////////8D6AAAAAD///////////////////////////// A+gAADhCSU0EAAAAAAAAAgACOEJJTQQCAAAAAAAGAAAAAAAAOEJJTQQIAAAAAAAQAAAAAQAAAkAA AAJAAAAAADhCSU0EFAAAAAAABAAAAAQ4QklNBAwAAAAADH4AAAABAAAAcAAAAFQAAAFQAABuQAAA DGIAGAAB/9j/4AAQSkZJRgABAgEASABIAAD/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkM EQsKCxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0L Cw0ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAz/wAARCABUAHADASIAAhEBAxEB/90ABAAH/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQF BgcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhED BCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0NhfS VeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAgIB AgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJQYW 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 AAEBAP/iDFhJQ0NfUFJPRklMRQABAQAADEhMaW5vAhAAAG1udHJSR0IgWFlaIAfOAAIACQAGADEA AGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAAAAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MA AAGEAAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoAAAIsAAAAFGJY WVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1ZWQAAANMAAAAhnZpZXcAAAPUAAAA JGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAAJHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8 AAAIDGJUUkMAAAQ8AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAEnNSR0Ig SUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABYWVogAAAAAAAA81EAAQAAAAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+i AAA49QAAA5BYWVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAAAAAA AAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNo AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAA LklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAA LklFQyA2MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAA AAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2luZyBDb25kaXRpb24gaW4gSUVD NjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYx OTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3M AAQTCwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAAAAAFAAoADwAUABkAHgAjACgALQAy ADcAOwBAAEUASgBPAFQAWQBeAGMAaABtAHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwA wQDGAMsA0ADVANsA4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFn AW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQCHQImAi8COAJBAksC VAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+ A4oDlgOiA64DugPHA9MD4APsA/kEBgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE /gUNBRwFKwU6BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0GrwbA BtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghGCFoIbgiCCJYIqgi+CNII 5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEKJwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtR C2kLgAuYC7ALyAvhC/kMEgwqDEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMO Lg5JDmQOfw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1ERMRMRFP EW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QTxRPlFAYUJxRJFGoUixStFM4U 8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxayFtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjV GPoZIBlFGWsZkRm3Gd0aBBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4d Rx1wHZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwhSCF1IaEhziH7 IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4JWgllyXHJfcmJyZXJocmtyboJxgn SSd6J6sn3CgNKD8ocSiiKNQpBik4KWspnSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizX LQwtQS12Last4S4WLkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQz DTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgUOFA4jDjIOQU5Qjl/ Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRA pkDnQSlBakGsQe5CMEJyQrVC90M6Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgF SEtIkUjXSR1JY0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+TT91Q J1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9WXFapVvdXRFeSV+BYL1h9 WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0nXXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9h omH1YklinGLwY0Njl2PrZEBklGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3 a09rp2v/bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0FHRwdMx1 KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwhfIF84X1BfaF+AX5ifsJ/I3+E f+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSK yoswi5aL/IxjjMqNMY2Yjf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0 lp+XCpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBpoNihR6G2oiai lqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyqj6sCq3Wr6axcrNCtRK24ri2uoa8W r4uwALB1sOqxYLHWskuywrM4s660JbSctRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8 m70VvY++Cr6Evv+/er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4 yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V0dZV1tjXXNfg2GTY 6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep 6DLovOlG6dDqW+rl63Dr++yG7RHtnO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3 ivgZ+Kj5OPnH+lf65/t3/Af8mP0p/br+S/7c/23////uAA5BZG9iZQBkAAAAAAH/2wCEAAYEBAQF BAYFBQYJBgUGCQsIBgYICwwKCgsKCgwQDAwMDAwMEAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwBBwcHDQwNGBAQGBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDP/AABEIAeACgAMBEQACEQEDEQH/3QAEAFD/xAGiAAAABwEBAQEBAAAAAAAAAAAE BQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJz AQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYX VGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eH l6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6EQACAgECAwUF BAUGBAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz 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 q4g+/wBOKrh0r3HTFVhDDqevhirVCHJ6bde+KtToWhNW2FT94xVbHVYIjy+P4eP0ZFtx8050pX1o zAcrJIF5xTyitZP99oRuvPsWwF22I0LRFvJLPKsdpEPWY8JpH2o7Ap8R8aimRbweJL7meWe3kjSO UvaExvyO5OKeClkl7cRWkcYqsZCgIdmr3APfFqlFM7DTF1O9Vbw8oYlqig05HwIxboZKRd/La6be W1jZIvqXFUdPskBlNfiwo+opNqVu73sUssKehH8MdtuSVU0K/NsDbE0jrTT71XJkkWJJBzSMmirT 7KqT+1kSmMt1trolrqv1u5aVXjtVHqK7GNUJH2zx3ffwwLOW6hNNM9otvLKtrKKRMXJU8gPhovU/ CcHCw4lDTvLWnwalZ3P6QNybct60YQqAT0JPsclEKSmEdhY/pPULm3kAiaNISUbYS8qlqftfD8OS Qp2OlST6tE87LPb2tJfTc8RV24Vp/qiuQRki7VJ5RexWkYItxLxZx/LyNA2GmyI2TjV7HTU0e4CR rGgjY8kFGFCKke+PCwjzWW19oT2SpAoeqEUNCWNMkESviSyGzt20uS6IaOW93EYruD9lae2LOORB 2ltqWlre2shKX1+EFjcH4yp2oK9sWUpWmd7o+qzzSSXrrLa3VuLa5h5lVDruZBX4a1xYjmgLCcLq S6dptuOUcPKYqQFb09uS02rizmo65BqepwTQWyvGaDkDxUU9hinYBlunaDaDSoUuwkzMimVpO527 9sBcMzNsb1prWaxS2QWz28CGKEsT6sbgn4dvtZFyNOLKF0qe3k0eS1nSnH+7+L4yxYfEoO/wqCuL dOA4il811c2T+jayFTUFX7jfo2LLw9l2tprss9p9ZijkkJohQ0oxFV38MWojhR2swxDg6SNb3USK 4eNvhSUAcipyJZjITAphqWiX0yW2pS3jzRafAtzJcn+5mc/7qiVeh/yssi4cJEFLtcv7SzeB76wW C8YJNHJQOOD9myLeBTa2ljqV4kt7cRSiMBo7cLWqnooAxZSyUuutEM90hsZPqkinZo6A8fkMWPjI fU9AtrSSDU74tdurUZpPiI49NsmEylxBqbWLOe1Z7cKxXiaKu9V37YWsR6Kia9pOqXltNf2EaSsw SW4XmgbagDKNmwJ8FEzeYdTewljs4WF3YzqZRAnOMwA9qdOS9sLXOFFj0t1BfeZnNvI9pb3ClpQP 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 Ec7jlsTUD2I8cWUrR9zpt9diNbG --------------8B533A82922407D7C3D35A99-- --------------4CEB5E448DC077F35050C4BE-- --------------ABE49921AF9E83E8F9A7667E-- MIME-tools-5.515/testmsgs/multi-weirdspace.msg0000644000175000017500000000437510677325675017422 0ustar dfsdfsReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" There is an empty preamble, and linear space after the bounds. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- MIME-tools-5.515/testmsgs/multi-igor.ref0000644000175000017500000000176510677325675016222 0ustar dfsdfs{ "Part_1" => { "Size" => 293, "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "US-ASCII" }, "Part_2" => { "Filename" => "Makefile", "Size" => 2442, "Type" => "text/plain", "Encoding" => "base64", "Charset" => "US-ASCII" }, "Part_3" => { "Filename" => "multi-nested.msg", "Size" => 3272, "Type" => "text/plain", "Encoding" => "base64", "Charset" => "US-ASCII" }, "Part_4" => { "Filename" => "Parser.n.out", "Size" => 906, "Type" => "text/plain", "Encoding" => "base64", "Charset" => "US-ASCII" }, "Msg" => { "Subject" => "Need help", "Type" => "multipart/mixed", "To" => "eryq\@rhine.gsfc.nasa.gov", "From" => "Starovoitov Igor ", "Encoding" => "7bit", "Boundary" => "-490585488-806670346-834061839=:2195" }, "Parser" => { "Message" => "testmsgs/multi-igor.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" } } MIME-tools-5.515/testmsgs/multi-nested.msg0000644000175000017500000000620110677325675016544 0ustar dfsdfsMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="/evil/filename"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. MIME-tools-5.515/testmsgs/multi-nested2.msg0000644000175000017500000000620110677325675016626 0ustar dfsdfsMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="/evil/filename"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. MIME-tools-5.515/testmsgs/attachment-filename-encoding-UTF8.msg0000644000175000017500000000107311511640147022330 0ustar dfsdfsMIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004" This is a multi-part message in MIME format. --------------050706070100080203090004 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Attachment Test --------------050706070100080203090004 Content-Type: text/plain; name="=?UTF-8?B?YXR0YWNobWVudC7DpMO2w7w=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=UTF-8''%61%74%74%61%63%68%6D%65%6E%74%2E%C3%A4%C3%B6%C3%BC VGVzdAo= --------------050706070100080203090004-- MIME-tools-5.515/testmsgs/german-qp.msg0000644000175000017500000000123110677325675016017 0ustar dfsdfsContent-Type: text/plain; charset="iso-8859-15" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: JaM - Just A Mailer Subject: Testnachricht Return-Path: Date: Wed, 21 Dec 2005 22:02:44 +0100 To: joern@zyn.de From: =?ISO-8859-15?Q?J=F6rn?= Reder =0A= Hallo,=0A= =0A= das ist eine Testnachricht mit 8 Bit S=F6nderz=E4ichen, und obendrein noch= =20=0A= quoted-printable kodiert.=0A= =0A= Gr=FC=DFe,=0A= =0A= J=F6rn=0A= --=20=0A= .''`. J=F6rn Reder =0A= : :' : http://www.exit1.org/ http://www.zyn.de/=0A= `. `'=0A= `- Debian GNU/Linux -- The power of freedom=0A= MIME-tools-5.515/testmsgs/multi-igor2.ref0000644000175000017500000000176610677325675016305 0ustar dfsdfs{ "Part_1" => { "Size" => 293, "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "US-ASCII" }, "Part_2" => { "Filename" => "Makefile", "Size" => 2442, "Type" => "text/plain", "Encoding" => "base64", "Charset" => "US-ASCII" }, "Part_3" => { "Filename" => "multi-nested.msg", "Size" => 3272, "Type" => "text/plain", "Encoding" => "base64", "Charset" => "US-ASCII" }, "Part_4" => { "Filename" => "Parser.n.out", "Size" => 906, "Type" => "text/plain", "Encoding" => "base64", "Charset" => "US-ASCII" }, "Msg" => { "Subject" => "Need help", "Type" => "multipart/mixed", "To" => "eryq\@rhine.gsfc.nasa.gov", "From" => "Starovoitov Igor ", "Encoding" => "7bit", "Boundary" => "-490585488-806670346-834061839=:2195" }, "Parser" => { "Message" => "testmsgs/multi-igor2.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" } } MIME-tools-5.515/testmsgs/ticket-60931.msg0000644000175000017500000000056611450700206016056 0ustar dfsdfsMIME-Version: 1.0 Received: by 10.220.78.157 with HTTP; Thu, 26 Aug 2010 21:33:17 -0700 (PDT) Content-Type: multipart/alternative; boundary=90e6ba4fc6ea25d329048ec69d99 --90e6ba4fc6ea25d329048ec69d99 Content-Type: text/plain; charset=ISO-8859-1 HELLO --90e6ba4fc6ea25d329048ec69d99 Content-Type: text/html; charset=ISO-8859-1 HELLO
--90e6ba4fc6ea25d329048ec69d99-- MIME-tools-5.515/testmsgs/multi-2evil.ref0000644000175000017500000000163012046017063016247 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/multi-2evil.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "Two images for you...", "Type" => "multipart/mixed", "To" => "john-bigboote\@eryq.pr.mcs.net", "From" => "Eryq ", "Encoding" => "7bit", "Boundary" => "------------299A70B339B65A93542D2AE", }, "Part_1" => { "Size" => 417, "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "us-ascii" }, "Part_2" => { "Filename" => qq{/evil/because:ofpath3d-compress.gif}, "BodyFilename" => "because_ofpath3d-compress.gif", "Size" => 419, "Disposition" => "inline", "Type" => "image/gif", "Encoding" => "base64" }, "Part_3" => { "BodyFilename" => "3d-eye-is-an-e.dat", "Size" => 357, "Type" => "image/gif", "Encoding" => "base64" }, } MIME-tools-5.515/testmsgs/dup-names.ref0000644000175000017500000000200110677325675016003 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/dup-names.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Part_1" => { "Filename" => "one.gif", "BodyFilename" => "one.gif", "Size" => 419, "Disposition" => "inline", "Type" => "image/gif", "Encoding" => "base64" }, "Part_2" => { "Filename" => "one.gif", "BodyFilename" => "one-1.gif", "Size" => 357, "Type" => "image/gif", "Encoding" => "base64" }, "Part_3" => { "Filename" => "two.nice.gif", "BodyFilename" => "two.nice.gif", "Size" => 419, "Disposition" => "inline", "Type" => "image/gif", "Encoding" => "base64" }, "Part_4" => { "Filename" => "two.nice.gif", "BodyFilename" => "two-1.nice.gif", "Size" => 357, "Type" => "image/gif", "Encoding" => "base64" }, "Part_5" => { "Filename" => "two.nice.gif", "BodyFilename" => "two-2.nice.gif", "Size" => 357, "Type" => "image/gif", "Encoding" => "base64" }, } MIME-tools-5.515/testmsgs/hdr-fakeout-newmailtools-ref0000644000175000017500000000055712706225715021040 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/hdr-fakeout.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "test message 1", "Type" => "text/plain", "To" => "\"Russell P. Sutherland\" ", "From" => "\"Russell P. Sutherland\" ", "Encoding" => "7bit" } } MIME-tools-5.515/testmsgs/multi-clen.msg0000644000175000017500000000243110677325675016204 0ustar dfsdfsFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary This is implicitly typed plain ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: text/x-numbers; charset=us-ascii Content-length: 30 123456789 123456789 123456789 --simple boundary Content-type: text/x-alphabet; charset=us-ascii Content-length: 600 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 --simple boundary-- This is the epilogue. It is also to be ignored. MIME-tools-5.515/testmsgs/double-content-id.msg0000644000175000017500000000061214554502724017434 0ustar dfsdfsFrom: Test To: Test Subject: Ambiguous boundary MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bar" --bar Content-Type: text/plain Whatever --bar Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; name="innocuous.txt" Content-Id: Content-Id: Z290Y2hhCg== --bar-- MIME-tools-5.515/testmsgs/multi-nested3.ref0000644000175000017500000000337110677325675016622 0ustar dfsdfs{ "Part_3_1" => { "Filename" => "3d-vise.gif", "Size" => 419, "Disposition" => "inline", "Subject" => "Part 1 of the inner message is a GIF, \"3d-vise.gif\"", "Type" => "image/gif", "Encoding" => "base64" }, "Part_3_2" => { "Filename" => "3d-eye.gif", "Size" => 357, "Disposition" => "inline", "Subject" => "Part 2 of the inner message is another GIF, \"3d-eye.gif\"", "Type" => "image/gif", "Encoding" => "base64" }, "Parser" => { "Message" => "testmsgs/multi-nested3.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Part_5_1" => { "Size" => 57, "Subject" => "Part 5 of the outer message is itself an RFC822 message!", "Type" => "text/plain", "To" => "(address in US-ASCII)", "From" => "(mailbox in US-ASCII)", "Encoding" => "quoted-printable", "Charset" => "ISO-8859-1" }, "Part_1" => { "Size" => 208, "Type" => "text/plain", "Encoding" => "7bit" }, "Part_2" => { "Size" => 140, "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "US-ASCII" }, "Part_3" => { "Subject" => "Part 3 of the outer message is multipart!", "Type" => "multipart/parallel", "Encoding" => "7bit", "Boundary" => "unique-boundary-2" }, "Part_4" => { "Size" => 148, "Type" => "text/richtext", "Encoding" => "7bit" }, "Part_5" => { "Filename" => "nice.name", "Type" => "message/rfc822", "Encoding" => "7bit" }, "Msg" => { "Subject" => "A complex nested multipart example", "Type" => "multipart/mixed", "To" => "", "From" => "Lord John Whorfin ", "Encoding" => "7bit", "Boundary" => "unique-boundary-1" } } MIME-tools-5.515/testmsgs/empty-preamble.msg0000644000175000017500000000164210677325675017061 0ustar dfsdfsContent-Type: multipart/mixed; boundary="t0UkRYy7tHLRMCai" Content-Disposition: inline --t0UkRYy7tHLRMCai Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Das ist ein Test. --=20 sub i($){print$_[0]}*j=3D*ENV;sub w($){sleep$_[0]}sub _($){i"$p:$c> ",w+01 ,$_=3D$_[0],tr;i-za-h,;a-hi-z ;,i$_,w+01,i"\n"}$|=3D1;$f=3D'HO';($c=3D$j{PW= D})=3D~ s+$j{$f."ME"}+~+;$p.=3D"$j{USER}\@".`hostname`;chop$p;_"kl",$c=3D'~',_"zu,". "-zn,*",_"#,epg,lw,gwc,mfmkcbm,cvsvwev,uiqt,kwvbmvb?",i"$p:$c> ";w+1<<07 --t0UkRYy7tHLRMCai Content-Type: image/png Content-Disposition: attachment; filename="dot.png" Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAACXBIWXMAAAsTAAALEwEAmpwY AAAAB3RJTUUH1AUbFQQ0Vbb7XQAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJ TVDvZCVuAAAAFklEQVR42mP8//8/AwMDEwMDAwMDAwAkBgMB/umWrAAAAABJRU5ErkJggg== --t0UkRYy7tHLRMCai-- MIME-tools-5.515/testmsgs/multi-weirdspace.ref0000644000175000017500000000150310677325675017376 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/multi-weirdspace.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "Two images for you...", "Type" => "multipart/mixed", "To" => "john-bigboote\@eryq.pr.mcs.net", "From" => "Eryq ", "Encoding" => "7bit", "Boundary" => "------------299A70B339B65A93542D2AE" }, "Part_1" => { "Size" => 420, "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "us-ascii" }, "Part_2" => { "Filename" => "3d-compress.gif", "Size" => 419, "Disposition" => "inline", "Type" => "image/gif", "Encoding" => "base64" }, "Part_3" => { "Filename" => "3d-eye.gif", "Size" => 357, "Type" => "image/gif", "Encoding" => "base64" }, } MIME-tools-5.515/testmsgs/double-content-disposition-param.msg0000644000175000017500000000056014554502724022504 0ustar dfsdfsFrom: Test To: Test Subject: Ambiguous boundary MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bar" --bar Content-Type: text/plain Whatever --bar Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; name="wookie.exe"; name="innocuous.txt" Z290Y2hhCg== --bar-- MIME-tools-5.515/testmsgs/dup-names.msg0000644000175000017500000000733310677325675016032 0ustar dfsdfsReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="one.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="two.nice.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- MIME-tools-5.515/testmsgs/multi-igor2.msg0000644000175000017500000002451410677325675016313 0ustar dfsdfsDate: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Makefile Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFy aWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBl cmw1IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZl IGVudGlyZSBwYXRoKToNClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJv YmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlc2UuLi4NCk1PRFMgICAg ICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2VyLnBtIEJh c2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0K DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJnZXRz OiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3Rv dXQvKg0KDQp0ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0K Iwkke1BFUkw1fSBNSU1FL0hlYWQucG0gICA8IHRlc3Rpbi9maXJzdC5oZHIg ICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hvICJURVNUSU5HIERl Y29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQoj CUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQ RVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0aW4vc2ltcGxlLm1zZyAgICAg ID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRFU1RJTkcgUGFy c2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNl ci5wbSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNl ci5tLm91dA0KCUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVz dGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0 aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4ub3V0DQoJ QGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RV TEUqLm91dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRp dCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZpbGUiOyBleGl0IC0xOyBc DQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRFX1BF Ukx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNo b3VsZCB5b3UgYmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAg ICAgICAgIA0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9L01JTUUgXTsgdGhl biBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1FOyBcDQogICAgICAg IGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBv bmx5Li4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1MX0ZMQUdTID0g LS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAg ICAgICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1J TUUNCg0KLlNVRkZJWEVTOiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdl bmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkgaXMgb25seSBiZWNhdXNlIDEu OCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50ZWQJDQoJ VkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRW RVJTSU9OIDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04u dGd6ICR7SE9NRX0vcHVibGljX2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDog JHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoNCglwb2QyaHRtbCAke1BP RDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQktLWlu ZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0K ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: test message TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3 aG9yZmluQHlveW9keW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5l LmNvbT4NClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQgbXVsdGlwYXJ0IGV4 YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KICAgICBi b3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2Yg dGhlIG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRo YXQgdW5kZXJzdGFuZCBtdWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3Jl IHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyB0ZXh0 LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcgdG8gYSBt YWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkg ZGlzcGxheSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFy eS0xDQoNClBhcnQgMSBvZiB0aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRo YXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1lYW5zDQpubyBoZWFkZXIg ZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGggY2hh cnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRo IGV4cGxpY2l0IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11 bmlxdWUtYm91bmRhcnktMQ0KQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUgb3V0ZXIgbWVzc2Fn ZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxp Y2l0DQp0eXBpbmcgb2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRh cnktMQ0KU3ViamVjdDogUGFydCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlz IG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3BhcmFsbGVs Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1s aW5lIHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2Uu DQotLXVuaXF1ZS1ib3VuZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dp Zg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQpDb250ZW50 LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21wcmVzcy5n aWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMg YSBHSUYsICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFB QUFBQUFBQWdCNlEveTlQVDI1dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQ LzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtBQW9BQUFFL2hESlNhdTll SkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpvRkNZ NDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNj c3h0OWM0SGdYeFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdH Z29NSGhZY2tpV1Z1UjMrT1RnQ0dlWlJzbG90d2dKMmxuWWlnZlpkVGpRVUxy N0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJldFFOOHQ4SWp1cnkr d010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpF QmVCbDZhZmdDc09CckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhC WlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1Z3pPVTdtemhCUGlTWjV1RE5uQTdi L2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4bHdjUjE3WXNX TXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRl bnQtVHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n OiBiYXNlNjQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5h bWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQYXJ0IDIgb2YgdGhlIGlubmVy IG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0KDQpSMGxH T0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8v K2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFv QUFBRS9oREpTYXU5ZUpiTU95NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQx b1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGprdm1zUW11OG9jL0tCVVNW V2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RDZVJS amZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNU QUtHaWFhU2Zwd0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJn QXhzVzR2RmFidjhCT3RCc0J0N2NHdndDSVQ5bk95TkVJeHVDNHpycUt6YzlY Yk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5hNnIyYmhLUVhOMTdG WUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUt Ym91bmRhcnktMi0tDQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11 bHRpcGFydCBtZXNzYWdlLg0KDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQpDb250 ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8Ym9sZD5wYXJ0 IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBk ZWZpbmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3Qg aXQgPGJpZ2dlcj48YmlnZ2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoN Ci0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9y ZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpUbzogKGFk ZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91 dGVyIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29u dGVudC1UeXBlOiBUZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNv bnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1wcmludGFibGUNCg0K UGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBSRkM4 MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBl cGlsb2d1ZSBmb3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo= ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: out from parser KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCkNvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVk DQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQg bXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250 ZW50LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC9tc2ctMzUzOC0xLmRvYw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0 ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAuL3Rlc3RvdXQvbXNnLTM1Mzgt Mi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L3Bh cmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFy dCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBO dW0tcGFydHM6IDINCiAgICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGlt YWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1jb21w cmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBpbm5l ciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAg ICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAg ICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1leWUuZ2lmDQogICAgICAgIFN1 YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2FnZSBpcyBhbm90aGVy IEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0K ---490585488-806670346-834061839=:2195-- MIME-tools-5.515/testmsgs/double-content-type.msg0000644000175000017500000000056314554502724020026 0ustar dfsdfsFrom: Test To: Test Subject: Ambiguous boundary MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bar" --bar Content-Type: text/plain Whatever --bar Content-Type: application/octet-stream Content-Type: text/plain Content-Transfer-Encoding: base64 Content-Disposition: attachment; name="wookie.exe" Z290Y2hhCg== --bar-- MIME-tools-5.515/testmsgs/multi-nested3.msg0000644000175000017500000000617410677325675016640 0ustar dfsdfsMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="nice.name"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. MIME-tools-5.515/testmsgs/simple.ref0000644000175000017500000000054110677325675015412 0ustar dfsdfs{ "Msg" => { "Size" => 443, "Subject" => "Request for Leave", "Type" => "text/plain", "To" => "sitaram\@selsvr.stx.com", "From" => "eryq\@rhine.gsfc.nasa.gov", "Encoding" => "7bit" }, "Parser" => { "Message" => "testmsgs/simple.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" } } MIME-tools-5.515/testmsgs/bluedot-postcard.msg0000644000175000017500000001543410677325675017415 0ustar dfsdfsContent-Type: multipart/alternative; boundary="----------=_961872013-1436-0" Content-Transfer-Encoding: binary Mime-Version: 1.0 X-Mailer: MIME-tools 5.211 (Entity 5.205) To: noone Subject: A postcard for you This is a multi-part message in MIME format... ------------=_961872013-1436-0 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: binary Having a wonderful time... wish you were looking at HTML instead of this boring text! ------------=_961872013-1436-0 Content-Type: multipart/related; boundary="----------=_961872013-1436-1" Content-Transfer-Encoding: binary This is a multi-part message in MIME format... ------------=_961872013-1436-1 Content-Type: text/html Content-Disposition: inline Content-Transfer-Encoding: binary

Hey there!

Having a wonderful time... take a look!
Snapshot
------------=_961872013-1436-1 Content-Type: image/jpeg; name="bluedot.jpg" Content-Disposition: inline; filename="bluedot.jpg" Content-Transfer-Encoding: base64 Content-Id: my-graphic /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/ 2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEAAQADASIAAhEBAxEB/8QA HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRom JygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKjnnhtbeW4uJY4YIkLySSMF VFAySSeAAOc0ASUVw+p/E3TY1MeiW0uqzgkb8NBbjB6+ay/MCM4MauDgZIBB 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 KOGCJAkccahVRQMAADgADjFeFjM2veFD7/8AL/M+qy7h+zVXFf8AgP8An/l/ wxDp2nWmk6fDY2MCw20IwiAk9Tkkk8kkkkk5JJJJJNWqKK8I+r2CiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlNY+H2iarcPdQef pd1I5eWawKp5pJJJZGVkLEnJfbvOAN2OK5O88AeJ7PJt5dN1ONV3kqXtZCf7 iod6k8cEyKCTg4AyfV6K6aOLr0dIS0OLEZdhcRrVgm++z+9HiU2j+IrWJprr wzqccK/edDDORngfJFI7nn0U46nABNVP9L/6A2uf+Ce6/wDjde8UV2RzjELd J/L/AIJ5suHMG3o5L5r9UeEJHfzSLHFomttI5CoraZPGCT0BZ0Cr9WIA7kCt GHwx4ruZViXw7JbFv+Wt3dwLEvf5jG7t7DCnkjOBkj2ailLN8Q9rL5f5lQ4d wcd7v1f+SR5xYfDK7lkR9Z1lTCQGe2sITGc8ZQzMxJXGRlVRjwQV6V2ukeH9 I0GN00rTra0MgUSvHGA8u3ODI/3nPJ5Yk5JOeTWlRXBVr1KrvUdz1aGFo4dW pRSCiiisjoCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z ------------=_961872013-1436-1-- ------------=_961872013-1436-0-- MIME-tools-5.515/testmsgs/multi-clen.ref0000644000175000017500000000135010677325675016171 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/multi-clen.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "Sample message", "Type" => "multipart/mixed", "To" => " Ned Freed ", "From" => "Nathaniel Borenstein ", "Encoding" => "7bit", "Boundary" => "simple boundary" }, "Part_1" => { "Size" => 76, "Type" => "text/plain", "Encoding" => "7bit" }, "Part_2" => { "Size" => 30, "Type" => "text/x-numbers", "Encoding" => "7bit", "Charset" => "us-ascii" }, "Part_3" => { "Size" => 600, "Type" => "text/x-alphabet", "Encoding" => "7bit", "Charset" => "us-ascii" }, } MIME-tools-5.515/testmsgs/malformed-content-type-zip.msg0000644000175000017500000000120012225565154021306 0ustar dfsdfsMIME-Version: 1.0 To: someone@example.com Subject: Payroll Received by Intuit Content-Type: multipart/mixed; boundary="----=_Part_67482_7396105824.6005753659145" ------=_Part_67482_7396105824.6005753659145 Content-Type: text/plain; charset=windows-1251; format=flowed Content-Transfer-Encoding: 7bit Dear, We received your payroll on October 9, 2013 at 4:55 PM . ------=_Part_67482_7396105824.6005753659145 Content-Type: ; name="payroll_report_429047_10092013.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; name="payroll_report_409401_10092013.zip" Z290Y2hhCg== ------=_Part_67482_7396105824.6005753659145-- MIME-tools-5.515/testmsgs/re-fwd.msg0000644000175000017500000000141310677325675015316 0ustar dfsdfsContent-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user2 To: user0 Subject: Re: Fwd: hello world Content-Disposition: inline Content-Transfer-Encoding: binary Content-Type: message/rfc822 MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user1 To: user2 Subject: Fwd: hello world Content-Disposition: inline Content-Length: 60 Content-Transfer-Encoding: binary Content-Type: text/plain MIME-Version: 1.0 X-Mailer: MIME::Lite 1.147 (B2.09; Q2.03) Date: Tue, 6 Jun 2000 03:20:11 UT From: user0 To: user1 Subject: hello world This is the original message. Let's see if we can embed it! MIME-tools-5.515/testmsgs/multi-2gifs.msg0000644000175000017500000000450610677325675016302 0ustar dfsdfsReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- That was a multi-part message in MIME format. MIME-tools-5.515/testmsgs/multi-simple.ref0000644000175000017500000000114610677325675016544 0ustar dfsdfs{ "Part_1" => { "Size" => 76, "Type" => "text/plain", "Encoding" => "7bit" }, "Part_2" => { "Size" => 73, "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "us-ascii" }, "Msg" => { "Subject" => "Sample message", "Type" => "multipart/mixed", "To" => " Ned Freed ", "From" => "Nathaniel Borenstein ", "Encoding" => "7bit", "Boundary" => "simple boundary" }, "Parser" => { "Message" => "testmsgs/multi-simple.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" } } MIME-tools-5.515/testmsgs/bluedot-simple.msg0000644000175000017500000001347210677325675017067 0ustar dfsdfsContent-Type: image/jpeg; name="bluedot.jpg" Content-Disposition: inline; filename="bluedot.jpg" Content-Transfer-Encoding: base64 Content-Id: my-graphic /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsL DBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/ 2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEAAQADASIAAhEBAxEB/8QA HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUF BAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkK FhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1 dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEB AQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRom JygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU 1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKjnnhtbeW4uJY4YIkLySSMF VFAySSeAAOc0ASUVw+p/E3TY1MeiW0uqzgkb8NBbjB6+ay/MCM4MauDgZIBB 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 KOGCJAkccahVRQMAADgADjFeFjM2veFD7/8AL/M+qy7h+zVXFf8AgP8An/l/ wxDp2nWmk6fDY2MCw20IwiAk9Tkkk8kkkkk5JJJJJNWqKK8I+r2CiiigAooo oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlNY+H2iarcPdQef pd1I5eWawKp5pJJJZGVkLEnJfbvOAN2OK5O88AeJ7PJt5dN1ONV3kqXtZCf7 iod6k8cEyKCTg4AyfV6K6aOLr0dIS0OLEZdhcRrVgm++z+9HiU2j+IrWJprr wzqccK/edDDORngfJFI7nn0U46nABNVP9L/6A2uf+Ce6/wDjde8UV2RzjELd J/L/AIJ5suHMG3o5L5r9UeEJHfzSLHFomttI5CoraZPGCT0BZ0Cr9WIA7kCt GHwx4ruZViXw7JbFv+Wt3dwLEvf5jG7t7DCnkjOBkj2ailLN8Q9rL5f5lQ4d wcd7v1f+SR5xYfDK7lkR9Z1lTCQGe2sITGc8ZQzMxJXGRlVRjwQV6V2ukeH9 I0GN00rTra0MgUSvHGA8u3ODI/3nPJ5Yk5JOeTWlRXBVr1KrvUdz1aGFo4dW pRSCiiisjoCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA//Z MIME-tools-5.515/testmsgs/utf8-bom-at-start.msg0000644000175000017500000000156413347746066017335 0ustar dfsdfsReceived: from VE1EUR03FT004.eop-EUR03.prod.protection.outlook.com (10.152.18.56) by VE1EUR03HT067.eop-EUR03.prod.protection.outlook.com (10.152.19.97) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.1143.11; Sat, 15 Sep 2018 01:38:07 +0000 Subject: Invoice 548_KUFN530642878 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="foo" --foo Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable =0DInvoice details as follows. NO_B_548_KUFN530642878_09_15_2018.doc --- Aurora Dominguez Aurora.Dominguez@exeltis.com --foo Content-Type: application/msword; name="NO_B_548_KUFN530642878_09_15_2018.doc" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="NO_B_548_KUFN530642878_09_15_2018.doc" UkVEQUNURUQK --foo-- MIME-tools-5.515/testmsgs/multi-simple.msg0000644000175000017500000000117510677325675016560 0ustar dfsdfsFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary This is implicitly typed plain ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: text/plain; charset=us-ascii This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. MIME-tools-5.515/testmsgs/russian.msg0000644000175000017500000000027310677325675015621 0ustar dfsdfsContent-Type: text/plain; charset="US-ASCII"; name==?koi8-r?B?89DJ08/LLmRvYw==?= Content-Disposition: attachment; filename==?koi8-r?B?89DJ08/LLmRvYw==?= Subject: Greetings Salutations MIME-tools-5.515/testmsgs/multi-2evil.msg0000644000175000017500000000500410677325675016303 0ustar dfsdfsReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="/evil/because:of\path\3d-=?ISO-8859-1?Q?=63?=om=?US-ASCII*EN?Q?pr?=ess.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye-is-an-evil-filename because of excessive length and verbosity. Unfortunately what can we do given an idiotic situation such as this?" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- That was a multi-part message in MIME format. MIME-tools-5.515/testmsgs/uu-junk-target.msg0000644000175000017500000002161110677325675017016 0ustar dfsdfsReturn-Path: Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for ; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for ; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001 -----------------------------7d033e3733c Content-Type: text/plain Eryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com -----------------------------7d033e3733c Content-type: multipart/mixed; boundary="----------=_960622044-2175-0" The following is a multipart MIME message which was extracted from a uuencoded message. ------------=_960622044-2175-0 Here's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below. ------------=_960622044-2175-0 Content-Type: image/gif; name="up.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="up.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204) R0lGODdhEwATAKEAAP///wAAAICAgMDAwCwAAAAAEwATAAACR4SPmcHtz0xQ FIgJ5ti8b3FJgEcOIKaV3SmSgcdmY9esoUw7XJwO0Gu6pX6MIGqm+giRSR5T 5UzulqCq9Yq6aq0oIrECPhQAADs= ------------=_960622044-2175-0 Content-Type: image/gif; name="zeegee.gif"; x-unix-mode="0644" Content-Disposition: inline; filename="zeegee.gif" Content-Transfer-Encoding: base64 Mime-Version: 1.0 X-Mailer: MIME-tools 5.208 (Entity 5.204) R0lGODdhWwBwAPcAAAAAAAgICBAQEDkAITkAKUIAKRgYGEoAKUoAMVIAMVIA OVoAMSEhIVoAOVIIMWMAOWMAQloIOWsAQmMIOWMIQikpKVoQOWsIQmsISmMQ OWMQQnMISjExMUIpMWsQSnsIUnMQUnMQSmsYQoQIUoQIWlIpOXMYQowIWjk5 OWshQkI5OZQIWpQIY4wQWnMhSoQYUoQYWpQQY1I5QnshUkJCQnMpSoQhSnMp UoQhUoQhWoQpUpQhY0pKSms5UnsxWnM5UpQpY1JSUmNKUlpSSpQxY5Qxa5wx a5Q5WpQ5Y4RCWpQ5a1paWoxCWoRKY6U5c5xCY4xKa605a5RKY5xCe2NjY3ta Y6VCc5RSa6VKa3tjY61Ka2tra61Kc61Ke4Rja5Rac3tra6VSe61Sc6Vaa7VS c3Nzc4xra61ac61ahLVahK1jc4xzc61je3t7e5Rzc61jhJxzc61re71je4x7 e5xze7Vre71jlJx7e4SEhL1rhJx7lKV7e71rjKV7hKV7lJyEe71zjKV7nN5j jIyMjK17nKWEhM5rlL17jK2EhLV7nM5zjK2EjLV7pd5rlJSUlK2MjLWEpb2E pbWMjLWMlNZ7nL2MjK2UjL2MlN57lN57nJycnN6ElL2UlMaUlMaUnNaMnKWl peeEpb2cnM6UnNaUnO+ErcacnNaUpd6Mtd6Mvc6cnM6cpd6Upb2lpe+Mpa2t rcalpc6lpeeUve+UtdalpdalreecrbW1td6lrd6lpd6ltfecpeelrfecrdat reeltd6treelvd6tte+lrf+ctf+cvb29ve+lvf+cxuetreette+lzvelvf+l ve+tvf+lxue1tf+lzvetxsbGxu+1td69te+1vf+tvfe1vee9ve+9vf+1zv+1 xve9vc7OzufGvfe9xv+9xv+9zvfGxv+93vfGztbW1v/Gxv/Gzv/G3v/G5//O zu/Wzv/O1t7e3v/O3v/W1v/W3v/W5+fn5//e3v/e5//n3v/n5//n7//n9+/v 7//v7/f39//39//3/////ywAAAAAWwBwAAcI/wD/CRxIsKDBgwgTKlzIsKHD hxAjSpxIsaLFixgzapQYqaNHSCBDihwZkpHJRIRSqlzJsmWglzBj+plJs+ZM PThz6lS4oafPnhiCYrhAtCiFo0ghKIXwoIHTp1AbKJiqIIHVqwiyatV6oGuB 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 WrzFXNzFXvzFYBzGYpwRAcEAOw== ------------=_960622044-2175-0-- -----------------------------7d033e3733c-- MIME-tools-5.515/testmsgs/hdr-fakeout.msg0000644000175000017500000000077610677325675016356 0ustar dfsdfsReceived: (qmail 24486 invoked by uid 501); 20 May 2000 01:55:02 -0000 Date: Fri, 19 May 2000 21:55:02 -0400 From: "Russell P. Sutherland" To: "Russell P. Sutherland" Subject: test message 1 Message-ID: <20000519215502.A24482@quist.on.ca> Mime-Version: 1.0 Content-transfer-encoding: 7BIT Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0us Organization: Quist Consulting The header is not properly terminated; the "blank line" actually has a space in it. MIME-tools-5.515/testmsgs/re-fwd.ref0000644000175000017500000000133410677325675015306 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/re-fwd.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Disposition" => "inline", "Subject" => "Re: Fwd: hello world", "Type" => "message/rfc822", "To" => "user0", "From" => "user2", "Encoding" => "binary" }, "Part_1" => { "Disposition" => "inline", "Subject" => "Fwd: hello world", "Type" => "message/rfc822", "To" => "user2", "From" => "user1", "Encoding" => "binary" }, "Part_1_1" => { "Size" => 60, "Disposition" => "inline", "Subject" => "hello world", "Type" => "text/plain", "To" => "user1", "From" => "user0", "Encoding" => "binary" }, } MIME-tools-5.515/testmsgs/multi-nested2.ref0000644000175000017500000000337610677325675016626 0ustar dfsdfs{ "Part_3_1" => { "Filename" => "3d-vise.gif", "Size" => 419, "Disposition" => "inline", "Subject" => "Part 1 of the inner message is a GIF, \"3d-vise.gif\"", "Type" => "image/gif", "Encoding" => "base64" }, "Part_3_2" => { "Filename" => "3d-eye.gif", "Size" => 357, "Disposition" => "inline", "Subject" => "Part 2 of the inner message is another GIF, \"3d-eye.gif\"", "Type" => "image/gif", "Encoding" => "base64" }, "Parser" => { "Message" => "testmsgs/multi-nested2.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Part_5_1" => { "Size" => 58, "Subject" => "Part 5 of the outer message is itself an RFC822 message!", "Type" => "text/plain", "To" => "(address in US-ASCII)", "From" => "(mailbox in US-ASCII)", "Encoding" => "quoted-printable", "Charset" => "ISO-8859-1" }, "Part_1" => { "Size" => 208, "Type" => "text/plain", "Encoding" => "7bit" }, "Part_2" => { "Size" => 140, "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "US-ASCII" }, "Part_3" => { "Subject" => "Part 3 of the outer message is multipart!", "Type" => "multipart/parallel", "Encoding" => "7bit", "Boundary" => "unique-boundary-2" }, "Part_4" => { "Size" => 148, "Type" => "text/richtext", "Encoding" => "7bit" }, "Part_5" => { "Filename" => "/evil/filename", "Type" => "message/rfc822", "Encoding" => "7bit" }, "Msg" => { "Subject" => "A complex nested multipart example", "Type" => "multipart/mixed", "To" => "", "From" => "Lord John Whorfin ", "Encoding" => "7bit", "Boundary" => "unique-boundary-1" } } MIME-tools-5.515/testmsgs/ak-0696-nest.ref0000644000175000017500000000165210677325674016070 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/ak-0696.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "[Fwd: Re: 34Mbit/s Netz]", "Type" => "multipart/mixed", "To" => "andreas.koenig\@mind.de, kun\@pop.combox.de, 101762.2307\@compuserve.com", "From" => "Juergen Specht ", "Encoding" => "7bit", "Boundary" => "------------70522FC73543" }, "Part_1" => { "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "us-ascii" }, "Part_2" => { "Disposition" => "inline", "Type" => "message/rfc822", "Encoding" => "7bit" }, "Part_2_1" => { "Subject" => "Re: 34Mbit/s Netz", "Type" => "text/plain", "To" => "Juergen Specht ", "From" => "deuschle\@mnh.telekom.de (Guenter Deuschle)", "Encoding" => "quoted-printable", "Charset" => "iso-8859-1" }, } MIME-tools-5.515/testmsgs/bluedot-simple.ref0000644000175000017500000000047510677325675017054 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/bluedot-simple.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Filename" => "bluedot.jpg", "Size" => 4272, "Disposition" => "inline", "Type" => "image/jpeg", "Encoding" => "base64" }, } MIME-tools-5.515/testmsgs/double-content-disposition.msg0000644000175000017500000000062014554502724021403 0ustar dfsdfsFrom: Test To: Test Subject: Ambiguous boundary MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bar" --bar Content-Type: text/plain Whatever --bar Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; name="wookie.exe" Content-Disposition: attachment; name="innocuous.txt" Z290Y2hhCg== --bar-- MIME-tools-5.515/testmsgs/multi-nested.ref0000644000175000017500000000337510677325675016543 0ustar dfsdfs{ "Part_3_1" => { "Filename" => "3d-vise.gif", "Size" => 419, "Disposition" => "inline", "Subject" => "Part 1 of the inner message is a GIF, \"3d-vise.gif\"", "Type" => "image/gif", "Encoding" => "base64" }, "Part_3_2" => { "Filename" => "3d-eye.gif", "Size" => 357, "Disposition" => "inline", "Subject" => "Part 2 of the inner message is another GIF, \"3d-eye.gif\"", "Type" => "image/gif", "Encoding" => "base64" }, "Parser" => { "Message" => "testmsgs/multi-nested.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Part_5_1" => { "Size" => 57, "Subject" => "Part 5 of the outer message is itself an RFC822 message!", "Type" => "text/plain", "To" => "(address in US-ASCII)", "From" => "(mailbox in US-ASCII)", "Encoding" => "quoted-printable", "Charset" => "ISO-8859-1" }, "Part_1" => { "Size" => 208, "Type" => "text/plain", "Encoding" => "7bit" }, "Part_2" => { "Size" => 140, "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "US-ASCII" }, "Part_3" => { "Subject" => "Part 3 of the outer message is multipart!", "Type" => "multipart/parallel", "Encoding" => "7bit", "Boundary" => "unique-boundary-2" }, "Part_4" => { "Size" => 148, "Type" => "text/richtext", "Encoding" => "7bit" }, "Part_5" => { "Filename" => "/evil/filename", "Type" => "message/rfc822", "Encoding" => "7bit" }, "Msg" => { "Subject" => "A complex nested multipart example", "Type" => "multipart/mixed", "To" => "", "From" => "Lord John Whorfin ", "Encoding" => "7bit", "Boundary" => "unique-boundary-1" } } MIME-tools-5.515/testmsgs/german.msg0000644000175000017500000000760110677325675015410 0ustar dfsdfsX-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D MIME-tools-5.515/testmsgs/double-boundary.msg0000644000175000017500000000056314554502724017220 0ustar dfsdfsFrom: Test To: Test Subject: Ambiguous boundary MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bar"; boundary="foo" --foo Content-Type: text/plain Whatever --bar Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Disposition: attachment; name="wookie.exe" Z290Y2hhCg== --bar-- --foo-- MIME-tools-5.515/testmsgs/double-content-transfer-encoding.msg0000644000175000017500000000060614554502724022453 0ustar dfsdfsFrom: Test To: Test Subject: Ambiguous boundary MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="bar" --bar Content-Type: text/plain Whatever --bar Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; name="wookie.exe" Z290Y2hhCg== --bar-- MIME-tools-5.515/testmsgs/attachment-filename-encoding-Latin1.msg0000644000175000017500000000107011511640147022727 0ustar dfsdfsMIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050706070100080203090004" This is a multi-part message in MIME format. --------------050706070100080203090004 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Attachment Test --------------050706070100080203090004 Content-Type: text/plain; name="=?ISO-8859-1?B?YXR0YWNobWVudC7k9vw=?=" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*=ISO-8859-1''%61%74%74%61%63%68%6D%65%6E%74%2E%E4%F6%FC VGVzdAo= --------------050706070100080203090004-- MIME-tools-5.515/testmsgs/bluedot-postcard.ref0000644000175000017500000000157610677325675017405 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/bluedot-postcard.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "A postcard for you", "Type" => "multipart/alternative", "To" => "noone", "Encoding" => "binary", "Boundary" => "----------=_961872013-1436-0" }, "Part_1" => { "Size" => 88, "Disposition" => "inline", "Type" => "text/plain", "Encoding" => "binary" }, "Part_2" => { "Type" => "multipart/related", "Encoding" => "binary", "Boundary" => "----------=_961872013-1436-1" }, "Part_2_1" => { "Size" => 123, "Disposition" => "inline", "Type" => "text/html", "Encoding" => "binary" }, "Part_2_2" => { "Filename" => "bluedot.jpg", "Size" => 4272, "Disposition" => "inline", "Type" => "image/jpeg", "Encoding" => "base64" } } MIME-tools-5.515/testmsgs/german.ref0000644000175000017500000000063110677325675015372 0ustar dfsdfs{ "Msg" => { "Subject" => "Re: 34Mbit/s Netz", "Type" => "text/plain", "To" => "Juergen Specht ", "From" => "deuschle\@mnh.telekom.de (Guenter Deuschle)", "Encoding" => "quoted-printable", "Charset" => "iso-8859-1" }, "Parser" => { "Message" => "testmsgs/german.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" } } MIME-tools-5.515/testmsgs/multi-frag.msg0000644000175000017500000000625210677325675016207 0ustar dfsdfsMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif", but the terminating boundary is bad! R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 XXXXXX--unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="nice.name"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. MIME-tools-5.515/testmsgs/russian.ref0000644000175000017500000000041011521635536015565 0ustar dfsdfs{ "Msg" => { "Subject" => "Greetings", "Type" => "text/plain", "Filename" => "\x{421}\x{43f}\x{438}\x{441}\x{43e}\x{43a}.doc", }, "Parser" => { "Message" => "testmsgs/russian.msg", "OutputToCore" => "0", "Charset" => "KOI8-R", } } MIME-tools-5.515/testmsgs/double-semicolon.msg0000644000175000017500000000034011147321150017341 0ustar dfsdfsMime-Version: 1.0 Content-Type: multipart/alternative;; boundary="foo" Preamble --foo Content-Type: text/plain; charset=us-ascii The better part --foo Content-Type: text/plain; charset=us-ascii The worse part --foo-- MIME-tools-5.515/testmsgs/multi-digest.msg0000644000175000017500000000140010677325675016535 0ustar dfsdfsFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample digest message MIME-Version: 1.0 Content-type: multipart/digest; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary From: noone@nowhere.org Subject: embedded message 1 This is implicitly-typed ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: message/rfc822; charset=us-ascii From: noone@nowhere.org Subject: embedded message 2 Content-type: text This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. MIME-tools-5.515/testmsgs/uu-junk.msg0000644000175000017500000002062110677325675015532 0ustar dfsdfsFrom - Fri Jun 9 23:17:56 2000 Return-Path: Received: from virtual.mrf.mail.rcn.net ([207.172.4.103]) by mta02.mrf.mail.rcn.net (InterMail vM.4.01.02.27 201-229-119-110) with ESMTP id <20000425112650.ZPUD516.mta02.mrf.mail.rcn.net@virtual.mrf.mail.rcn.net> for ; Tue, 25 Apr 2000 07:26:50 -0400 Received: from [205.139.141.226] (helo=webmail.uwohali.com ident=root) by virtual.mrf.mail.rcn.net with esmtp (Exim 2.12 #3) id 12k3VX-00012G-00 for eryq@zeegee.com; Tue, 25 Apr 2000 07:27:59 -0400 Received: from webmail.uwohali.com (nobody@localhost [127.0.0.1]) by webmail.uwohali.com (8.8.7/8.8.7) with SMTP id GAA10264 for ; Tue, 25 Apr 2000 06:34:43 -0500 Date: Tue, 25 Apr 2000 06:34:43 -0500 Message-Id: <200004251134.GAA10264@webmail.uwohali.com> From: "ADJE Webmail Tech Support" To: eryq@zeegee.com Subject: mime::parser Content-type: multipart/mixed; boundary="---------------------------7d033e3733c" Mime-Version: 1.0 X-Mozilla-Status: 8001 -----------------------------7d033e3733c Content-Type: text/plain Eryq - I occasionally receive an email (see below) like this one, which MIME::Parser does not parse. Any ideas? Is this a valid way to send an attachment, or is the problem on the "sender's" side? Thanks for your time! Mike -->> Promote YOUR web site! FREE Perl CGI scripts add WEB ACCESS to your -->> E-Mail accounts! Download today!! http://webmail.uwohali.com -----------------------------7d033e3733c Here's what he's talking about. I've uuencoded the ZeeGee logo and another GIF file below. begin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end begin 644 zeegee.gif M1TE&.#=A6P!P`/<```````@("!`0$#D`(3D`*4(`*1@8&$H`*4H`,5(`,5(` M.5H`,2$A(5H`.5((,6,`.6,`0EH(.6L`0F,(.6,(0BDI*5H0.6L(0FL(2F,0 M.6,00G,(2C$Q,4(I,6L02GL(4G,04G,02FL80H0(4H0(6E(I.7,80HP(6CDY M.6LA0D(Y.90(6I0(8XP06G,A2H084H086I008U(Y0GLA4D)"0G,I2H0A2G,I M4H0A4H0A6H0I4I0A8TI*2FLY4GLQ6G,Y4I0I8U)24F-*4EI22I0Q8Y0Q:YPQ M:Y0Y6I0Y8X1"6I0Y:UI:6HQ"6H1*8Z4YV-C8WM: M8Z5"X1C:Y1:ZU2WM[>Y1S[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R>$I;V^,I:VM MK<:EI>4O>^4M=:EI=:EK>>>EK?>>EM=ZMK>>EO=ZMM>^EK?^^EO?^MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[7]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+STCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?KNNM\2M?5A=WYG7^O;U'[%YG_J`1]5V%HB-?"%\#PA#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3$H-">LSB`.$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!MA#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end -----------------------------7d033e3733c-- MIME-tools-5.515/testmsgs/double-semicolon2.msg0000644000175000017500000000036011147321150017425 0ustar dfsdfsMime-Version: 1.0 Content-Type: multipart/alternative ; ; ; ;; ;;;;;;;; boundary="foo" Preamble --foo Content-Type: text/plain; charset=us-ascii The better part --foo Content-Type: text/plain; charset=us-ascii The worse part --foo-- MIME-tools-5.515/testmsgs/uu-junk-extracted.ref0000644000175000017500000000201110677325675017472 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/uu-junk.msg", "ExtractUuencode" => 1, "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "mime::parser", "Type" => "multipart/mixed", "To" => "eryq\@zeegee.com", "From" => "\"ADJE Webmail Tech Support\" ", "Encoding" => "7bit", "Boundary" => "---------------------------7d033e3733c" }, "Part_1" => { "Size" => 373, "Type" => "text/plain", "Encoding" => "7bit" }, "Part_2" => { "Type" => "multipart/mixed", "Encoding" => "7bit", }, "Part_2_1" => { "Size" => 93, "Type" => "text/plain", "Encoding" => "7bit" }, "Part_2_2" => { "Filename" => "up.gif", "Size" => 110, "Disposition" => "inline", "Type" => "image/gif", "Encoding" => "base64" }, "Part_2_3" => { "Filename" => "zeegee.gif", "Size" => 4834, "Disposition" => "inline", "Type" => "image/gif", "Encoding" => "base64" } } MIME-tools-5.515/testmsgs/hdr-fakeout.ref0000644000175000017500000000026710677325675016337 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/hdr-fakeout.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { Fail => 1, } } MIME-tools-5.515/testmsgs/multi-digest.ref0000644000175000017500000000163610677325675016536 0ustar dfsdfs{ "Part_1" => { "Type" => "message/rfc822", "Encoding" => "7bit" }, "Part_2" => { "Type" => "message/rfc822", "Encoding" => "7bit", "Charset" => "us-ascii" }, "Part_1_1" => { "Size" => 70, "Subject" => "embedded message 1", "Type" => "text/plain", "From" => "noone\@nowhere.org", "Encoding" => "7bit" }, "Part_2_1" => { "Size" => 73, "Subject" => "embedded message 2", "Type" => "text", "From" => "noone\@nowhere.org", "Encoding" => "7bit" }, "Msg" => { "Subject" => "Sample digest message", "Type" => "multipart/digest", "To" => " Ned Freed ", "From" => "Nathaniel Borenstein ", "Encoding" => "7bit", "Boundary" => "simple boundary" }, "Parser" => { "Message" => "testmsgs/multi-digest.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" } } MIME-tools-5.515/testmsgs/ak-0696.msg0000644000175000017500000001121210677325674015124 0ustar dfsdfsFrom specht@kulturbox.de Thu Jun 20 08:35:23 1996 Date: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: MULTIPART/MIXED; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de This is a multi-part message in MIME format. --------------70522FC73543 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit -- Juergen Specht - KULTURBOX --------------70522FC73543 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D --------------70522FC73543-- MIME-tools-5.515/testmsgs/multi-2gifs.ref0000644000175000017500000000202510677325675016262 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/multi-2gifs.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "Two images for you...", "Type" => "multipart/mixed", "To" => "john-bigboote\@eryq.pr.mcs.net", "From" => "Eryq ", "Encoding" => "7bit", "Boundary" => "------------299A70B339B65A93542D2AE", "Preamble" => "This is a multi-part message in MIME format.\n", "Epilogue" => "That was a multi-part message in MIME format.\n", }, "Part_1" => { "Size" => 417, "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "us-ascii" }, "Part_2" => { "Filename" => "3d-compress.gif", "BodyFilename" => "3d-compress.gif", "Size" => 419, "Disposition" => "inline", "Type" => "image/gif", "Encoding" => "base64" }, "Part_3" => { "Filename" => "3d-eye.gif", "BodyFilename" => "3d-eye.gif", "Size" => 357, "Type" => "image/gif", "Encoding" => "base64" }, } MIME-tools-5.515/testmsgs/multi-igor.msg0000644000175000017500000002451410677325675016231 0ustar dfsdfsDate: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Makefile Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFy aWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBl cmw1IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZl IGVudGlyZSBwYXRoKToNClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJv YmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlc2UuLi4NCk1PRFMgICAg ICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2VyLnBtIEJh c2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0K DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJnZXRz OiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3Rv dXQvKg0KDQp0ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0K Iwkke1BFUkw1fSBNSU1FL0hlYWQucG0gICA8IHRlc3Rpbi9maXJzdC5oZHIg ICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hvICJURVNUSU5HIERl Y29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQoj CUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQ RVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0aW4vc2ltcGxlLm1zZyAgICAg ID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRFU1RJTkcgUGFy c2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNl ci5wbSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNl ci5tLm91dA0KCUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVz dGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0 aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4ub3V0DQoJ QGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RV TEUqLm91dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRp dCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZpbGUiOyBleGl0IC0xOyBc DQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRFX1BF Ukx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNo b3VsZCB5b3UgYmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAg ICAgICAgIA0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9L01JTUUgXTsgdGhl biBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1FOyBcDQogICAgICAg IGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBv bmx5Li4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1MX0ZMQUdTID0g LS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAg ICAgICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1J TUUNCg0KLlNVRkZJWEVTOiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdl bmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkgaXMgb25seSBiZWNhdXNlIDEu OCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50ZWQJDQoJ VkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRW RVJTSU9OIDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04u dGd6ICR7SE9NRX0vcHVibGljX2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDog JHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoNCglwb2QyaHRtbCAke1BP RDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQktLWlu ZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0K ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: test message TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3 aG9yZmluQHlveW9keW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5l LmNvbT4NClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQgbXVsdGlwYXJ0IGV4 YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KICAgICBi b3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2Yg dGhlIG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRo YXQgdW5kZXJzdGFuZCBtdWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3Jl IHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyB0ZXh0 LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcgdG8gYSBt YWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkg ZGlzcGxheSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFy eS0xDQoNClBhcnQgMSBvZiB0aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRo YXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1lYW5zDQpubyBoZWFkZXIg ZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGggY2hh cnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRo IGV4cGxpY2l0IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11 bmlxdWUtYm91bmRhcnktMQ0KQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUgb3V0ZXIgbWVzc2Fn ZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxp Y2l0DQp0eXBpbmcgb2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRh cnktMQ0KU3ViamVjdDogUGFydCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlz IG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3BhcmFsbGVs Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1s aW5lIHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2Uu DQotLXVuaXF1ZS1ib3VuZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dp Zg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQpDb250ZW50 LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21wcmVzcy5n aWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMg YSBHSUYsICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFB QUFBQUFBQWdCNlEveTlQVDI1dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQ LzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtBQW9BQUFFL2hESlNhdTll SkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpvRkNZ NDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNj c3h0OWM0SGdYeFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdH Z29NSGhZY2tpV1Z1UjMrT1RnQ0dlWlJzbG90d2dKMmxuWWlnZlpkVGpRVUxy N0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJldFFOOHQ4SWp1cnkr d010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpF QmVCbDZhZmdDc09CckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhC WlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1Z3pPVTdtemhCUGlTWjV1RE5uQTdi L2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4bHdjUjE3WXNX TXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRl bnQtVHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n OiBiYXNlNjQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5h bWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQYXJ0IDIgb2YgdGhlIGlubmVy IG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0KDQpSMGxH T0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8v K2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFv QUFBRS9oREpTYXU5ZUpiTU95NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQx b1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGprdm1zUW11OG9jL0tCVVNW V2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RDZVJS amZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNU QUtHaWFhU2Zwd0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJn QXhzVzR2RmFidjhCT3RCc0J0N2NHdndDSVQ5bk95TkVJeHVDNHpycUt6YzlY Yk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5hNnIyYmhLUVhOMTdG WUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUt Ym91bmRhcnktMi0tDQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11 bHRpcGFydCBtZXNzYWdlLg0KDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQpDb250 ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8Ym9sZD5wYXJ0 IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBk ZWZpbmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3Qg aXQgPGJpZ2dlcj48YmlnZ2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoN Ci0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9y ZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpUbzogKGFk ZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91 dGVyIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29u dGVudC1UeXBlOiBUZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNv bnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1wcmludGFibGUNCg0K UGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBSRkM4 MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBl cGlsb2d1ZSBmb3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo= ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: out from parser KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCkNvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVk DQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQg bXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250 ZW50LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC9tc2ctMzUzOC0xLmRvYw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0 ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAuL3Rlc3RvdXQvbXNnLTM1Mzgt Mi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L3Bh cmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFy dCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBO dW0tcGFydHM6IDINCiAgICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGlt YWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1jb21w cmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBpbm5l ciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAg ICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAg ICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1leWUuZ2lmDQogICAgICAgIFN1 YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2FnZSBpcyBhbm90aGVy IEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0K ---490585488-806670346-834061839=:2195-- MIME-tools-5.515/testmsgs/uu-zeegee.ref0000644000175000017500000000130210677325675016010 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/uu-zeegee.msg", "ExtractUuencode" => 1, "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" }, "Msg" => { "Subject" => "uudecoding", "Type" => "multipart/mixed", "To" => "you", "From" => "me", "Encoding" => "7bit", }, "Part_1" => { "Type" => "text/plain", "Encoding" => "7bit" }, "Part_2" => { "Filename" => "up.gif", "Size" => 110, "Disposition" => "inline", "Type" => "image/gif", "Encoding" => "base64" }, "Part_3" => { "Filename" => "zeegee.gif", "Size" => 4834, "Disposition" => "inline", "Type" => "image/gif", "Encoding" => "base64" } } MIME-tools-5.515/testmsgs/ak-0696-replace.ref0000644000175000017500000000150310677325674016525 0ustar dfsdfs{ "Parser" => { "Message" => "testmsgs/ak-0696.msg", "ExtractNested" => "REPLACE", "OutputToCore" => 0, "Name" => "anonymous" }, "Msg" => { "Subject" => "[Fwd: Re: 34Mbit/s Netz]", "Type" => "multipart/mixed", "To" => "andreas.koenig\@mind.de, kun\@pop.combox.de, 101762.2307\@compuserve.com", "From" => "Juergen Specht ", "Encoding" => "7bit", "Boundary" => "------------70522FC73543" }, "Part_1" => { "Type" => "text/plain", "Encoding" => "7bit", "Charset" => "us-ascii", }, "Part_2" => { "Charset" => "iso-8859-1", "Encoding" => "quoted-printable", "From" => "deuschle\@mnh.telekom.de (Guenter Deuschle)", "Subject" => "Re: 34Mbit/s Netz", "To" => "Juergen Specht ", "Type" => "text/plain", }, } MIME-tools-5.515/testmsgs/uu-junk.ref0000644000175000017500000000114210677325675015515 0ustar dfsdfs{ "Part_1" => { "Size" => 373, "Type" => "text/plain", "Encoding" => "7bit" }, "Part_2" => { "Size" => 6965, "Type" => "text/plain", "Encoding" => "7bit" }, "Msg" => { "Subject" => "mime::parser", "Type" => "multipart/mixed", "To" => "eryq\@zeegee.com", "From" => "\"ADJE Webmail Tech Support\" ", "Encoding" => "7bit", "Boundary" => "---------------------------7d033e3733c" }, "Parser" => { "Message" => "testmsgs/uu-junk.msg", "ExtractNested" => 1, "OutputToCore" => "0", "Name" => "anonymous" } } MIME-tools-5.515/INSTALLING0000644000175000017500000000133010677325674013135 0ustar dfsdfs------------------------------------------------------------ STANDARD INSTALLATION On most systems, just do this from the command line: perl Makefile.PL make test make install Please note that you'll need permission to write to the standard installation directories; under Unix-like systems, this often means that you must be logged in as "root". If you're on a non-Unix platform, you might be using 'dmake' instead of 'make'. ------------------------------------------------------------ NON-STANDARD INSTALLATION To install to a non-standard place else (e.g., "/home/me/lib"), see the manual page for ExtUtils::MakeMaker, or try this: perl Makefile.PL LIB=/home/me/lib make test make install MIME-tools-5.515/testin/0000755000175000017500000000000014612223175013041 5ustar dfsdfsMIME-tools-5.515/testin/lennie.msg0000644000175000017500000000675410677325674015055 0ustar dfsdfsReturn-Path: Received: from brickbat8.mindspring.com (brickbat8.mindspring.com [207.69.200.11]) by camel10.mindspring.com (8.8.5/8.8.5) with ESMTP id GAA27894 for ; Fri, 25 Jul 1997 06:58:07 -0400 (EDT) Received: from lennie (user-2k7i8oq.dialup.mindspring.com [168.121.35.26]) by brickbat8.mindspring.com (8.8.5/8.8.5) with SMTP id GAA22488 for ; Fri, 25 Jul 1997 06:58:05 -0400 (EDT) Message-ID: <33D89532.29EA@atl.mindspring.com> Date: Fri, 25 Jul 1997 06:59:46 -0500 From: Lennie Jarratt Reply-To: lbj_ccsi@mindspring.com Organization: Custom Computer Services Inc. X-Mailer: Mozilla 3.01Gold (Win95; I) MIME-Version: 1.0 To: lbj_ccsi@atl.mindspring.com Subject: Test Mail Again Content-Type: multipart/mixed; boundary="------------52E03A8932B4" This is a multi-part message in MIME format. --------------52E03A8932B4 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit This is the message body. A picture should also be displayed. --------------52E03A8932B4 Content-Type: text/html; charset=us-ascii; name="Pull3.html" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="Pull3.html" Content-Base: "file:///E|/ChckFree/Html/Pull3.html" Client Pull Rolling Page Demo> This is Page 3 of my rolling web page demo. --------------52E03A8932B4 Content-Type: image/gif; name="WWWIcon.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="WWWIcon.gif" R0lGODdhPAA8AOYAAP///+/v7+fv7+/39/f//9be3r3O1rXGzsbW3qW1va29xoyltXOMnGuE lClSa4ScrXuUpUJje1p7lFJzjEprhDlacxhCYylScyFKaxA5WggxUgApSt7n773GzpytvZSl tWuEnM7W3sbO1q29zqW1xoycrYSUpWN7lFpzjFJrhEJjhDlaezFScylKayFCYwgxWgApUtbe 5yFCaxg5YxAxWggpUpSlvXOEnFpzlFJrjEpjhEJaezlSc3uMpYyctYSUrb3G1sbO3qWtvbW9 zq21xufn79bW3t7e5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAPAA8AAAH/4AAgoOEhYaHiImKi4yNjo+QkZKTlJWW l5iZmpucnZ6foKGinSIfJxEtMzMtEScfIqOKRwsUMy4YLQ4sLA4tGC4zFAtHsYQBCysWLSwr KhQ5Eyg5FCorLC0WKwsBxUAoyhU6KA0MEA8lJQ8QDCcoOhXYKECjQhUyLDo4DA8fQkRDAIcQ EfLhAQMcOljIqCAklI0WLVZMAPHAA5EDBoKE2BgCgYEDRDw8ADFhBUQbnzxgwLACBQMfCYYA QRCiQIybMYx0NDAkgQ8GKFas9NCpAwsLLChQ9KAAowiaHDcGEfFRgUgQFI6y6LBJQA4aLnjk APHjgwcSRBSMGLI24AgFRP9IePjwA0SOCi5o5BCgqQQMsEkl3Ohh4seDc+gSJz5sAsKNE1nz wiiRKUYLGBoy3Nuhg0KKHNAmiB6NYjRoCjp2KMygAUaLGJj8woDxIoMFGRBz6drFu7eDXhAx WMjwYvZkTCuMY35BI4Pz59CjR6fxorXxFZg4bNgxCIYMQydqwALwQ0OCQkVgROjuQtOGE4Nc cBc0/gcMDoKEwBg/HgAM+ILIpwkLJgyyA4AAjCDICBsMYsAG+CU4CIEGInjJDkQJckKBABjA oQHtCaKdgQZmCMCGmphgwCAmKNghgvMJwoKBEarIoouYmBDCIAusCMACMaZAiJCC0OCjjjz6 iIn/j/gpaQINDgIQoZIbLCAIkx1usmOWWwKQQoOC7OjjliFswOGWK3a5iYUA7LCBkj+q+WCM GoJCJwA0bIAjADbyuMGMhNypyYOFbGBmoBwKYoKhhBDqyQgwDDAIB7PdQAgLlg5ywmySLhjp IASkuN8gIsy2XnenChLBbP3ZB+clshlXgwYvMEcDdbXmquutuGpQg3LHXWKZcbRmMIMFFriA 7LLMLqusBTMQZ51rsMU2Ww21WYBLb7v89hu318gw3Au/BouJABRgRoO2LFSwQwTwxiuvvDtU wIJwNLRGAV+adNCCBjTMgAEzEajQGQUIJ5ywDipEYC8GM+TbAleceDBDkmbKtPuuDgcrzHEE O1iDDWszmMjJBxcb68IyzKyww7sgh2zNNcCQ/EEoHvxb27G4QbQbcC2IG211LZj8SQcpYEZr c6ocC60qGVCnQWspUDyKACVcIOvUXHNdLgwXlMBvMQDEUMIOwKYNww4lVEt2IQaUgAILM8w2 AwsolPDq23z37fffgAcu+OCEF2744YgnXnggADs= --------------52E03A8932B4-- MIME-tools-5.515/testin/mime-lg.b640000644000175000017500000010115010677325674014721 0ustar dfsdfsR0lGODdh2gC8APYAAFUai1WAv1VAvwBAv39/fwBAgKpAQIAAAKoAABpfZy9+ iMzMzLAwYAAMFYN9flVAgDBQYAAAAMPDwwAAQACAgKq/v2m1tdLS0rAAIAYS FWCgwACAv7SamgAMEoyMjHppadO1tby8vFx8gunp6fXesxcmKhIcI6pAv8vL y19fX6qAv1UAABIsOQkTGVVAAFpzeWQAAIuZtdra2v+/v+Hh4fj4+ABAQCB0 2NfX16q/QFggMLqgp+/j48bV4v9AQEKap1WA//+Av/Dw8GmCgklzeapAAI+P jw0bHiU4Qaq/gP+/////zBgpMVVA/8Dg4PdZhjlOUwAAcAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAA2gC8 AAAH/oAODDEnRicPDicqHA6NJw4EAg4BQyovIjEoIRIgnZ2MHyehDkpRDwIP BakJBQWsrRSwrQWxA7SzCbYFFrwaGkQKAQqqAwk3rbm0trG3sczOBRuyt6wb 1bfN2dLR0bnQ0rHg3M4D0AXD2LHe49rK0MzD6MkUxdPQjwwnjydPKir6+mII UBEggEBKIoxUCLHJ0ycGjQypgIBqwIMBCoodG7aOFQVWCWrl4uirgq8fMYg8 iBHgQYJ4rqzletmtnKtyCbZ9/Ggt1rBwzSi8c5czpLefRcHlbPcx20ec5Z76 HLfM4zlkTpt5XNc01r4HHBQZSjQkQKRJAssSoBRjYYgk/p44zPj0SMWOKKhS FYDgyio1aR1duVKgoZeGITFieAjwgnHBVBiLiXOWoLI1alKxhaS1FZvTncpY KSAH+t3mb5xtCt38cye00VpNqzY6lXK2AocUKXogKsCHACcKClxrNoAHTBUW cnIIYi6IB3YBPKCYkePlj5UFN81O2IKvwxZQlo0hglIAAQGAECkgwNhVjku3 Dp2fdedpq6cpsBhtVGdpzj2xppVq1OAkDmdTceaULdL8VB8tYf1DACFlBVfQ WmUVZx4mPVQgwQ4LMNfJXDvsgMQDqaQCAUYF1MMOSOd850sMh6G0WAwoiVDe EL99AERLA6y4FD1XdQUggufQ/tdUOqm9tgELUWS0VYO0OPMMO/ZdJ186Sd3E U0xaKUjPPFl5IEoo5rE0hFoXmqdWQj3swBAIcIkolwwP6IAiBAoIgBU1WFHw Q2G+IGaQoSzZWNCaAkQiEEup/HAVTZmBtlkrNhQwgQ0sFJBpdqVZZY46+p0z 2kZVpioUfZN5hFRst4gjzqXroEOZkSD9ltZ5a5XXqHkF/WbWEC/EsEAMEixH 5wxJPEGCJzMsoMIDSPjJ10jqiEbYjGwVtFgAvhikgUE/ECBCox8IZMRABQHA HplDJcApC0fU20IGR7QwQQv8TtApLrfZBs1+2gWVqqgAhqTaqJQRKDCsRv53 ZSwC/gyB3m9lWbzmoj0CwWOwMcRZAZ2fzPUsczgQdGKfVwkWDKEa7DiuEePS KC4l4RLwwlofCGAEAcEJIBAEKypgzEtNsWDCBCXwm8HTHXQQgdRRVx21CSzA iFk2L01QgKQfwfYZOOHQl9+RDWcmYJGwIAxNdgmwGeyiHBc0d5seHDunJ0k4 17dDMoAw7V588fmdBeCW5UHN4AaAkuOHzaiBETqueZYkPgvg43QsssICCy2Y YEIHUEsdwemop3561BN0MAESewmmXWcEK7zaUH/dYpM1DrutGoEP4s4kM3aX VV4AO9pNCXpzD4FcBRxIwEEnzS7Lwd8O4RCCA6mYRGPN/ojePIQGNocbrgg/ LHZuuomEgmZwQKDydRT+mvA01Kmbrvr+U3egLwvXwoxo9IOR+byjbEGxklCY cpr6KCl4IMnO8nzlPObpqDwiGMJaMIS8tshJAnVyDrOCwCyHzEUGO4iBChLD ksSgpGbjGt+4GDc+nP3ACMjjkeY0Jwqh8SZdmgPABEzAr6hlIGpT25/+lLg6 1k0ggG7L2qvUgaQDBk9VBzzbA2/lCtP0JQGOAVbyLFYQ5gGLR22pwA6UxTdm zUAu2AOBETzgADrGYC0scZyawmUQnAUAcRoQD/mct6YPfMABPtuHAwQiige0 7pH9Y2L++JfEJvrvRFjZSqbA/uaRBVqpilichRfflpUGTqxtlYHRK2LhGBFc QkfIQ0/GMkTLDsYpBDugHp3kosvmgIADHqBjWG7UxxY2LnIFmWHjvhcAHJbL NxbjniimyRvunQhF/GpA1VZXyW5SUnVWawHRQEWLTkmKVgHLymfE1LbbFEyU 9vBMOltRnsb4yk2+Oc8Z84kcOb2FOX+bSxI48AFgcsAIDiAIQQjAOD+Oq4/g shmO9KgBD5DnAwSQZvtOIIlHVNMBOmhBCTpQgiQi8ZuTRKnrXucnuBWAYFyk z+weOJkChWQ+ojrlqGRBAeS1pJXoORc+ybio5+1teiBw1g44wAhGGMEQxCmm 3WY4/sOyUDWZNcTRYpz3G0QYgTcEeIAhMPoIIwCgaZA8aSWXiDq2pnStE4AC BCLYKZggzJRXvFTw4rVFrtHnAWEUwPEytihZ4vMByfFQCES0AwcUNKFGUAEe A6CCGILrcT8oC2a3isyTaBaHF/2AWL9aCGp6AAAA6MARStCAI0SgAa+dpNXc yj/TUa1/HWDCdBIAgbryNJ1e7KJwVaVOzpDzSgVzW3IpgEFYLs+ngy1esIiQ RjnlkqmM8IBTjRADYSUTXMpczONYokzzydA4MFxTWTAKgEeYSbSPAIAOImAC 17bgdK4FpyRrq9+2ug4JfFHABGiitUwxySid/O0pLwUa/q4Nz6/C3Q4tACtU i+2IecL6FXqIU12GIPSQT03oQQxizPGJoLwFyWyh+vg4GOoxs8YJQAp61ogf uvcBK5jAClTbgBbkd78oDTJbO4BJE1yFCZyyAadeyoJNvQKeeX2w7GBEqngi 92HIw2BQC6Jl8zSGlitJjmIIQMc5EiSPk7XbD+yWx3E9rnGQy2rj0hdDNYng AUNwrEcdoYMJNECbsBVykPv7TaoR2ZEQ8NcsMimYTvkFr/A0TV/DREWZPqMx W7anljO75Xwij3yY0GB3CdLHqPoRom3uI+PIN9UZGjOQNJrlA85iptPqQHT3 vW8EdP3j/OnvtoMW8hA70Km5/rpUdrPwbTIefOVWOIjKk7pJNWZSG4NRQLCx zHbFyoOx5Y0Yj8fLI2WVB1HhsPlHD0VxMskL0XAZczE9IwCZpZMPJJRgXxHY Mf9gG2hv0jbY/NUtBNzVCiF5qS+2KEYxZmKLynROMmD6HT1qERqorEPhYzrG MXJx4WyXxYwVo5tBBPDQcReE1HZDebnFPVVyi3vVEu3j+DJmyGo+Qgeu87E2 U6fr2toW4CrNXwtUtCK+SFvaCs/FMWwyDJuU4+lcaRE3pA0YqDO9JkAhhzRi icEyHs+7PSO3ucVO9pYrj93CKTmrU73q7xrnXAQQrQc+MAGm1evPrQU4En/O zUJT/tLQr7tIKoaxcaYvI+m7ixV+nO6NmUij6kshSk2lEhmeCPV4gAUW85iX R3F7ns1jX/m6Qf/QmH+nmKXXI5kpkYIhiNUDDTBBjkMH2573nb9A1jsUjJCC SAb+yav8bTZ08Q6Mt20bs+pG1XeyDAbGihZEgK5hzQh65XnX5WIvOZxZ/l11 u7jEkbOqjF3fCNXW976u7TXff/3v3IMzBUYggQxc8GsTqIRoBYuYVWBD02Vf Bhw2IRqpkQ0O4gyP5xED8FPR13VlVG4id3Lm9nkQJX7llm7mVnKdl3bgtUyH oV49wgT0dTr6pjoZwE1uBWx9t00qhQQcQAISQAMSsGsR/nAEsEVsKaJKgMIk RaJw59B8mbF8B6cOUWE7ymBTWPcC0WdBZpQh0HU30hV6ZfctfCRnGAhe32Mz a8Zi4rUYOzMEJcVaJvBnP+Za7ddWb1WGqGMCRrAAmnABQvAB95JvVjMde+Ei OIU7n0QO3LAZVCIOw3AgVbYZucA7QAFGXEZuxyN2TMh9Z1d9TPhQmqU8BUAE UZAALwdna7dqivMCjfGFprMCp2N7Q5Z7o0hJUAACLvgsJDACJbACR4RfUcMC AjBON4CD08aD4RB5UiGA20CEhKh4E8cgN3EMt7Bx0hB9ZSdyiZiMwEJ2yuR2 kBI7rRAFjfMjbHdMOJNHZYEE/rh1Ov1mhoNWhu2XN6mIijSwAPUVASUoNUfg PyoROxwRGb0YFWAyEsJ4DLPCO7nzdELICrWIdUvxhzcRAAt4iMxIbqYGZwep kMgQBVGABFFQANXiYqgWY35ESDEABVeDRCXod0H3d27VADuAAihAAiWJAhfA Aw7gih3gikkEW7qlAHpRAMRIebUwJgMgK4IBeTlJC49HIAJZU4nHFeWwAczI hNh3kCVXQ2K3ClHABFEAJQXwkBNAWT+SlONyYmtWFhbwAu3YAlKjayX4Yyjo TeoHdFAgASQQAqmIAqg4AilQL3u3AvflOi/gLhSBDDzoeF4yEnsYgBvwdFO3 Do/X/iKkAXE4KRI82Eo+1YzkhpQLqZB2M4sR+ZCVqSkQ4JATIDRWGQNAkGrf tTiZRQRh2Fq/Bo63J460tURH4AALsJZtSQIXIJs451oZ4JLr2AEPIJNXsXAY EZgzsXRAWHjAKRka0ZOFtxTFOYhIlxH0UIvWcANkB5ltcpAscZViJz8RCSUQ aZndGQWJJgLYWXZqwhgPwAL+o00ciYYAV1J7501MwAE4wIYkaZLziQNCEAJH YAL5dkSv+GeHpgp7sXTJYAwDAHU0GQ1JdwMKNwAM2qBIF5gOOow1oXCFiXjl UBCN4ZgOSHYqh53W+COp0Cng6ZBRAACVOAEOCZEqihcK/jV2LLFVItBbraMv /jNbqElo3/QBKWBobPUBIEADqHiSOCADsrkAS7AD9IU/29SOJnBnRUd1B+pw yRkZBKoRjqcRz5mg8hAZDMegDHc0YMqgdrOMLkd9JpceykNqKiAACuAulQmR mZmZUOKQmVmiKGIQ4zlyRNBbTbYvroOjawV04KgDIZAC/slWaSkBI0BQKZAC DiB/sil/NfABtumS+eaNUTOLMumliEeME0qgLWKgX5qgQRIZQsKgDEoPgVmc 0ZmTB5oR0iCdx0N9v2FGpLanKTeZU9mrJYqilumQUIkELQoAAjCLTWBMHlN3 R7AvRQSWt2Vb0rpE7Hk6KZAE/g5QAh25TVDAAQswA0baCc+SBC7AATzggiOw BL3nn+ooNdvaAe9odFJinK5QpaUanNKGr8eZDLxTHcbpDSwCGFvXmFCYpgab cjdwEZmZACtqot/ZsBDpLigiAERwrArwI9ZYEPmSAQBaliYYSWqFe0mkAw4w AkZgmyblAkYwpCYZriQgfwvgAOZapCMABf3ZkvijqVAwHXnpJb7JcDh5DOqw nAQKphPKDQI5DxBXeGMCnBuwoRy6kKTmJ3BqmZqCpyjKsJlZAABgEajgphYr nSyBcuSRAFGTXyFrSYMqsqnzAQtAAwTAnx0ZAVCwADgwqShJAkUqA3wrA0uA AlCg/rckwAMuUF9WA4ruOjWYFGCCcQ0HCHE0MXXOqXAZERrFdw2Ux69LcQOz 6goaGpnZOY1Q0indmZkqClgOi1rsMR0Jm7B94idqajeLcRgzOjo7p54q+LG5 yz8rkAI74IYf4J5IAAUOAALnugBG+poXkJI80Lc4wANC4AFGIAQjgAOic0Q7 hj/3pU0nQjT1UHhsQ5jO5jJ6GYzBiDY+MXGO53Az4ZfHgIxkN2LkRpkkeqcO Sz8oShGzOAEXMYvH+gP/CwA3ALYU4ZnlJjNrwo1/1o2Cxj8pwAGBQwIL8MBM NQMv+7IlyQMLwLyDW6Q8wLzQ+wEXUAM4gHOlY0T4NTUT/vACUaIifVGEGFcP AHuTVtecCsq+98gN+Kh8s5GAn0uwYncuJDqVd5qZD9udSHAeD4AXpwC2fmKx xyoAA6ymn0dD5GG43fiN4DRk02OkF4yKEtyyC8ADz3sBS/DBq/i8PLDGaiwE O5ACI4AC2uqKLIm43rhrLwABg9eDfukeYcoi9Riw8WF1ucCPMox4m3sO+Aq1 DfiAqRCRV8uir0M/JfqdqHUeAhAFAPy6/ivFUBwA7GHAn0l6mBUDSDA6uWk1 qVk1GeAAM1YDr4mS86m3Y8y3aywDa3wBd9u8bIzLI2DL55oCIcADGeACSzo1 r6hzueXCLUOM9tqThCwNewmm/oV5A0+xuTnpHv1qoU83DFxGfR/HF5XJsMEK lZr5sA8AABkBACKKF31iEQPsyX0Sz+jhmYxoTC1ULlAwUia1u1JjAjpgBI0a uBJQki87m3w7uLi8t7zMAyNAAzTQvL5sy7hcqUbAA7eGs7f5irAocACwIquA dH88yDhZGbU4oX9MD9nck2G6wyfdgzwRRnbzAn5CxE95tVA5yZaZmR8tAF3r 0+2BHpl8HgWAycbgvwNcHbFbkcdUHodhHAkMgtukyhEgA0kwAiSQAiXJlk6A AkXK0DJQvbc8AtU7AmQc1guNy0bKt0uAUDWgA0/TAq64jmulWwAmoH88q5GB DoQM/qt/+XiF94cLtwGTGwu12HgAeAzK8wJ7sZ1RaaIT8NEmCp4qiqKpUBGs yx4FoSmY7KYDEMXxnABCrQAGrKYoRkN6ZDlxN2RSkywkkAQpsARJIKmSigO/ 3Lc8QAMPDdG6TdbPq9a8TAO4LAQo4AA1kAL2k739o2/apMeqwBHGaHytIM3x OHFCa6EzQRSAmXDxABVPYQ1U0lMB0FtTCSUqWqfEGgXnEqwnahGfLQDv/d4Z 8RhVOR3wbbGfnRGe/Nka8JnPyEd5tGY3Qiw74wH4gn4m5a0jUFAjMAM44ODP 26gcYNYLndthHdEQ3bdLUAHalcYyIAS5LQE1EALXq739/tPcKCKgfEGMAJug zNCTPEkL1z25zMmqMcGcRTGIjksB0vA5Djm65Q2xxrrEmzlwq/vE7yLF7AEB ZbSZ8QxY8h3FYHsDopyUy9Q4W1UxMVCbMwiLRoACMqADEiADOHABDi4EIIAE vnvbEk3GONDbZr3GaM6jLHjLfGvbGG3MJQiK/8m9PNsi8ZjSCcqT0kx5NyEl APh88eGqAGs0AtspXvPYKgqV5uyQAeAumwnU932sn53U911GmnzfCSsAACzF D3ADryud1XeJNRRDMbQmHvAAquVaI/gBPAACHyAB57q8PBACOgB/OsADZ6y3 bIwDeC4DKTnCHKADzfEBDADi/h+swcTdAah8wq9FZP4buVk60i5uE9YMzRSw qt1cFRugcTTZtJtrGQqKj+fdoiw62fl7rEv8xP4bJJ686fp9HnjxA+p8rBTh tal+rFXOgTiTeoZiLhpEABOQb62TRCV7ARctAcZ+6zrwAeNqALqe7GzcvB6M yyCQAp1wASCgAxegBCVP5g4NBfzJkvmGfrrJOa3QUr7JOz9J44Bsj/aIk3rt l4BhtP560oSXC/5CP0h8okjgLqpL1Ez8xO/976fw3g/wI5kMAU3g7/Fc6p5M EdI5yhcIjRVpMb/BAUzgOl1+Oh5AA2BupCggBPM322DsAAYgBIPLAzNwy7yM yyTA/uzPUvccYACwvMZk3Nb0R4Y71gKwVQITYd+E56Arbe7E6Kqw6rQYetJK p+OMb6AbsaDY3LDBytNeyx7ogaKX/uT3/bp98u9CzR5Yb+r3Ldqefp16Cnrc F6PkEXeh0KP5EoIRAAJjLsFlvgQ8ygNIZZIPfK6r2LxLsLyDWwOOJfzREi2n uOvytwQ40KOkw47qGAFI0AN74t5Np3SATqH4qBHDGKqBieoKd9LAeQMaR/6V f9IMWh3u7pBI37WnsLrnIfqgX/r3rb+fDViAACQQJSAwIHDzYFio0FR4UwgU AKQiGRMweRkQo7GJGUAQMCTgQABh8qDT0RIRASLBQ4Iz/sPDowOyACIjgYKT BCVLQzIiU2sspCMDQnOBy2Oks3RBQiNDIgRSktGx0tLB3fFgNBTw8ABhCDFw UzCgMLA+kMDOniAf/77eXj+wcWN/g12+d+8A3nAH7x9CBTeiIIkSBcADiQPM CUBXoFCAAoQYCfhRqGLIABcFYBLA4mNJSAIUIEKkSF0MSZ8waepkU5SnD0M+ fECiAkQNGRx0RNBBQ4KMYrV81ghBAwUvHBeQSKi2lAcNYjKEOHBQo8IuqThA QJFxgQeOpSNqfOiQwUSEFd8iGPF5gqSAjBDYIWqnAPC9gwftFaRXAKC9AgoV 35vnrgBBhDcmJwAAoICidooO/mUsSTKz3kUtPT4yNOlBFL2HSB9yyXKAigCz PQXodAnnp0vkyE34MELChQtLOGSAMgJErGIjSkhIAgIEiegoLhjwMKJWMRIy 1vIoAQJ69BkgZuA4AmLE2mBLkmRYkWFbh6Mchjj4EMMBSb4CB6gbGFkCCWxA 2QCJrQPZPIkpdBhhjD04GUOMIaTZXoo8UNGFhxyy32oAiORaSehU1IQKA3SE TmkDgEQaSxpIAoQkut3mSW6YDDEEAR+s0AMKtMwwghA+ybBALTQIkcQHuZCw AAq4zCDDXTXgwMMI1FgpBAcf0ACCj7yAQGUKHNBQJA7VZMdECd+s6YARBJzw wAkf/sxWyF6GRIgQZZLd845CGzzop57/CPhPoZTNQ+g8mdnJ1yLoKKIASRGR 9EAiLmVExCKQKJLaai8dAtJrJjEiG02acKLJJ7gF4AE5DjARAg9pHfPVLOrV 8oAuOFR3gQS5dKeDEEVqRQMOQX5QQVkXNBmdBDh84MESWeFApZBxRZABfQ48 4ICcAuSlggAxQbJQZAXZA9Bh8gy6AUDqIPYOgQLyOQAF6t5AwSHouDTiAy4d ksioBWT0byH7GpJpRgmYJOmlAiQs7mkuGXJJqjNqsKpOl2wLhRAXCKEEDkrw gM0OPGTFAwop8LDDWiAMtwMHygSbVlo01IJDCsqUpYxU/ijkkoIQKJysFg41 eADXUQ5oacB9HpzQ7ZsnpbPQg/b4g+iBiAHE2NUDJkDBgJIx1m7ZCpYd9p/6 btiZwYZkJEgBAOjV1yKgmjaAJHJvmghL85T2EgQzwagqTjbeCEoAJcTAAbfA jaBEMczIioMQO3xQw8sv8/BBth/wAMUSxoRcuQcefKcDdpqvtUMKNQyt1gVD czCXDjVcw0MKKZyQwgfiyHkCnZAuNGBBB87TbmRYD4hQvlfLU3ZiBBbULjvy 4kuEvi0NkClsHgXwQ0cLi+rSO3a7RBtH5SRSkfcAby+ABTTVhJNuMWjiASgm 7FDB0HfNaoybLaAGDsBOCJwk/gQPROAIK2ACDnSgFpxdoBgeWBpcWvABHEjg Zc14gDSEMIIysewIJnAWVXgAAh2kwAhx+kpeBKCCcP0AAKWx2gYIgi7oSeZ5 80rb1xT0NXckymxnW9iIHtWaiqiDYYMoQABWtL1KhcRfJRnAix4wgSeeI3Dk g8kAZrIbGnECfDdhFatikIEYdKcWKnBAyJRAg60kpwYpiAEPQtCDrUChARHA wVdSMIJZQakpKUBCB1KwA7vsKjoXsB0KhCCDGVSjBrTbQbFw5hZEPqBxJzAC 1AQQgxeiIwEKIEjX6lWZfAVmUKtM24IK8Ccflg1fxavXBjZAAVhCYmH/omJG IKEA/k5BQG7lOERM7PSDDQlgYZhQHxUXBgkWAXN7YEwVjTyBsSHgpDcmCIEM 4KgEIe1ABj0YwVZkcKQPGIFlKEiKKiJwAQ7cxxhVSssSHKCDEkTAATgogQPu iAIZhKBjQrlAHLeiuymZMytFUcEHugXRE8TgWzEIV0ggkDUKhA1dAvqTQHKJ ro8+6E9iSwAsxbbRr4WNIPBDDRX3cpKBaXGZkJhmad7xgyaU45eL4NeKMJQp fVWAfjnpRP3yZ4TENUACztqKEByanZHVoi2ITMoyVLDACHwgBS74nHlkNRxK ZsAFESgBCVS4BEbex2OyItoIIiCDClBDGDKYEhI8+VAW/kJtr7QpSaWIpw8K NCZ6X2NHvg77tT/Fi3nzoACBorcBi2QEQxNTJocGAYEAAMB8JcmIvljygEk4 s251+1emAjAiMGLCqLfJ2G1E4IkhICEGNOiBmbbSTVnsqq0eWKcEevAMuczn kJijEi1mZQThZsAoBJDBDor0UBTyIHJUQcE/lTOCJDkghDpoY7f22i0B4FUv /LpBXxA1qBtUT3rNS6zX3KFYwXYUekG0lzsc5baDZTYACojCAMgLv/JxkWGL YklsSoIIkCwMRta0EcZE0YneBAAKQxBCD3rw1J9gLqCySMvlsGEmEGyDLkeJ FdFqIZQd6MAE8MmWERbJg694/kw9aKnF0IiRgn9yIDvdhRYDPtBJ4IHyW6H9 0DIpFJjpHcixJv2Tk7tWvcM6j2wD4scNYYmh0NrtU6SJ29w8gzdDSBF9QFAN SQRcvmmSCwLym4RtHkyjB/MmANuCQA0WMDKd7QAJEZTVDDKXAiU4qRgpiMA3 dPAB7sgqchcYmQyQoKb5uCIXL+suVWgQsqKlhQRiigV3HugABkQ0TqEktQBo WD7itaujhWWMLAUUUgjZcpWJGVD07HXMgyH4X3pBkUcOwctCeJZh6msRaSaW 6kpcQkZhtI0myOEBCCChBhIwZ7VHAIUFEIMrPKgBFJaxgx4oAQQm4KOSRgbH 6S7F/mg+MUoGdAEmJZjjzkrogQzMSS2t6CAJKGQSClcAgoc+DaKkOMEQ8qKI O92pMAchUGHmZRhAtffKkK2yR9P2jl9+piLkEjYTC1C3jpuPXJkqTQCaYGbT 6Lqmi3gREOrX2jhjkxyiGAITDiorIbiFA2ohQexQqIPhMHIGH9ABlIZ2AVrs yudA1xIHyCOBGRBgZbpgizWotIQPJMEa3EkLPnfwgB0AIKLdGsUJxFVZyPSp a/2RV/LmpQBVlkuwJ41eoS4OuPtmGcHo2E+d+t7TQoRqP6nxbKheYpL/foSK L2ItzG9zKpuEwgFIIEBy0q2EEMB1WDygxQhaZwAjyLNp/kwiwQxM7yTqkGD1 HzCAeEBQlETnm0rd4VJ2bccdGYiOBytwANif4EmIAuAEBIBhwrfYH/fOnR7y rccsDYNKKMP34v8YEcQIht8bNGzLlUXwRQ5xiUXViUUkYcnhv+jmZqfKRs+O wQOYMIJyKmGAOzgCkXBWjGJIhwMckA4IXCABJOAAXKUDLlCABvgBOWAAIOAA BvABReAASbB6VJJ73pECIJBjSTANs8IBSBBqnsQtxNdJ39ItmvUInmUZCDI9 8iA2GVc2C4FL1qMAhUU9QbQBgNMof7cIJ0EIT6Qio8JyrSEAknAi/HVsMDEa /GIJzCZz7KcTHiACHyACHSAB/vWmFUJQAcHic1RyAWuBTktxAUbgAg6weiXg AgZwhi5whkVQBAegAweQA08wHavHQVBCewuwBM+iAw5AC9NVC5mkJSz0BHFy dnsFShKBYGq3Dv+QPO8gWAiBKCoIX9C3WNYTEOhlL2I2MWLGPSKiU4HxGd6z RGI2KswkKeUHKYgXhC7BYNdUMatVE7wBWwQABVBQA2nxTRwASAGFMyezFEJg BBE4QJyThi5QBAbAhhiAAUWAATDAfxBoeqd3XJpWCy1wOvQ0XQugAxzgAQwA NcHnfp8UPHWCCP9FEOyighxVKLA0g+tYGTfEZP4gWIGhADdUPcGWDoBzGoo3 CKPy/llhVjB6AwABUxkwETAucXi6YQnXtCpjJGEfQAAOMAEqcDLhRAAVQAwn QyXeQYHTsHokoIZFoAMiyYzJaAAGsAJPFx0GwAELkHRUwgMuSQsycAtqIQSY RjK60zgVJIKE+CYfAEMR41PvoA7oZRCQcT2KUSiy5IjtWFiLKFgYshLawzYf pxIJt48gMTHzwIM+SI6twRI1BASqdRtMuH6bcAkfEABz8gBIAElb8QFX0R3F wJH3dnWysAQ6MJLGyIYluYwYsAIz4COnJx3DkTJtpXshwAQ8UAGxkx31dx/q 9GPAA2TidXbhknDTZJT0QCjrMhnvWCjI81+1FJoBEXf0/nhgCGYpBpM3HjcS MEGOpxEJmuUpRNA3igASnNJxMxF5NcJatkFnrGIfRjABbqQEI/AAmWNOkbNu amEN2jYMnGaMyDiSf8mMBgADKCRJmIYCPjcNsVM5IaADyVELaSEEKbCNH/Bj egVkodQtQFYOdZIpl3gQOBQQ8EWf8+CO+olehcIQ/lkZAVF9aEeKn0EaPFga KaIpfZFELUGEnqISeYeKpfEimDA/M1IjnuAAUWiZOnAEOyAEtlADN6MrXDgN ZiILq7cEYsiXx8iMPsCMB/B05vEjbTUrNVMDO2CLICAEMPl/WsIAnnQCQVZ8 ZzdR4ygAIoAIdTMPn5koChEQ/jfUn+jFEO5Qmv7pDqXUcSJxNxmRmwITEi+x mnUiYCZRZhAqlYaglaUBCQVAlg72is42BDEQhTmSCquwAyrgOsohaH4WQQe1 FFyHhsiIjMtYkgYgXZJELCAAR9VwMheQox/Qo/S0h6HmUFDTLXESfJ+EmYJH UwtRGYron/pJNgzRpFb6nwRxQ0IUoP+gGTMUbEZmJ/91iuSYIuRyeHdCCQCw Gp9xZmH6EskESktYE9cUWzoRCgKglm8xAStmAm6UFrBjUNnRHWtBgdHpAC1a kghgAAswA+SRbkEAXFtxUDdjOZKqHChUdI0jT8DjSZ5kmYSoWXpxEE/EEE6a n+oV/qr7SqWVwao31KoBeq8/WBEioaDoMwjlMCIqknAclyKYYCAkEVSBt4ni 8kWt6GxvtgmdoCOhYARQ0AE6MAFHYBdqQaNoYVDVEB1sRS0+Nx05sAJveIxP 5yM3QwNBkBQqgIvo1IXstk48mkIOoAIP8ATgNaRwsqnFF0p1ohfoxXZ90ie0 JI80iCirmqqn2o5O6ReNcjAr4ln7wVPowCLoMKZ+IQm8ior84hog4ReYUBuT 8HiGgwn5s5bbMgETwATNWrLG0h1Q8jJHk0Gd54c9J5jlER3RmHQBFE4okDq3 gnReIakd9AEcIGrdaAQMEIJA5i2GeHZ1IqD1ea/rsEr1/riZpYk1dzel6lWP 9DkxWdamfgUamjVZLDFsmzhZLbEfczNsogI4m+JmhJMTrihGGkAAOKICQ9AA IiuydlGt6zYsKcRzkpRpbYUDS2B6H4kDTDd/PXtHWvcBS3B6sSBOnKNCofae Q/omRru5xRcuAJYAAVCaxYMvhaK6Uhqld3eOyDO/o+qfpmUnZDtsJtEEw6QS 2LdERLmkHHKmJMEiBeM9f/UAFRq8MbdaEaYBlyACofUAHZAmJcAKltedH9md KGAAIWAAJqMWSgBAJ0MM1AKTvUhPBcQ5fqoEBKRCUPBQP9aNBIC5Qwpk4fUm 4SVRGvES00O/m0lK9uKv8Ji1/k0KsKXUpKCpxPV4u15KGof3A0/kKW3DErca isS2WWCGkK2BZgIgwY/HKrrBWh7wAqySJhNgAhOQLaEjHbxCAhdwOQTkVdPQ h5KzFS8cRyRznHIEBbJClykzAktAAKkTeiF4ud8CPE8DPCcgAsDTV54qsKyq n6Z6idVTj/8pxfy7lJVxr1AcYANAQxjBiXqxcVs0bAtDsJiwKAm3sCvBZZ0w P81GRmbkARGGI0zQASWwAibACsGyAMVimDFJHDIgY7lXrSdWJctpUGhxUCu0 BN15M7JAMoh2Hwwgat4INXECZOJscGdnBN8SlPGJtQJauqs7gzeUtey4mQCL L6WE/qr+cIMWe2rKNDHocLaNQsa2HNAP8KAk4R8DLGYdpyJkyYS6QXM4MQ5r GcxwzA1HcATq4ZJgdZj5h0jBoRUt/IXUYjMjsFC6p4u6ZQ3Fwhwe2IAuZL7e eL5DGtNB3LmngbVRTLqfzBj3Wp/76p8AS0qczBD20qSfkYoH41mVosU+SEVJ lIoZkRGUksphuon6tRdvWqxm1JB06wBDMLLErA3bYARoYR7DMRxmcm8X8AJX QS3Foh5UEsg3k39dYRbSsQB3DFYfA70PBTUwTXw9LCce0ELAEyfGNyoDK7CZ DL9NGrpQLMqZbJoC6w8Dy6BSWbCBZxKz3BpcSxqkOAkC/jABQMC7G7KJDHHV uRy8M5IqreJ+DZABwnwE8XEU1yzSZn0y1SAEIZAC1YbWVfKFcbRu5qqjIHDN giS4lmMCM+CAQdpJ4NxCRjB8ezXO0B1DTFvEeJK/AdqkT+SvAYA8Wvu+9nWv TwwZdXK7pHigqJyawHoRAcMhsmsngdcZLGInGBqL6nesSNACSNAA5bZc8xEC C1AMSaceKnxQIxACQ3AV5WqXfnwzz5ACvZC9sTCTG4loWiLdcAI83eLX57up NV0aN6ilP9AXpYylWcvT9MvTK57JqboZjHK7wQRTA0xDk1WwILFEN75ZeuMp ZeofLGE+GKJaF4rfG3tGwMwE/q7dAi2QAST7OQtAFc1rLLc1AiigTtWwFsOC TulRCzrQXHiIAmnli8bgAWIizhy+qVGzV4RomXACSpzyCFp6jqXEyUS94sTj r+0IAUAtsIw9g5xtsZb93gbiNhMjqwrqWRY1bPxBy+NXCBX6thPcm2mcAi3A BMQsF3ExxyTAYQEVUNP8hd0hAUujgSdKLSGgJXHppxpNJcOiQhyw3N2YqUMa J7Ueziqg4UAZPFpmm8lkrzydpf/A01irpfaa2AShpTgdoEsE1SmiynC+KGC2 d1s5RUMouyZI3xwn0GacfrmM2q84pxAAx5je5CtAshEwaDjgrYFEJLVlUCcq C6n+/lAfMIa4cMd92GjluWleoQM78M3vCgDeHNN7JdNB9i0fAAQA4Ajkdez3 usmlKecA2qSMLbAmzlLHxJoFCsYyXuicqInvLTeugQ4KOk0yAbwZC5wNyd9I YAImEB8tENueEwsuSWMy8OlEQi3dwR0fKR10eMfe2XlVXgszAKm2sDRAhvQn wAC4/l18jakn4AHD1ybfEi5qiQgBARKTbaUTr92RDbUqTp+JreIMgVoiMTDV PvKKx6uMkKbnraCcEgBR8MVhel8hIsFvO+mRN6dMYOktoCYMFPPz0Qvc0QsT tAwiHQtoDYbZOxxWspHGYA022m1bRbk5fLmexMN/jb62/h5kLRSURIxaXk/K oo+qD//wK06lFl+Qo5hlwyNmzbRZpOgSUrlxyXRZolHjAmZ9CXoDM6ECN/Dt wdtgR2DpSm7R2CLbOqBB1OKSzICyt12tXohOZ3JJaZFvxjArKfRQTSNqze3D Uv8APbz0PyxkS0sS/KV9y96qyT76qWql++rwx97+UWxMCvAhriwuD3tqu6vP VLSJkAIIQAEFADcFAgIDAocDP4g3AjeKMYIBATGWmJabmBoBHjEiLSwlLToR JiYRGRlHEUdJCzg4PEoLNDI0PDK8MhxCMjw4NMQ8FyMjwcGzwhczPDwfLhwM DiceJx8nDg8P1yfg2NbeJw9G/icC5SqIAew3Cu838fAQ8goDAQnvA/AKCvrz 7M3rN1DfAwWJHiRaCEERBAHtChRop/DhQkWJGi5sB+CQAIQKESJ6iPDhAE2b Ul5SqSkGkQkmmLQocSSDiQwdcmaIoGMECRkoeIG4QPTCLhkpHEiQ8TPYjh3J cBgVBm2qkB06ODioxiBbV3BPrgHo+oFsNrHbvLWLAfEdQX/xBMKTp8/f3IBv 59Wtay8RgIQCSCJyKAjA3wEKFYEEjAihgsITBSRGdOghpEiHKFVCyXllJg1E IjAxMbPFkZodcLLqkEIGjgVNpfIAAY0WCAdJP0D5oOMnjiULjAnnMUMIDx3W PhhJ/g6O+YOuHjxAD/cV27kYfy1Fyicv0lyC7+p+F8/3O97zIQFoRLQoMPtB HhcO/jgfkiJLHdsLVnQZ40NPl1SiUkqYFAjBBEzAdARprOzUSgQ5hUDCUiDQ sMAMucxiFA4kLCABCCSQQEOIsM1Ai4nQjEBDNzt8IJ1X0jHXlTUAlHMCA2Wd pQ0AMaDTTjvxBBAXQjfUQ6SQA9zwQ5L+JDkPP+ENKdc77WH0wCEeIYaPAIYN IllCCGn5gpYKCVJAFO08Ihli9DmiGBACrlSgZyhdUkAELJx2RAs3NbiKKxGU 4BoNOABFKC5K0EIDCheQwOGjytASTC0jCKECctw4YEQ1/pue1dyN23AFDgHe WEMAOAI40ERbQkbyA5VxyUPXDUIqwJ0AGwRwT16ymgdPrYgoxMiXbCJmiUQj KULEYCGxt1EAhrmn5ZcWGTuJJXEOyMklMRzIAp+t1LRaB6640gEBMshC6Cwo 4BAULxrKkIwuMkw1lWtCGIHEBw6UVU2O2OBYzVnPNccAOQGno40A66QpJBG0 TulIQAD1w10/eWF8HiMKdQPYYkBwWRmxFpnknmMhI4uII5NBIpJIGlSiwrYt eebBJd+yQG64OOWU0yo4RcDBCBfAS1Sh6SpT1NHCoFCVUUKEoMMHHHxggAPj eLVVj1w98IQ3BqTqlY4PrMPW/o9u7QMXsBRwN5CUr2b863kKPPAQx8UCwOax AASgSAIiNSKfyRBBGxl7gpmMUGYBhKzSEJ7JeYkGExxRAs+opbZKB6tAaEII 7gLFS9G9yDYVM7RAA40QKECRghEf8MuAdByU2tXA5CT3Yo4flAoOWydo9+pH StZKt/HEw6W8W7YO9BY8zj5QrMcmcTSyInZ//Ij0EAERRd+HENkeJI5EIj0m M2+b0s0atKQAnyyEK+5O5XLuCk4mDHUBChiSHoxRG5KU6nhBAyFIYGpVy4Y2 rHG7tJTjCdowCwPS4Q1taKOCPioc8XS1K+fNw0jMmweufsUPgnhHV7qiEpa+ NJmP/vRtEH1jk2X+IpIVKsQSUXhAmr7UGPfcQFgCoAS26qSJ9gVAA5Dr1gRy lgHTHCE1T1RN0ADlAhKYyCgyAEEWdUGbBWBRXsnghTF0AAVqbMUBEByYpmzE ARtZ8GBj692MztKOhrnqB/pI4Q/g4p0gBQQS5RlE8xyTsXdIL3vtGVllQhaF AnRsIdxj08vwgZ+RmWRZ9PmIYgTgCUF0xjMAKtC3kMAKPdXkialxENB+xgSp KMEoNKgQCF5DHNfMQhk8EMIFdKADFfRrOdsIZo5md7utbAqDcjzBOWTHMHQ0 LAATw5iQamUx5XHHERvwFa34Qs0UwqVaiCzZs/JDkmY1/qs9XwpAEwgBpEyG SQDla48g0kcglnymBRMohWlwgsrU2I8VENoZTyRgjC3WazZUcY0xiMKDqpGR Gry7UacyRZYFuvEEBgjmGcHhDeD96IRSap6SJLHNeHgHHo4wXq2oGTF/AEsB jszIJrEHkUX8xT3tUYh8EJKA+xiOMeWzyDmJUIlsZeKonsDEEVhgAxOckp+r HBfncrKCPoUABUHR4iwZSguGLoEH/eJN7JKzFYKdhQGbKuvtLMjAjboIHBnc REuVNDe3fMQSkJgr9PDyFpZK0yMPESr2RGK9AByShwmQzHroU0nD/nBaEBGc ABJrCXqmj56WAJAHLBCAQDlR/lxRVA3nRJsapz6xBBzgkARe0z8AGoV/KfhA EnTgAhAYwABlgaCMOuWN3p5FrdwAxwXLYY0e1RSvLk2bP/rIwRtAzBFEggvE pkurQa50kAepEvcmcwgc6tQ9JrNMYCRRCByOTCTLSmyy3CNEzEquQJ6oAARa wLNW2Hc1qumcg1hhghJwzgMkQIGjvGiioTwDBLFNggFc4ADclgVr4MCdMjtV TFBVo0ZdG1s6jtuOQQ5kpSOd5jtA2LxXofAdfv2BN1uFpYoEBjGLq2kBZtpD kyRGIZQNAATA18PxZhK6AjCqJobgCcjJCQId+FYT7bszf+YXlXpisgt0EIsO zWB//jwIzgdSkAMO5ICXCkZjBPnlxq6UygHYWKBvoYNhB1ojiIVDMV2piTG7 KJeDAchmchUQt1ftcR7UdHGxiOUx63HpIQ+4wV9+eLJI3HURh8juADDZ6PZ4 Zp7q41YmLIDkPJ3mvp2b6uZG++mbuCIFHijBB0B0IVpIwwE5MAAHFvwEgWGU gbub4I3UetYbUaNTGuVo8OKaQm+O1Lrv2KMeAY1iW6HQ2cWLR9zIpMnsgcRY V2oWou/maIfIMwA5TJNFFGAZc1IyiNq6GeTaJ4IhEIEmJSgBElwwbxe0YAcc MIIHYqeDEuj3cq0wAedSoOAcuMBqsWNwrGM9gyJMwwAM/sDRVqQDtlC1lbgH g3AFvfGi3qqALWf7UQqJgGeNubRWe+TzD1JuPIt5U9m2craLI50QGdaUBR3D HiRcnDh4BjGH7txeSeijQ0EAoWYEIDkRCgCBB0ChA1AogQumTvUDTHkFI5jB DPjHFBKAIN8u6IAJVuDfqVN54RwowsJ9kAO2t90Ft5U1xL+mI4pH/DkA4GXe dcAAvkc0Gw9gDjqCF+eYyznmuiI5XX+Q6JizStnPFtLKIbbSDbzKxoF1DxAh kDJzSmZkgFFEd8GtQwC8jIfJynY3DtINEbQ7BrAHXQigMGW4T7kIGCiCAXCv g9lofQYLwCoJGiWDsLui9lU0/kDb2658tjs/1itYwZQPkAIDpKDvvGTABHC0 nBUggZc6OAD4dQADvusAt2g1ywNioBaIIGTkMbdYs/G68vdb/leSt4Tl/2wJ ZyPehWSySZkXACLQSCLzAFGwYzkUBUgAAYQAATuGaFGQAGfCgCzAgAyoY3UU AB9XAT1QAVJxAbIgAQIGGyRAdUVQBDqQgrmHAQhQBAdgADwQBPXyDFeGZRww dse3YL3RfGuXA08QaxzwBNIXfVXFExzgAQ7AASDQhE3IAwwwdSyoewiQewZw AOIHA+V3MFwoXDU1BPCEeCi2YsfmeHmmYraScnCxcii0YiilK3ozcznHcwyI BHao/gPfpwNMMH582Id+2AJNmEVFwygy0APtcgFLsQBe1CgkMAIOIIUriHu4 14JX+AG+xwM0MANKwD88UAMOcDmcIw1TtnwG8HymmAMrUARjtwIdsAIZ4Axa BwIzIIsgsAQOsAILpoJF8IIY4IKT2IsHgAHZtzUKswnQ9WwopmLQBE/5h3iI R3+K52copGJKwoaVQVNXAgA/YHpR0AIPkIe8BAPTB4MrGIwugAEucABFAAMq iIWSCIPryAA8sAOzqASz6BpE4RrtwgNOwz8j4gIwsHu6N4WSaIXEMYMXoAQB ljofECgRIH0OBwMksHxAuHzPt44GAANHEH0RIDRPyFoh/kICuXiFBcmCLViQ wMhLzQFnOrRy82eG1jU3ykgrkjcxKjaTfqZyzMhCovdiVzIBd1h78OiLuYcA vLiLLRiMU3gAVch7SxAEIGCPUbkAWnQ0RWEiAhYiKZCKLjCUJZl7ByCPQQBL MyABsCEvYcc5B9eVtdV8pUiKbheDDncAGcCKEWAAWcQDHdKEwzd1uTiQVfiC gomUKJmRfJcqNbUsJJcP/RdtaTiN0YiG9PcwKLdyKeV/ZNINbEIEEFACeEhb 5QiWu1iFWIgA6tiUSmmULniUGAADDjCLs0gcrsQoS/NaJjICHCB9uyeQLViU uHcAHIBQY2kLWMWPR+ACD9kB/kWQAi6wAhaZA8/pAxzgA+y4gjpghBDiIY4y fEyxAMe5YLt3kgjgA0bZlEXZm8KoA0GgAw/wAWdDco5nmc6YEsUDXbSijNCW Em/obNu4JotgN3YzAXg4degIli7om4KJAe5onrvYoAeKhV4Hm7E0G+liL8/g NBfwVVPjcAuWe1/pA61Jj6pjIldGAg2lSlLncOf3g8/XdhyaggfAiivQkRww A1Z2ASDCASvYlV5JnkZZkrzImgdAjypgBADQDYppCSvnc/SpbIupjHIFpTip EspIdNQiACbwfbUXmg1anoSpjqUJpL74gjAgj7IIm0qgP0VhDLigl8FhBFMn DVN4/pIneQAgEAQzqATBMEu0YAQ80YrKyZzpmAQ+IJ3P95bnqIvhh52W6EUc AiJJEAG6p44GUJS8SJ4+eqAoCYMGgKOxWDslgKSFA5/9B00p8aRKmlLFkyuS qSsqpgGMNwAdoXoQcATzRlt1Wp7nCYOqCYNgmqCEaZoRGpV7mijOAA0VQgMi aIJSmILOGp5fCQMYEgTDIIvOgAM10JCAqpxsCQNexnY+6HypuHsrCAMciQpL ACJeFyIgsAJyOqeSOJgeyosIegBPkEWw6UU7EAME8AFNl103GQAk9wOLqRKF Y4wIOyAa4DE5RW6eCZq+6qASa5q/+psWe5q/2XuwSYtK/rBat1QvRgF8jQgC GbBgcBeDdEqYV+ipUTkDsZQuPOACdRk0a1kEqZh2p+gDH8CV8AgDLWCEHcAB 26muSdABXdmh8UqemtqCTdmrwiiDsuh7KAAbXiQDEtADMfACMfEABastKQGl pqqkpvqqiOFIAPoAQLmVXSmXwQisPxqMWGig7Mi0LXhwG3tgr7GIwUcUsxQc 2XpwKRiJ70inCuqyyPpK1yoDGXAKYxcBbLlgB2CRageuR6uO52eEOxEBljhL TbgEuelwBImg8SqeuxqDI3CmLjsUWpRFiohVvPF9e9h0kEMAVCq2XqsBnoC7 31UZD2ACEFuOgumlvfqCu+iO/hHroWBqp7CJUCDAdcZwRcYQIrgphTz6ldY7 AkFAA0GQKAc2GzoAUDjBlufIjhbpfBgJo7hnhNHXATqAA+oKqbq5gnRaheQJ pNZrmsQRBD0QtUOBA1h5ZbY4ZQbASwPMSw/QrwHgAF57RJm1CZ6wJMKCpA+Q ASkAsak5v7gHrFiolO6olL24AjNIG9sri/Xij4XiLstqi1zJm9Z7kjpQAzRI GxgCAsEhAZojo5prde1oAEHodgMcuFRoANFXl5wTAe7bISHCAUfgrAU5nsGr tJk6mlUIjLJkj2mapkDhv+u6BLQFuuoojOkJAGM1M5CzbgyMu7gLTewHY9nG AibA/pzlCpaqGZi9aJoUq5QrEH4KuqswcACnOwM0OBux9Azpsrf8aEUnCHfw yrQ+qrQYIARRe5Cz6Lmt2DMdqaI9q3vOJ47rKInBCLQzKjSKyJdJAJFySbdO XJ5GGcVEeQB4CpUIlUUVWi8dwgMmy8K9eYV5F3g9shJEFgCQs3IxgLuKJACc qWriCKaia5S3hUZMOItOmANWF366+LQziAsu2z+zYCKywT84cLpdrMhA6qO7 6AOmK8KxFEs4IAQckErJ6ZddKYwU66t0SqnmCsoR4ADrGiJJII4C2bRKu8qp XJ5QTJrBmb32mM5DoZfqSgIekIq6OLq9WKnCeABi7EuY/sA+PwB7uMsWi9MN EIAEJWAAI60DvUmaGCBrtPh7IAIiNgoCO3t7KRiQvqe9xCDDrlGD6eIoNfDQ KVDNk4ip5jnFL5y9spimGJIvq+CKnGMARpCKK8iaoimehumKoRwBKeB1KKCu eexwHmqpGayruOejunqFT6C9aTqDWbSJiggbIMDOHTCS9PqLKY0BDJCeJ6AC H3czHtA+sNot7pFYTtcCFZyO4ueruAWb9LjSNvrS/CzEQHx+aj0bSH0B7rtQ /rvTQiCn8RyvYt2LKY0ABnC61zwbOJqtlRxQXSapifrFwdqLuFep92yXHVkC NcCXIAKQ5WgAQdqLBV3Hqtmb/tSpAsC3va9UIVN7rRciBKh4spP43EVJ0WB8 fg6g17A3zBy9EI5UN27MgzCqoAYAzSx9ZRjyGs7AFDOQrlN2flfoAJgYlVHr DE5jYKPjKEsAz87q27kX0JTYewg9obOUra+AEzP6ASQQkNUM2r9YqZV619fZ ig/ZkRlAIuraxXPago7sggUNxb2onjKgv08oFEZBtY34AToc0XUN2tI90cII A3qdbzNjBO0jGNsNASYABaCpAwiAHLMYBAd2YFdpm1o8G+l4W7ioBAitiXta g00TYMNHAl1snfMK2hjgA2PtglDrslesRdGwOUGT1agovyhJ5VR+ndHXAi3Q AIDC/gE4SgJJwMW359pVPsX7TeV0ruLAqYk0oAQzWCjy3bom6gE7apIYTuYU TdF3zQB6/XExION3w3rd0AEPcHvhV6N4GksjnJCtRmCFYqICNo8C7K5/TAza m5eDSKKNsgQkwLMX3sS57N+lnqannQKuwIpqiaMZqYL0msui3YsR95ArUOs5 AQUTAiIyMMBdGYl1vOxLO55UzuDAieQfvomuMUsWAnw2ygF3KeYnXeVU/osO HpZBwAHWzRaJhRiA8wA0UcArUKNNiNALrabEAUDQcEXP8IgFTBy6EMi0cd4L la60AQIjDXcpO+foydsHAMn1aK1GkQISXsQT7nXpGLp0/tvhtrwCP9uRGp8B LQ2pCc7IUwyiyz7XoA0DNEiDxXBLFcJaGbqz8IiSzt6bdF2FlaoDT7Doeh0+ QEQESMAEOF6yl7jS1zrvlm0LN1hLx+oAvLQCtJC9+n7TwtBqJvLk1Auk8pqg CiqcwfCyNbCVRDyjHeDmIbKlsC3zV2gAQsAAragKtC00+wzlnOyVZd+UQn2g eE6L2Zv3VFmDWbUEtwx3R6mrdp+peK4DSnDzO6AC2RNpq8e+vJSu4k0bFKoh gmw6VxQiNmrLzcl1xOqy2XveztAoNnqC5wfEnu2bHpqRi629IQwNH+BPnRMB Tui5t8ej8wsDspibEd6RRZzV/iHQud7N7Rl80lPcpZMIA8KwvTgQw3lJwxMy 9haujtDdoGQtsSUfBCqA/TtAGYoVGA/ABEyQATvQ5iwti1h13lP5DM8rFRjy 6UvQkLSx58S6VUThNBxClSYaztDq7cML26ZJj4CgFCQDMnMBUvPREbESkRER wYFCQplUZFKkU1SEwVl0wDFDwrHS0QhpGlHCA0I58uFyUOTS2YlQdGuLi4tg W6ujBAJCM2wIciizIEqSpOmiWevZy5s7jdBrcKDDAMIBolLwICAuACEgQNSh w3oxI4OCsiCvjDOPA9+Oc0EyQ0OCwgoHqRSsDM1QokyZjH/7FpBYmMLFLE/R dnXC/oUBAwx3g/rRCIKiBocIHR49imCERIiHlHLogJHJ04pQrXDoWLSo0UkS EkAkYbbCRbZNvnjVuibtqIERQT4GGzasHYoZIHiQkrhJR7Rb0zD04rrVAAwD IJ6o2CGugAC1EAaIEMDkwYgeOHqASDYDxz+99/LO4JEXMA4c7pLAeubiCOCp 7ZKhuHBh0gyHrZYYEOopKadrFVcUEvaRVVUOpkovSsGTEIlCowysGGuAw2ph Sz4wcgTpUQcHrPgt0BE0U7SMFKv5+JrxgIEanw/evSvj0IJ9l6sT5eTVONLs X68dYIDDiAoQ4daWGzcuQZQRMWTcmyRMb7x7OHg8FuyQ/udlxLDGrp7hjkFT 4SBBMpS08kFQEmmS2TQHdPXJE8JQ1c8wrByRAU6Q6ECDBJSEMElPzAizGj/8 WJVhhh2suIgOI+ygDA+wKLeJNLtYg8Fx231Ck0c00OCeDErAIwoIz8R00UVf 6YgRAj7ogoEO2vBglhEPDCCOAueY88ADHVQggwSDERKPPH4pMyBkJOwTkQtC YfWJDh8sMeFnFyzAGAgekkADBxkUMZQBNtrCGScwyFYIDzwQgwKQqWRgkgs1 JIECgSPiECYJhBG22gJL7ODCiqgw0oEJVt2zxAw6LJjZUdRkhxEuG10wSFO1 YooCCPIs4YCCSDa5mVE37hhl/mwMGHECluaZB4ECD7DwgBAS9BAdIfTIQ98C hO1jFWITZZLLARgYQO4HDnDAwQ5FUkhbDsFJNJxXtsjSCQwfUBgEDsKAQKAO kJJaUg0rLeBhpfsUGM+d8lywBA4YltJISZCgwEE71AUHTS1FeWVUL8oxVVUQ PSCkLyEFzXAkvJ8Uh52T1xSaUS0wPHFCzR+IY0445pijQAET1NXDY3o6RM9k ataHgwNvzmLAcFnBwIAB2+iggwkrpPDBBznsUGISQQkKDUXBdjWzDHmBEIzJ KBxBkiMrriKBPCQsQAMKIehrn0JrGsJDChmY4PYKLTQQwQ48mK3oDkfoMNTY XxWn/vEBPIg8+ZAg2EXIIS19rYksTVt0zZPb6eiLaxycwIAKJzzA1nkKDIBe XD1UQNd7/NYzWF4L8EBCgm7G1CouTWvDwAPF35xC8inokAIULkS0wqr0boJU Lp2IW8QKDvRjq2iKVl3KIpAUmMQIIeCJuwzJ8DCY3DT0rSJupXlADCtK8CA1 oBQN97I1nCxVCBkAKV9KUMIFiCEKr0lEZZvhjo62Uz1raCMIDjiBCmIgAC2Z 4wbi6FIGHzCBAMyFLniajz4uEKYZvAJjmxAUvXqREQZEiQGo65INRRAAEXjg BSv6V/RWIAscgU4b4wJBvgxClaoogm3xS8GngHSPhdFD/lMNGYxIrMa2FZjA BCt6AA9UoChEqEoTYctI6HpxHIxgYCYFCcIghEStzLXCCF+TBXb2Jyw0FioX 2aAhzWqmFtiZQ1nlIQIEJsCDHtDgHjRAxgV40I7dKRAztPiE0zLSNKgxAACr +4AAhvCAAAyBh6pIkSNWED0YaExYB5hSENrxI6p4ygEkyUmGdKC+Ai0gGfS4 ByHqMx0+LYBtXMxJCyLQAEXpKy+jgAGDlEQNYWFAObRqhyJFlisg3UUvbrrM r2AYK3k9sDsxm5kKaOiBcTgLdmrRkgbHEReCRecQ9wDBY3YHgjr+yozEkVfT qFbDB5wgADl8gAYg0IISHGGh/hE4goZKAYMggkUbBqCKEj6ygGOMhhEmWYRi ktC+euxSH6xg31QqNYIFuKCWHThCCyYwuAEqQYB/yV8ZwckxTB7AiCowCwMc ANSsZe1cCvwATK4jr6QSBzld6cQ/Uac6FQgAdli6wTnYWQ5nQaAEHiAQweBx lxmgYAkcSFmNdMGVJsWMAc4MKAE+KUokJDQDC4VUBiDG0UYARxvacCatTPaR nqAoQ/I7wgV2oA8JnC0Y7uCXphYiAfZB4ZR0PcIKJhCBE8iAB8EIBis+0Dmx mRGG5NoGA4T6AAc84GZC/UARlucCGMRCK+G8I2cgJC8YUi0INAzACUCpJbWU Z2es/oNAACBgAhr0QAJ3mweAcOBNzPSzerDS2Lg0uboTeHIIAWBCC1hAV4k5 1BHxg8QK7ioLVOaKXT0JAQ+SED/xdYAERhiMBCJzAQJVKjrT4ddCRpACDImv BZZtQApooALnAEisq5JIK/3JgAhHWAVBUAEHohqDC17QCDEggAeM4IAk7KDB L5FSRA9wYnGJi59NXavqkBWAq3bwPDs7DxGIMAEkLMAJdwKQnlbTTZjYUUlQ guEtVGzaBxhBAA4IgANYMAEMOdShLGJRbsQHqRWwbQahcAchejICGbjgrvLr wA4qUDBr7VIek1jICUkwAg6UoCSCi0ALALcCGajgkR7p/sYBokeuchkgwh7Q rgMqrIJEx2DRHli0ox3daA4gwQTeFLJysIc9sBjlOE7t6QkqOIRx4KwcVH2d eX5w3Amk4B1fNdGqvJmxBt42F3kk3hMEKgAPBOClLsUQYU9Sy9uQOUONINFn wnQXHvhLfpAwggQk4I9czY2ZuytZK5wwAiNx8TZ1bsCE7MfWV6/AAB8I9BM+ QGhO7iDRF3S0BgKwaA08OgYe2MEQTOCmI7mwKw+SV5N8gD0YnOB0hRYABs2j JSxpCQA7g50AkMCCBEBgBBUIQdzinAEytgpCw3rZUaK0gmN5IKgtaAETwrsI FYnKbSQhNoYicK5WSCBX8YBz/goiwMXznkYISYgOv3pCg4XNzc2TwMEIoGBZ JjKCbQ4AAbqptqpOvMQADjDArWloPNQRgN0ZXnQA2u1oeGvACBqogCJWhfYg TjPT1pNmK2mG9RgMNGfmwSqWIBDKISSgAC9owYHRDGffTa8r5IxZBDE5rjUy 4NZWagBd7ZqiUgRbQz0UrwscsINj8ERXJPAA21JO3hFI4CdzQ4GY3BMPgGx+ HyLBTfjMGwGqSa1pTZvXEwZNQ6yfgAAAYDcQVPD1R8t73jFIwhGeFwtZrNgX MPQFp2W4jXPW7ASfnOqoh7vBcPxAAOoZAgSYAAXmSmAJr4aJDqrRdijx81VS AihQ/h3hUJUzO2KkIq/luxmK2XyKyiuPgKWYOzeW4hA8UEKYIg+sUAJa9Ajn FTFSc34x0zQR9h0SVjypUzwn0AOJtgO/F2/Et2hGUAEBJhSMwziIFzP9dIKJ xwAHEAQ1ozq+FQA3k0HK0jNTBQHhADtEAABq8QBEEAVIUCn5tECDp0Yt0083 QhziIjVQwwEMMAEmUAINICql0Tb/oiL/UhKmcCQnZgBJkASisFIrcl4kUTEh MAKmJ3OzwRcKQychsDw5IV96NXu0p4IYkHuog4cCtXWJBgQLcEFAIHyLZgEc ZgQl4AJI4AJB0UpaMU1HmFNqFEMocAItSAADJQABoCzm/jFq7hRKaxEOOAMF E3ABvWJULlQUmkYoTFWEyTE1VjMBghNfpjF5DSWGDjULzgAumcAAljUqK+IA RpBf+zIbwsABScABRgBasAUcvFgakjduD1Z7MrSCGPAEEqZd2sUAAhAEQJCB KgCIHuhoFQAFXGUEKPCF3UAuWLFKXsFpCPBP1VgzAjBQ8wgAWKIsDudwakFQ UfAAP6AzD4AEEKADJSAlsWBJ6EcoDSRr3CEvfaVlgjM4UmgSo9KLLFcCd+Ua tPAL14VKjXAKHeACTOACzoN2iWg1CpJvB4AYENMCpWBZWvhCJ/gkppV7FSgA 4sF1MVABMSBvwzd8OlkCIBUC/qRHCZTAAbInKDl1RtmgAy5YQQQFlTiYFuOQ iQ9gDgHwAPyYQeXQJSxgAmg3TU1Ca+l3R2YULJgGHIyAWQ1wXguIE/THcoAD KfhWkMsHKH8GMeITARFRku1XBLIlJZlBES+BSiXAbeoQmBnxJDHkFdUYYRWU dewGdh1oAY5mARUwBCVAAxUwGKY3GDUxCkcCKLg1TU/QhDUDbwYnACrQcGnR Qe50iQGABAXwAzt4JVb5AKFIgp+gdrFCeCzGHYOGLkk0A0agA4uThVrUNiln CrqRnFbjJpjGCUiGSrDHCM8wPQl5ZEnZiEyJSlbDljkhFudXezkyLgeAOhT4 U6mj/gIV8IfeCI7iSACzIwNOAEX5dSetQAJSY0f7E30WlGjU50kENVVbgh46 sxYPEFwAcB7oIGoPcHPSMxSpyDFNdSODNhsA0iPuYAArslK+dle6UYUe6VAr hRiJ6Tli0ZF5mW+d8yC3tRkvgx0Z8Z0roFDclj/leYLKQYHI8gEnEAJ8eEE7 uWhAQKQ6OQRIYD4jQB+QARmDUR+88wyCsj8YwAE0swMW9HUGB3xYUo/mUR61 WQ4xdoPWZ6B4NwT+km9IYkdpBTMIcAAOsBpfeI5F8mzvlWUXeVcmMJFaVhJc xESPgJ25mB0gR3+nIBazcBES5T8V+gkdaTUl0JJsEza0/hYzPDpo6dklM6AC 3RgD36iTRqqTFQABHyAEFbAPPxIZ9VB0eqE+3UQLpWUW0weDBEpQozZjzIIl MVYAAFCbN9AWW4l3XdIAVEML8FILg7d2ZBEEhaAun7Ean1kfSJABifE3duU2 v2YSkOJQJGZJ2JENK5oTEeAmZIQc/MMV2GCoNsoIbIlKUvJxToIRtxdhHwAA NCSZ7dmePEmZMcACFSAPPGaAu4RCIrUmdHJ8TKMcIMAAFXYCi8ZkAkAAMShj 1mcO50CVGFQAUbAsV6JO44A1TBA9s7Uy4lIoyuENz8ounxFMrUADtGQCddVS EqMhe5oixweSEuFMvJkRJeaR/rX0JtqwMrJmZDkSLoV5WcopOEOxfP42FlGz np8WVYo2b5VZARVABEhwARywSLwkVu5AgP+geb0DqyuQpWYRoB/wdQSltqzj mhh7sePQBOfRQR3EJR/0AEkae5lAhGunA90wAyrLD3khEB8QSUJQVqZEZfFV CjHbQ+TKp5dhrtPJCR15G5AAC9LTm4WKC5xmESuatC0ZPa0kUUahHOgGjwLl e2C3kztptf9an13rDpARHewzGP8QWfnEODPBsKdzOls6sZcYAwBwm+SgFlsC O1iplTh4sbCjJUTQJUMQYEERmCsWJ+wyA+cYrcLAA0aQAkwqBEbQASVgmIAz hdn6/rgpApIm4BITcT1xgpfjep2KWkbSIKPNN57RwwgtCQljoWINNC5w6gMR lnUXlpOgOm9IUAP4yaq5slkChBD4qULk10048AQ78ARPqbYEhUEYxCVYNZWi xqsFEACtoywXmyXEmwJMQGKe82dGxC4GUCKKFRmQZC7S8gCxZ1c9NIYTaYWn FCqAGSWccYIn6ZEeSjW8GU2zllYxs6L8i0ogGRPWAEPK4ZjodgI0cAIVAAQ7 oJP8Wpkx0ANQMAQ8YIbugSvvEBU48D6QAQ+fEj3eEATrpmgDJVUxFrzC5Zoa 1Bad2Kt1lyXn8DpE8EHO8gJQABzY2Vc8oC5c5gIcYDKa/ncMhwMA7klgfMoi Oqe+JfE3pkBMY/YnDkY9t5ANMJCXtwETBmkATcUVPqBGtPYaqDSpt8FXvmDL 9iJhKQCgQsqBX7xoTGAENHA39UAItRulUFFSu8MDJUAQKrAAD4ssONTBqYmV XRIO5XG8yhJjUXCxrTkA5aElwiqxuTlusaU9FFJulKGf8qBRwZACc+YvWWaF WIYbGRJ/4UWuUZdpOmW5EXN8ivwJHtc/abQdfwYcWLQC7goNjDoct4duDiCZ O7BuR/qBHYACnIktyaYE9dFYBzEg/RACRyDRfphhq7lo8whv8MaDHvSJCsCg +ljCAFDCBurSwbUsWhJKqrU4/sCxAlZBAg5QBEvghcwAIIxhDDzgAJa1RX/D p0zEyVNIz5CyCNjpYEWBl1FsXkuTmNcRQS22oq+4loCmkVthKOUWYQCagb38 aBVwyJuJJ48kJIPBCh+hDyrUZkuANTIAjDvgAcCXTsAHfBh0q9dMYwX6Osbr qwyXoMwiAD8QyGP6SU9IvvN1CB+AA0NJ1P8wGWLFvSQQKnwq1SqHE28ZbPLH QrYVrgx4ueVa1f32yuk6DSoKPifJCCXQOB83LuRSjeaCaGdB0YvmBEjAAU5w XwTbSI9UFSAwAk4KECAgBA6gA1sLAiGQYUbQaBwMlalJvA9gm7d5sfq4FgwK O7ia/jPisH3HG2NDAABIMAE60ALd4AI88RM+MTd7UULHUANI11B+KjH1zCLO 6Xp7yrds6hWuEcXOGAGuIbQMQixio1umbMomAMUJTrLhggFlMYE0RMfeuG5r 7QElQHFsrFjHQCGHsxj1XRUX4AIp4Q3CoAKVCOO1asfePQ7lgVXnEAAAEAU5 zjPlYA7QS7eCfIlwAZCG6QAf8BNJPsM8UQ/5lVGsgG/XCnmmzZwc1VHkGp2e EETaYLm3kbOXUbqPSMUa40wryovRswkr1kpkcRdycgI6sG4V5qmP5gRQkAFQ gMjnYjaFQBgyMAhVEUaKAlo0YAQgsAOemtIDtbYxxuPW/qfHDTrkf1zeCnoe bEGmOD5QIdQlk+UBPOAhrbAvdyEVSbQmJGCYbHPPztlDhNXDWoYKnCML5zej qn0KNiq5SpyKyDEoKAYcr/iQpsCff6kDPYLUcmIuGz6korpoiOg80PPIxjYD MycagH4BOmBxnYrtH2hwWzrN4JCgw2WPrDPkO2im53DNHnQOVnUe2ywCD/AC CJVR8jBzzxYPYiU3MicDQnBzR1BM6ltmKbdQ/X1XJfE7moBThFmdEaMgspUN H8cLMdoqHakD7RoxqzIWHxAE2AsCOmA8ONmeXezLZodvLcq3scE3f/EcP6IE yYNgEnAWnSp3AbBkwJfdMWZD/o/Og+ixj8bVJT1zm+eRAHS7fYzeAjEmAgAA BRSnSNSiUSgUGWJ1AXEzA4ngyQ0l2o/blvVMWKKSdgyiHO6IlwMPCVjul0X2 ONR1nh3JwpLqkTqwPT6BvRdQbuaiZ2fRje0p0c4DWjGhfFLCG69EFZ4+DDsA BTsAgtQ9OxfkWxANg3ZMUOfutp8Y7pe43eiRJR4b9O+E3iLAj1jJAqPaA1Ff T/aRD5UyDyQgBB4QKgKWIj4s1bXNUaDXCAvEs0q4RgcOMOX6lweJI9YDFuEW PZaVgGzTHEUyG6zABBW0bhtOpBXgAMy8pspRC2JhAITALjzhAkPQeYYOAu7p ni8e/mM0b6sxQOPDRbdaEgDqIQAs8O2jho8279gxBi3l8DMLEDRxE0XCsEv2 FCN4YhV8CgguRysmHRkmERkdi4kdhYkRHZEZii4uOgc6RQcGGJ46KzArHaMR EStFl0UYmwgYrquuCD6uGD6eK6CEp6QcIDMzIAskKCAkODwpOhwqKjsqMdHR IVBHH5asB6sGnAcwDsHhJARQSx8gOxwVKgshQyofKgHzJ/MOAgEPDwMPAhAC BQQoKPAgIBEBUf4RFAjQH0MFAh7866egIBEiLESM6IEjBA4JOEAgA3FB2AwZ Cy7MQMEjRIcSHY5kkKmIVIZIKxrpVBRJUi5VGA4cCMpt/oVRn5GOpAraipUn p0UQIFjlqVMuQoRamHJw4aOElSIXLODxQUe6ZhVipI0hYUgEF0U0xYX6KigG DsFA8HBgYIdfFRJUhKiwLlqAGAIQiwhAIHEAfgAl8pvIr8A8CFECBJz47wYA hwEV8AsgcEK+CTRi9BB7ASQKCQtm4JghlnZJZBIiHNldIkKhFTUb3dQNScdN UoVSbdJUFQOoDEdPnVKFaaqsqHVf3bKFgQEoHeCxdtDBYwcPHihkFAMBQsgO JmjVSosRwkWJD6g4TfUEq4gBGAfwgBcPDIiwQDMh7NCDCutU4IA8BATwwTz4 kKZCQfrwU1BkE5GGxGcUCTCA/kMJiMgQQQqQRkQUMUDQwgiqLdDDBV0Jg8IC OKinkkkLjCBDbzP55shwPi3CCCKUHBGJdB3EhR12GBQ1Cgyk4AQDDEVQhZ1U UkVVS3cM9HBCJjqc0puSHuzgYwjshdQDDWSlwIMR0EATQxJDHKFDCpdoUsuW Va0AzgwcIAECNAcu2AN9KhgRw4QRzkMAEBNqhiFBAYX4jwgAcaahQgIkAGo/ AhBBGgsBIAFBDxXI0IMEErC5AAgy8CDbDBKAQAMIIxhDAp9mzrSCTIYYAkmx kvBUEyklHACXDgjo8IkBV+UkXQYuGOCCNgdw6QlVrhzgAwc7BMFDEA+AYoJW KzQQ/oEOI/iCHgoXyIBOeR98EFgIMajDARQu8Jnlt19SFSUn7OnA1TnR7BDD DiEsKM0J+NQj4TwxPIAEhhFBwM/HD5AGAQAV+eNxqAwNcBBEEP1QKgsPsEAE q68u8FpssX2Eq6/2ktAjFC+ZUAIhRxgpCSPAJWtK0T2Z8tMK3G6CS06jlDId eFJzO5QBBnDwhDHh1OqADg2ou0ILw/pyAQkgrJfrCEJAIZgHaXFAjQmWqDKw U9/yfQAJBugwgwMcFA6C3Q1Ccw8BMQQgQqWIaQYQyQCM2E8//0QURT8FZPoP RJkK0NBC+UTxwgQx0BDCArAZc+MwwrC3gAwzkAAbCiRA/iH0bocYchwvjBx7 E0+MvCTgJZl4E1cEVJri9BHb5sIJ116DkMQM11//yy9KgADKICUMIokHs5Lg Mwi5iiSEA0iQJYEDIDiArXKaCBVLVLFMtfUyQZCLjp0M+ks8AnAPxChGAEMA gD4wJZkNBYQ0UciUPvyBoQewDDIMyQeqkFCD1JWPTbm6Ea3C8rqQLCF3jZBE IYy2JCOdAkmQOM5NjnA481kvB08wAgNccAprLYkDF3BAEtiWBLywrXZIPAYJ eMC9D7ywXUqKABKOIQERioVWF9jBMgrHASO4YAXXcBIroOWlMjrlACvASxAO BY20SGAdg2lGPARwjyEgkDGa/gFAQPQYkc0I4AcAyIc+DoKhiQRkIQAhjegC AAGCIGEEO5CBetrkOhkQY20omAEPUsIrHOigAy6AjgmIdaxjAWeGPTnaKSoh wu1ZkgROlAkvTKEDEuAlGGyzIduMYYyxnGskZaIa8IwxRBKopDYXIMsDcKAC T5aAT8gb2JOeEotOwMAAIHhCM/zysLQkrnEGJKA4ESg6BQDAYxtyoB5LpxCJ CGQhE8zcPkImOhacUwgVaEeOSJI+9rAtJK/JywhwUIKbAKdoywLeIijBQqPF pCe+8BV7JCCD+ujGWKdMAvpsVzv2tM18uIvNL3CgErK8a5Vni8A5hCGBXc6K JVqE/tUHSpAtTTAHSrCQBd90oIIg9PQZDIIGB9SSFhXcwwMC+AA+JjSEAAzB gfrYEAQ4lo/N7IMIBVDgQAACkQGwrFSkKYBpFlABGtArdsbo2axYdxvbGQNb GSgoQhMBnBYOa0nKiqFubuKCISYBdrSSQQpA2UJTpCBe5mtdMUPAttjUyla2 GoEKdFGCFqCtAw2AFQ5mt9m2YTEFKeAAKLV1077Fgi6ecAEDdvCEZ8jAGf1S hwpkGwNoDKFxEcIHp0RAkKkOxILznIxANkcEiUgEAhCxoIgeAEhzlqi4EzBB 6nrwmpaGxK0vLSlt2HOBEbjENzRBlguPFpyLppC8kkjB9BKsl9gkyOACh0ja kloQSRxwIJckCAGsilGr7p2re0rggXGEKYkIpEAIbLoZD0JyEtHmTQdwidpT Jpwd58AABEEoVzOgsYO0DOZhMSAAAezY1MU09cTHNS6moPAAKBAEulPtrYor aE4GVgQCLOiABGjQGv22tKwowEExioEMFGQyV0uQH/Ri4rukHS0nxUrEssZr CiO1NAktJYFGa6ADppGCEedYQjGoeIExF2NtMqBBFVVSA9EudBSSKMd9jYEe HtCgViSAMAcc4AIY2HQVgDYAAjpBFa4dgAFBkIBP0eEwRxnBUR2ugKNU4IHH OVUET21qIAAAOw== MIME-tools-5.515/testin/phil.b640000644000175000017500000000035610677325674014334 0ustar dfsdfsF i t Q====== nSUoX L0OZhJ0Oc0OoRGuWAABkM1lJFahDqEOirdQh1CHVqihWoQ6hDohE0WLEBKFNOoQ 6xQgNQoQ6hDqFC5bSLlCHUK0LrFihDqEMWqhWoQ6hD qEOqKEOk6KFC5YoUJ1vVQh1CHUK1CH UK06hCqF1ihDqFahDqFadQtmqhWsUJ0YQGoXKFCtFqhWsUIdQiNcsAABkM9iFlE6SINXROrR MIME-tools-5.515/testin/simple.msg0000644000175000017500000000123510677325674015061 0ustar dfsdfsReturn-Path: eryq@rhine.gsfc.nasa.gov Date: Wed, 20 Dec 95 19:59 CST From: eryq@rhine.gsfc.nasa.gov To: sitaram@selsvr.stx.com Cc: johnson@killians.gsfc.nasa.gov,harvel@killians.gsfc.nasa.gov, eryq Subject: Request for Leave I will be taking vacation from Friday, 12/22/95, through 12/26/95. I will be back on Wednesday, 12/27/95. Advance notice: I may take a second stretch of vacation after that, around New Year's. Thanks, ____ __ | _/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) | _| _/ | | . | Hughes STX Corporation, NASA/Goddard Space Flight Cntr. |___|_|\_ |_ |___ | | |____/ http://selsvr.stx.com/~eryq/ `-' MIME-tools-5.515/testin/multi-bad.msg0000644000175000017500000001254410677325674015453 0ustar dfsdfsFrom: Michelle Holm Date: Mon, 21 Aug 95 13:30:57 -600 Sender: holm@sitka.colorado.edu To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 X-Mailer: Mozilla/1.0N (X11; IRIX 5.2 IP20) Content-Type: multipart/mixed; boundary="-------------------------------147881770724098" Subject: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch X-Url: http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit > [[ERROR]] Error 600: Internal logic. > > Dying gasp: > Bad mode: SEARCH/ (600). > > Recommended action to correct the situation: > YIKES! IMS/www failed one of its internal consistency checks! Please SAVE > THIS FILE, and contact IMS/www's developers immediately so they can fix the > problem! If the parentheses at the end of this sentence are not blank, you > can contact them here (imswww@rhine.gsfc.nasa.gov). > > ------------------------------------------------------------------------ > > > Location of error > > Dying gasp: > Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line > 753. > > Traceback: > > 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl > line 753 > 2. main::Main: from "main", > "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 > > ------------------------------------------------------------------------ > > > Basic state information > > Include path > > /usr/app/people/imswww/v.b/lib/perl > /usr/app/people/imswww/v.b/lib/perl/Eg > /usr/local/lib/perl5/sun4-sunos > /usr/local/lib/perl5 > . > > Environment variables > > CONTENT_LENGTH = "281" > CONTENT_TYPE = "application/x-www-form-urlencoded" > DOCUMENT_ROOT = "/usr/local/etc/httpd/htdocs" > GAEADATA_DIR = "/home/rhine/ims/lib/gaea_data" > GAEATMP_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > GATEWAY_INTERFACE = "CGI/1.1" > HTTP_ACCEPT = "*/*, image/gif, image/x-xbitmap, image/jpeg" > HTTP_REFERER = "http://rhine.gsfc.nasa.gov:8080/ims-bin/v.b/imssearch" > HTTP_USER_AGENT = "Mozilla/1.0N (X11; IRIX 5.2 IP20)" > IMS_STAFF = "1" > IW_CGI_DIR = "/usr/app/people/imswww/v.b/cgi-bin" > IW_DOCS_DIR = "/usr/app/people/imswww/v.b/docs" > IW_LIB_DIR = "/usr/app/people/imswww/v.b/lib" > IW_SESSION_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > IW_SESSION_ID = "809033436-10153" > IW_TMP_DIR = "/usr/app/people/imswww/v.b/tmp" > PATH = "/bin:/usr/bin:/usr/etc:/usr/ucb:/usr/local/bin:/usr/ucb" > QUERY_STRING = "" > REMOTE_ADDR = "128.138.135.33" > REMOTE_HOST = "sitka.colorado.edu" > REQUEST_METHOD = "POST" > SCRIPT_NAME = "/ims-bin/v.b/imssearch" > SERVER_NAME = "rhine.gsfc.nasa.gov" > SERVER_PORT = "8080" > SERVER_PROTOCOL = "HTTP/1.0" > SERVER_SOFTWARE = "NCSA/1.4.2" > SYSLOG_LEVEL = "7" > USRDATA_DIR = "/usr/app/people/imswww/v.b/tmp/imswww-usr/809033436-10153" > > Tags > > pmap-geo-opt = "map" > pparam-param = "Sea Ice Concentration" > pparam-param = "Snow Cover" > pparam-param = "Total Sea Ice Concentration" > s-east-long = "-40.0" > s-north-lat = "75.3" > s-south-lat = "66.0" > s-start-date = "01-01-1990" > s-start-time = "" > s-stop-date = "31-12-1994" > s-stop-time = "" > s-west-long = "-176.0" > sid = "809033436-10153" > > Permissions > > Real user id = 65534 > Real group ids = 65534 65534 > Effective user id = 65534 > Effective group ids = 65534 65534 > > ------------------------------------------------------------------------ > > > Log file /usr/app/people/imswww/v.b/tmp/imswww-usr/10184.clog > > II 1995/08/21 15:33:50 IwLog 94 > Logging begun > WWW 1995/08/21 15:33:50 Iw 263 > Perl: Use of uninitialized value at /usr/app/people/imswww/v.b/lib/perl/ims ; > search.pl line 82. > | > EEEE 1995/08/21 15:33:51 Iw 95 > Bad mode: SEARCH/ (600). > > ------------------------------------------------------------------------ > > > Session information > > [Session Directory] > > ------------------------------------------------------------------------ > > Generated by EOSDIS IMS/www version 0.3b / imswww@rhine.gsfc.nasa.gov > NASA/GSFC Task Representative: Yonsook Enloe, yonsook@killians.gsfc.nasa.gov > > A joint project of NASA/GSFC, A/WWW Enterprises, and Hughes STX Corporation. > Full contact information is available. ---------------------------------147881770724098 Content-Type: text/plain Content-Transfer-Encoding: 8bit [[ERROR]] Error 600: Internal logic. Dying gasp: Bad mode: SEARCH/ (600). Recommended action to correct the situation: YIKES! IMS/www failed one of its internal consistency checks! Please SAVE THIS FILE, and contact IMS/www's developers immediately so they can fix the problem! If the parentheses at the end of this sentence are not blank, you can contact them here (imswww@rhine.gsfc.nasa.gov). ------------------------------------------------------------------------ Location of error Dying gasp: Package "main", file "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl", line 753. Traceback: 1. Iw::Die: from "main", "/usr/app/people/imswww/v.b/lib/perl/imssearch.pl line 753 2. main::Main: from "main", "/usr/app/people/imswww/public_cgi/v.b/imssearch line 85 ------------------------------------------------------------------------ Basic state information Include path /usr/app/people/imswww/v.b/lib/perl /usr/app/people/imswww/v.b/lib/perl/Eg /usr/local/lib/perl5/sun4-sunos /usr/local/lib/perl5 MIME-tools-5.515/testin/not-mime.msg0000644000175000017500000000076310677325674015322 0ustar dfsdfsReturn-Path: To: Eryq From: s.rahtz@elsevier.co.uk (Sebastian Rahtz) Subject: Re: HELP! Problems installing PSNFSS, and other querys Date: Wed, 15 Feb 1995 09:38:18 try reading the LaTeX Companion for more details ignore the checksum error in lucida.dtx. i'll fix it sebastian Sebastian Rahtz s.rahtz@elsevier.co.uk Production Methods Group +44 1865 843662 Elsevier Science Ltd Kidlington Oxford, UK MIME-tools-5.515/testin/first.hdr0000644000175000017500000000041710677325674014707 0ustar dfsdfsDate: Thu, 21 Dec 1995 20:54:27 +0100 From: Andreas Koenig To: eryq@rhine.gsfc.nasa.gov In-reply-to: <199512211942.OAA24476@rhine.gsfc.nasa.gov> (message from Eryq on Thu, 21 Dec 1995 14:42:33 -0500) Subject: Re: Bib.pm Reply-to: andreas.koenig@mind.de MIME-tools-5.515/testin/multi-nested.msg0000644000175000017500000000620110677325674016200 0ustar dfsdfsMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="/evil/filename"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. MIME-tools-5.515/testin/multi-badnames.msg0000644000175000017500000000142510677325674016473 0ustar dfsdfsFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary Content-type: text/plain; charset=us-ascii; name="/foo/bar" --simple boundary Content-type: text/plain; charset=us-ascii; name="foo bar" This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary Content-type: text/plain; charset=us-ascii; name="foobar" This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. MIME-tools-5.515/testin/multi-nested2.msg0000644000175000017500000000620110677325674016262 0ustar dfsdfsMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="/evil/filename"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. MIME-tools-5.515/testin/mime-sm.b640000644000175000017500000003227210677325674014746 0ustar dfsdfsR0lGODdhiAB1APYAAFUai1WAv1VAvwBAv39/fwBAgKpAQIAAAKoAABpfZy9+ iMzMzLAwYAAMFYN9flVAgDBQYAAAAMPDwwAAQACAgKq/v2m1tdLS0gYSFWCg wACAv7SamgAMEoyMjHppadO1tby8vFx8gunp6fXesxcmKhIcI6pAv8vLy19f X6qAv1AAABIsOQkTGVVAAFpzeWQAAIuZtdra2v+/v+Hh4fj4+ABAQCB02NfX 16q/QFggMLqgp6oAQO/j48bV4thgUEKap1WA//+Av/Dw8GmCgklzeapAAI+P jw0bHiU4Qaq/gP+/////zBgpMVVA/8Dg4PdZhjlOUwAAcAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAiAB1 AAAH/oAOJoKCG4QEAgQBHjAgEh+QhoMpAAIFDwUFCZkUmZkJA54JARYZAUQB BRADoJoDna6wFKCwBQoFnbm4BRq8uwm9nb20u7+hwpq+xJudra2/gyYmHdJG JgHXAYodFSCQHzobHiYpKwKYCenDCbO9thQBGfI/RqghAurAmwq6/K+47HQJ BLivlwZ2AIPtaoernbqFCH8F09fpFgVrJqwhUuQhwBCPAYx08wYpyAcHKSA8 WAVqE7FkCn7IG2JhCAyQAQIMYKnJncWFxX4CvaWhmS2IuXIB08SMU8JYDysm GzhIUAhtOXN+3Nbtm9cPD1bi+2c0pjwYQzLcvNnBxZBE/ilSCWg2cFayTbv4 AYWloIZevQp1Pf0rMNe/pnVxeRDQcZHHjo25kvwK6VzLdJrimTLi0VSGtGlD eOgoAIYABZb0IayxokQJFiwaxG6wYoJLTQP3LaSgNFgwWXvJAkX8q0DWxh+P 5yQAo4IOkklkRIe0IMXKVT/i/Ugb4Ka87po9JjKx2DTqowVYlDiCIYL79+4b yF+xQhTBFTYQAleaOPHPWf3hIlpWV3mUXEchNPccJEmYNN0HMkigDQwwqJUW WprdJNMQHw1BwFspCJKIABBEwQRsEbQH34oRyEcbBFMVVxFvQAW221MD7eWU SwTec5UAOHmk4AfRbSCdDF5t/mBECh95p5kpOf3gHQwhDPGAAx08QB4BJoSA xASzsShmfPPByEw66ezXkI784SbjXvrtcpULARTYUYeOcePNBl4VaciSNsUD HpQVVmgKaKMJEM04QwDgwAOuRcABB2OKKd8EENyGWG5sJlNMgMAVE4ALPmb1 EZDJNQeCDkka4oARMHRkyk0fHQpllBV+1JEDj5KnqAcTlODie5RWCp98LECQ qUt4/VIXcTTmJliOndBZ4FtX4TlEghVUEImrKCki6E3hSRkPaGpl1wGHvRqh pQM5TKBCCcW6V2y9xraIKQQr3PImqMMB9GnAAOISwAM5IXxqTkAu160RHfC6 JEhr/mX1WQDmfuaZKVJe9QABvfIar3qSlpxvi5Y28MAECtSHRA0FsFZAfXhN 69TATd0M3CZX3VNnndlyKMBHHTCnCLni3nqrk1Cq1V2THD7gLnnBRqACyief fGl9n3T9CSsxOgtUcbfoo2Oppb6VVU7k5hQXeGuT61lW5DINXtRVuVYC1sRm XalsYcHoyi6sFE7BMaz0EsowrxjeeE/KvPKzAAU2nJMDa2e+9tybw/1dxRcv QoAHkLrWAL5+V3qEi0ioMkDZoJT9uF3NvLKJQkshRpY+A9hToFaOuc023cMT D3p43tn6GQEhfPxaBHvfm7qYJHRwAQn2hlWzU3Thctgw/uAro9B/hsPj84+a Z962qXBbHDfygoZm5d4sXN23vdNHcAQBJ1zwQXv0U0mMZHEMTrTEHe5oylJ0 QYzDJQAVP0ufuJKTOQrmZFYBUMADFDCoDl5sWyFowN72ZrL7rQh18IHCBxYw ghigwGotKkHryjYVWhQkcs0wCC3AtpReEMUXmvudBdWXuVulIgFRKEAUYAAE QWGQOx+hFwpR6DcUsBASS8CeijjAhLAUIHGx8EUoDgi5HkLOIGE8YATTx8YL ag4TSIiCiaKwAiCsz4lCQsKkKEXC/MGHAwT4wAhOMIILSKAEKlDR3lSyicLl znaMA4XiFCe+Lz4SjaNYYxs3/mkJJSKRCXKMAhLe9jYqaQUCTNhj/uTDIiZ8 gJASGIEEeGAE9qToag3o4ipuYYNQ9BIUhdPAABTXktcFsyeLc2ThhJgVcWXl bQGISxMDAIACMAEAKwhlFEoUBQCkjwgQQEIDJiCbBuQLdTnwQHvu5YEFfMAI IChkDHjggFu2Rz4l0KDrXKJMnxgzAb8c5j8HMFBh5qeXOfnd2qCZlWk+QI4r AEAo48jNB5Bomik50QQ4ICxWmhB/LEJBEjCAgWKh4AMXGAGfktCBQvIgB1qs l8r22c/CKWCMyrSBLcbYSwfqNB3D5AUbGZqVc3iSjkmMAhK7GYXACcByOUEC Cyhl/s5jZS0HOkjCVFPkAZSOYAEXuEEhP7CBGCwBCSm6JcquE7vGAdVfh3Ng UFvxw9oBY5jEsNYmD6YJUWrTotkEAARO81Qb/KAATLxbAKDAApRVlW9iKkEH TrABEpAABUYo5AgEeQEZ8CAGMRCC9WZAAgwksqQtaoBKdvI1uQpDN4w7CO4g 6ciDvK6CayPRUSe6zaZa4qmDJexToXqukEBgq1Q1VldHsNkRyGAEN7hBSj/L gxnMgLox6MBLSZpWqoZzl8VwhjJb8tPF+UKYtS1jzwLQMN0uNY4TiGMcu1kA IEWBvQKwQWEHqwAgMNQ7HILApEBaLygYAQUz+CpoFxwD/hkIwbo8qO4850nP GGgxkfiDAAD4CdAC6JRxrg1mMS8jzJsCNHGZzAomlCjH+U7ArwB4wAAsykHB 4kMAvcvvU9/3nVmFIJwkoFSxSPABesqSuRcALXVnIIIJN3nC8zTCB3Jgy3tK ChMbHNyI3dqLD8fCmMIEKkPkeg8FIDWbcXwAAF6sYQAMAMcreXMA7vvUBDz1 zagJABCa5sYODcEFHUire0rAXA98Faw8+MCCPysCJs9gno6IMA/COgSSmvYI 0IvASi7BCkkis5iDo4CX43rXSBqTAhqgD1KRmmYlqvnN9YWAfiGQk0q8Wb+o 0XFOpimoQXWoA1Cg39VOIAEj/qT0BjyAggewC1omU7cDHnDAZ0F7gRakSKab bqRtixlXgc7CpqyQK1H04cNXvDiboNTmU6NAouG+Gcc7rm+ug4uaAbgPdLPi EOky7Z4TvBLRKOCTB5Ygg3le4MmJdoAMNqCDCCMbBSRVAQdEqGllvc4VklSm RfAa1DAL83AmHoBOdXrTVfc2xgj7LY4HK2vg2qAJ9SWRfvX71B8IgNdExAoj oLe3BsTgAmHlQVf91EIHg9azhoaQBzo7TwnkIK0iLAEiLFG4gLY1zCLPeoet LtCDehgUNnjxNgEQYzg/FQnDhbdwgWTr4bZcv25r4vHE5QDG5ABSEcjBsZGk cHe6/rDJEA6tER4RgwUwPMFm9YAtrwYFzPEX1vkRuadPfEBH9tLrJh45QDfR 5i/K2KLsjXmu6y1zuRChsG4HEs6dxLaPoMADPfBsDlAwzxkIAQWGROk7FR1h 0Aqhnd+4gAdi8OQRlICklHKXEc5xmqprIqAjz/pNIw/UkXuYFda3Adl3AlwS 2ZvsNB/su4cLhErkV/w6tjfxxnU3eEkX2TowwgI+uwAH+B2lEnDACJo8ghno QAcSsAAL0D8egGygJQIQ1x45YASEkAIuJ2vFlB+XsWU2UGLAcFMKsHn5cRCx pnLvphMsB2+ogYFAogrtRlgtF3e91mtU8gA6cAFCEGEX/gACP0dPNxCA7qQD I+ABM4Bstjd8CxAhJyADHiACSTZPDtAe0TYavYJfOCZ5kVdiWXdQS0F9nRZU HwZQzddueMZ2tzZYdvZmoDdn7GVvtwZcOAc/y4EEIAADDhADSlCDFyB0iRaE aKUDRThpc+gAHiBZ7iR8N7BoRqACHeBg4vAuk3AastYTt2BiBzF54HNXNpCB JPdxIfg67WYcl0BYM/cA+mUcZIiCOGZz6tdEnxM/aIEEIsADSuAAF2B71SV0 N7AAM4ACHHBgruhwPIACl5UDjlB/YTWHItABCKZkWIUl13ANDihr4PVtsaMO KIZXDqEB/KAPOIYawTVr5ReG/oQVazRHht4oXBxUROdCKEjwaDNwAUagBNc1 AzSwdLSYAxzgACggbTxggDmAAdE2eAtQgDdQcLcXVk0mBLyiJePAJfgFgXeV gbL1Og8hgWhkWyCnAZcIZ3JWX3ZGejpBWHKhY/X2A4NFPHxGJR8BBT3QAz+H BDzwVXM4fEmmRTmwAf94j9t1BEfAJxeAAjQZiDqQYBBTf7xCCCYgACHicg4p hd/mcXc1CxKIV8GAD7NWWKCncvzFfHJGhoOFa4Vlb00kdxg0PFAgAT1AS0ag A/OEbG/4ATPgAVYDBZ41aREGBUdwNY8gA7QXi0rmAIJET09gkCYAMooic2MB kbHD/hBZKIXUKFvAEFy3ZlEXiWMbuRNayXZRWWezVjx4hDQP0AHE14ME8GjI 9k4xoGgQtwDI1ns3gIdMgJMeIJbWlWT0JEjzhFm8Eg2+AlySB3Yexgud1pSE qUPRJ4ohyF4WFVyoZwk5wW7sZQMtByRc6UaZ2SFQIAJKcANCkAM9WHA8YAgb wJ0y4D/dySc76ANk1VWmKV2JlgQ6mGAXEJMMYA1XIgAdwHzMeXlVCI2StHkG 5WGi9joHwYWCeZFnqIWjGG9lOFwJ2ZVuxHoeQQBQkGRKgIBGOG08ECFktQFJ 0AI50AIHwKEGYABJ0J2ChGzzJ3RdFXR4GDLSMJRTNxY3/kWNbkWFIscLRMGQ +lCBJxhz7UZNLEdzmAiZKocaNKdf6mc3w0OSYREDyMaDUEZ8GMpcOVAERWAA UyqlBrABPpAEzqWkBZeTcyhpKEAN40ANbzGUgvmIJHdQKDaJiTluVHgQLfdu 9QV346d27QYBTQQA3+iJAmBztIZzcTElIGEEWGVdKQB0cDmHj7ZZLVAEjVoE CFAEO+ABBScD39lZj/YBhWiE7zga4zAOiHgPTwWjanpiB6V5I6cAVGgDrDpv ogiZlWBnWjlzO0ZnpJdrNkA3e7aCNzE6AmAEE6AEICCTkxZdk9ZCI7AELUCl VLoDkAohQYdsTQZ0RkB8PHAC/u4pCNQgCC1KigoAgdR4UNOnqpSoqgAlrpuH fjE3YyV4ZwAqfnpGZ2kHlRblX6bIfjpHAJAyeycwk2EViAvGqFQaqQigcDeg BPcoAjcAYSAAAsZaj+8ZDSJiAqbxVEJ6YgJgUAClAGhKkat6qqo6Y9gogl64 dkJ6UaFoZwS6Y5pTN6agCAQQL0wQAT14dBEGAue5kmQ1pVdqqQ3GAy9Ys9tJ g3YZsdtqAlrCJYGZX6bKsbwkW6p6EKeqASC7sXfmiRuEhh3YnOgXes55Zzan U3q2fqg4BItBAhPwdEoajJ21bDIQofeoWc71pcgGAu30XLQEDpj1AAwgCIiI CPCJ/l+TmIEdRq5Ue4GnmgAcy6bnqgDY+G4y1nLr6n35JRbJyV7MeGc+A50z wX4c4hozG0tB+I8OgJP3aICLJmmrKG28R0so8HoR6wARaw2/AiSFda7iOokb q4GTKGq7W4GOex6Z6K5yMbI39mbqZ2PuKqTPmT60EjVRFwE6QEjUJkgEIF2e NU+ruIrW9ZrG9lkt6QEM8KkMgLTmK5RmCpISyKobq5itCrXs26pRS3Pw1nIh 6Wbu+m65Zl9Earwk0lBOYjcOqjcRsHTSdYQ9qF0xYF3N5oNw2VUxUEhLyoey OwhaMg3nWxrDVZ+6e6qT2MEaqLgfLGoZKLzoB286dQ5d/kh6xtEEaHeCXYin m9SrAYAEkYIBhPZ+c7jAEtABT9Zo3bvA9BRP8/SW7mkNgkAeSPsE7YK0tvvB jbuxrwOyq1quVJvCIdiB1PRmxsnFLEtnXahjMtw5FdOrJZBKLPB0LxiM0yYC xQawzUZ8H+AB/TMCNBkDDEgI5TsOsksNGWG+O9Zy1Kiquuu4UoyBH0yuHaxB 8CaG76Z9d8qu4senordygsleaag+DyBC8nEEHIB70QXHShoD4bAB/qOpHWDK NDmHnRVw4zsIEasliKglFbuchCzF8Tu4ibzIu9yBYvFbqXDC6BeS1ESkLndn OVfGQwABrkECDcBdgnSeC/Bz/hH8iiMQolr6XDOJbA5mBOIrCKBqviawAbb5 ANYBJLgWxYpMibkbxa06iZOMvJaLvyEIw/b1qpCJME0ETXcEA0iQSs/MXbQn waAlyoHIaAvLAxN6cP04Gkocse/JAIpikIqCX4S8y+bKqu28y4NrtYNVX1n7 mIyJfjaQcjq6EwNgc5A5tkS0FkewAixwaRGAPS8IsNE1hz0ZiE+Wuqc5Gn3b t9FwwUIJzg7IXgHwwbv8uxndqhu7zqTnmL8lvHbqxep3X7/cfWNMtsPDAkyg N9yFATnQP50VjDFwAqncnR2gaPsXXZ41x+RBzhEtDaRTvogonztGro7LwUjt 1IS8/s4fbFEgzXygZ37i56ffqHIkS6TC8z5OwkXCAhskhWkEIMFBN4fS5VUp VYMRNgNXIr7RJg16nBHlW8FaYrvLmautml839QNTfMvvjNSTqHL1hdL2dVP2 /FQFAARBeoI7ytL97BEscATqcXyTwl0gwLZhRc1iddBfOpt86AFGsMejbb57 LLHSsJxHrciwHbaOK2sYPbiqCtjnYJxsB8PFCW+X625QibKMDR4wwC/BfQR7 0x70XQIHrMM3nWSsTF284tmiHd2yO9rvwgCyfA0Nw0EbGwBNfRp5Lb+J7NfB NduWEJL3xX2MaXOgZ9WEhavE9T7dkQATYJM2aWn6Myk5/lBIplnQpytpNLkB D8CEfSkNQk3dFWwN1GDaGXvUrZrde93gjqvaCm5YwmtR533PpJdjwEyVw2Vn q7DYgTouGcAEMD3i7WFLHNAeUBCEn/WPxhpdPQi0OVC6Sky+0W2QQG2QtKzB GYTXP8DRPz6JGeTgcA7PzSdj3ScXRS6KtSa42XgOmUwo3ZFLVM5dVr43UDBp ZT3KP2esB/bNJgDUnyoNcc230Q2f0tAw7xzkQhoT+ZXIDC7k2a2qv/V5XWtj RT6nhRUFI1hnKOhfHi4oP9AApRXZ+pMiJTUpe+OLKyQD0xxhBecBG9ACfPjK P00er4yI5ivUps1BH3zUcW5z/nnN7B8M7XOuQR/tbiatdj9aX6DIboyZdlld Su7tAsEd3BhgS5hG3xxwBCTA7kmgaLwuA6kJ7C3gAT4Q0dQw4NTdAQTOAPxO Hlpi1PK75uQa5JPI3RxU8MGbQSeoLCfIo+0m3rnGXnamiBvOskTVJBkAATZp 7vKt7pTCHudeAnz47h8gAdGGAz7QAj4gvrDslxU8DpKeAtNNsdmAMbvc5qq6 5uCd3RkUABrg7EG/cu/mxbeA1TmaZ/dFb4RlZ5qzLXUCAbyIBC1Q9enkXGRF jzmwHjYZASrvAEXgAUWg8jjwofYuvtYgvnwbFgRuAK/nAAAwCHE/DjvWpwm/ 5j/w/gMJn/fZAed3n/AJH4L8ZeeWUOSwhtuY233ijQkHow3M0RzFVvVFcABT Gql8Iu/f2X8tYFoamgQ+QPY+8Pkr/wI5kAMG8AA5ML6lawClH6U5cAAHsAOp 38cA4IAdAe0+H9uGxfAK7+xw7uz1BthEDgEKAABIEEdQgAStnwNMsPzMnwPK XwIpIAFiCXSF93OmyajLWvmQegCQIO8NJl3Y0wIooAKiH/rn3wIvcDU5EO/f v/2QagAIYACUH/upHw3slfefPo7MrqrZkR2AoBCg8VMYYCMo+CBQIPAw8FAA AZFTeVB0cJCDyamJ0Mkg8yET8zFzERNzs3Ax4lHEWYRg/lC0syEzI6N0MrOB gaHS0pLk44NTbFxk8KKiUrLwESPK04JJi/CJsCO7k3PA8GASIJAYUCgQoGAT Yp5+GNB+WA4P6Qj5sIJkKZuNjW2AjR+2HKJwlZpx44a0C6JaGHAoCyCCA6OU 3JCxgIcDYEiKtPBRpNixYtZaRFCxoVWrDy02yeIH81O3HEYePAhAxBw5dz8O /UC3Lp0Nd+4IBVjUaBITKDlecOon60A2ibWUyThBKsipVKpwtfBQreonAwdI SVuQEUUEDsIcjjRmzGmRZhE8yLjwYQQIiFW3zfoXEMEtHQ5sEunZ81AIxInh OR4U70cjmwIg6GtxSaq2qAAz/r0MeEDHqA9KLly4uKD0DJawPgkkKyMI6bvU TmLwmAOuSFibcjTjMGJlEqcOof79PKtgjBMpCod4IAhezsfwokce9+iBZaaZ xWbzPDHipwM8Rp1NZbrVDLAQZ4lHEGPGjFQfeJDAEAHDqxcGRBYL6w1doq0k zGcAUeVPZzEEcdEHrCxwwwUo5IAEFA8MAQ87jzWWQQAZZAcdEzm0JFA2flkD Xi12FXRaQqsQCIsyMr20ww1B8MAgRr+oEEGBH4GEAyxkYaICfg6MMMIHw8kI UExNBqaDDKKIcNddI2zQmyY5eHATho51COY4EDDyQAkjWmNiQAYAlMNEnR3g gJSl/kVzV4SkGFHNJsYBVB4uGElQ5EmYDdmfD07p6VszSKw0QjWX+FMiYDsI ppUS0TyIZIG0TNrNAw44AA8MPWWQwQ8DjKmdPm36M4sBG4wSZV54XkLWLfOR 4iJDFyzhkJ5NTjpLjbqccJEOv+T3iqOd8LMMXUeIMkISKtByTS0y9SPTExfg yBVG9Tn0qHg7dMNACgQEAMMQGcCAlAJljkjWAQbEOZqUCyA5gg8kUiSbpTIo ZFZeLvEzaV9FKCENRjcYwUGRKiSBGSYJamPADr9FEMEJH+QlzKPAfrwZpxtU +sENJd+ApEubcPpXNzsYkYIRMMCQwZg2i7jMAXYFIaVZ/jfw8C8uG/CXQ5QI J4SrlSdo2lfLRXCL0A0b4ceBDAbkcCA2k3bmWwkYG5HkCL39BdA2ZmsN0Mjz zXfRCRmRKFPZ2gR7gAk6pDCzAAnYAN1lOYRinirlXWQaDyh3MKKtQVDJ1b0b g/sZs9qkolU0DuTHYxKsXbLDgZNu4AyPEeRgsiuXEKy1P2fbolXlMUAog9jK CLS6Njt8kwLeID5QYQ4oKGceabx0hTIPHmypC2rEOx6WRFv/U5YpDGpUJAcR bHClU09qLYNvGHNwRNhY0joV2RProBWOPdDXSoErCwRT5wcEkfuYZD4g4sZS RvOBCBcsIA0eSGMVsTOABy4i/oJdXGQVSWJJ82KSjVHkYhQMw1gEOpAXiJ3O L68ygAUxtgFoQOwpEAyMNjbGIJON4l5YklH83jMQH+hAB4yojCOQ8ADToOUq PATgWVB2Lx0YQQUXqRIrUJaXRl0NghE5gI1IowodYC4CKEjiBxwQsQO8agQO UEHD8IOCsMGLczHhxnhIoYtooOIDF9CXS/yCrc/swAP0s8kAbAiBB/TgRWxM zwLq9EcutiUHcfojQwwpxhhJBEEUKQj/gIEfKNxLAuJ7VexkIAEMWE+TJBiB BGTggdP9KnUEM4AogoAK+sQOBbA43V9eObdaGGCGSREAOfDRAwmsAhoLfJAM eICn/moMSYsyFMX/rjKCGQhDT61hFkUqIoETXOAXm5wBJUGAl5KNAJkxMIn1 ItCAG0hzBCoogp6ygRxZxEmAqVAIGz8QDGVohlWRu50HGGACRzDCZgVwwB7/ NwK0QIghrshTjD7xAgb4zncecMAGsAcRzk0ME/UyGQ8CFYHwgeAEnlTI/15X HyTgRwUsiACdjMdMYEmkZbGxVL821ihzWoNGqDPRBkxgBAhAQgG2dEQBdNCD HpzAbUhrxYjC0rLO/Q0AXPKACzyAhJMEI1xwREAOnnCRGciGB1HFTwQ2+jrT 5CUGpxmBCDyAnwawoAQemM0HNrE9EyLAB6XggRJ6sBqG/uxFmKozDjfI8gQT 5HNMd5yEIyDg0eUALAZgkSeCatE5AHhKAOxAQgmo2Yw2xUSL9WHQt4BxhAte QJpoEUE77xKDDViPBSpowAMilJChtWaUBzJPEECwMbQo0ZzlS93c/JGDFJgA BgIorC0HQATtDIEV0bzKBTZgUGyl7m8meAABBDAEJhyBBRi4LMYymwlvOCAI CHOQ8TiA3ggQAAQdxch5UAGCy7a2BCzABc9ucLzWsKpzO3AAOLiEAhQcDywq OOfEXilLBATWBB4YE093GokQrKACEtjhxl5QDb/CkSz4xG4ASnCEI+AntOmV qm/sMgqNXcAD36QiNtn4IFaY/mYEMSDBWugbgVIgTEpNgasPGPAEBmwgd7kj wMxmZoQObIAE5swEWVgFZW1sgAHX1WcBFlGPABQACdFMIivh+sqV8kMTDHCA Bz7MBO7ih2pryQ+ycovJGBjhCNUjQSuk6aCLxCA422oBME4SASM88XiY8YEB GAAOBpuAyEcOAN5mVgEotGVItwvzP/Ap2ADoFMvagYSmebcACl8gnnKVbrBy sIEHGCECLBDxJj+oyTU7AKYSyAt6rceBD7BXmukRK40JkNYIlEAFE2oTmxCN zzID4G54Q9eR1wUDIyChJZ6Ryko9p2ATOEAclTlVcaHTCEnwjsJ4GpukAOM8 TTC4/gQcWDPGIPnuYwnDVRtTZpsjkISN5mXfqyFraiHJowJXbFwVM0CQTYDP cODt0UdGMgpagrVx/Xal4yqXYIfQUxvytBEuWEQemSCBCZUQOfSc1N9KgPJ3 B0qTwsYctU/XRXgTQAejfecCNGfmh7f2JNbzRkQkjmxFMxoIz4Y0CYaQhA3g gBbkuxZAAmsEbhegEXcEgC0hoOVHJFdVL3jUkxbZV2wcgBms5UBJvQrrCJBg qpjIwe0CvpaWyB3DGPbIRBLltcz+1gc7QDTCH1AuGOCtAjRr+BCMIIFaJykG DqBWQLYm2OumADuddrAtI6GdyrxLYtJV6T988NCH5oC7/s5wM7yBUQISYMZX mvAixvYFE6q2nrUNCAa2K37oMi+6AikgesMjLVDYroRQwQL9cNFx3MvjUcs9 RRUlSAR25LiqIAWhRogve/ojtBsYjlpkM35DbYmZ8fHNoO+wfa41WSDbAQD4 QO4aDgPCp0sC8okQKlAxAlbKCNMdEIcJPlRDj2APh3VHeiMAyaV63hAugOED owFTbCRnKPcLocVya3ZZcjcR2sAM39UxowQVFvN9wzYtgbE1h4Zwi/Z+M0Mq FQABiadDMoYyGkMiORAENzV5BMAOV2YPHocOVpd5NvQALlAJ1VBptdBIoxA2 RiAKQsBix6J9FnQf+DFpXscM/jzCAQn4KKxCFQcQOnnnDb9VCz+2bYzWcBYA AyhwAfNhSHqmMUsAFsT0BCkgAHKIHQHYUzcRbjVEDo6gAFBQYERoVaPxKrnF A2h4ASSQA+1meseyZi2AiJ1gVS/wZ/GEfvBDMVXIWhHgSmaEbA9AZEAgf4QX ADTXItLEAwhhGqKANe6XO2eGLuNwZbXUCAEAAI2wcTWEKkTAFN6QG6LwUNu0 EBdgZlHIiG5GZ9qnAkcwKNZmVXQRDJsgUd4RFb7BWsmoWcBSC8hGZAyXARWA BDcgATpkGiJQMqTQZz3Aio4WAOLAJTYxJrYIAMyHFJnHU5c3BCgQDCoADR6g Ofv2/kclkwNq9wtr5lUsB2I9AjezwIWu94ziR09z0wxM4IUQlBtlRoZHVgGG mBAxADS5IAJ6pgMdUAE6AAPb9oqTFwlkYkN3lB24qHFjchT50AAfgEFJEC0B hRYSEAMoMJDOsEnAgGubVE4LuJCAFn6AgWDdwAwiWAnW8nQVSWS8d2QuUAEg sAoLQR+oMQMoIBp3cy7E5RiOYBNJcUe0qJLQwYO2hB0TwFY2GS2iQDhspAN0 dlmvtmZC+QvU5n2i0yO9MXJilyiA1gnTd08P4H490HuE1wMkoA8ecAvKgVrC uAE6IAGI6WhzuI5ZNxksaUuTcUt6aANqWYsPEGAL8Ekq/mYyexYNJMBu4ONu IxYo1tMxKMIMk3iUsNQXVYhyBVYJxbQxKFAuUTkzHTBtBmWV/3IQIoACIJAC zAYDHjB5jjGaV5aSNwEA7pIdtkiPBxiPEAADINADpvlHEeIgH8Ar7YZemqSI 1MRyJ+GXm/F9Urh68AMsCllgTOBFKkAvouAgApY7dyN4FeA7BpUJG4AjGrMA jmkEIAACvJeZmZkC79hpKallAGAznwkBfCMAP4B535hL/7NDMoYLUABa3aVy xxJvGEBtbTIuztgwyvJb6DQurTdsERAlojBAG8CVuSN/MDBpcfMC+7kBDqUD IFCkM4Mu6DAOVoZHPGiLNVSA/u6ieRBAABUgVBV2FW7zR2nBmnVpevEWWi73 KPJSm6KzL4+XOvLjG2lWFzr0TjcQXD0aaXBjLWInCgswSzOkA1IJKuciAOcy dTbRkgWQdTZUS7eoaRBQAD1gpRFSYaxwF2hhPAOZUSs3YpgzUpBjcmQXcN6w PcxicEFQfjxyBJeyABqjEQAafwRAAl8WS7OANVIjMxLAexXAe2cmADDgGGO5 aXtIi9Qpixp3S0wAnqZ5mju0EjOQBGq3dq52oumZH7KpgLVQhRxYbRTjA08Q GzLQAw+QA8PmNa9yEV02Aw8wQzAAXbP5Gv/wBLM0mSnAnMypjmcGqEjhUy6Z HTxV/o819KsPkHjQgBcM4SB3YQod4JMU+F1sZnrW41AbYGhXA5QYI2A+4ACg dwswNQJYATr46TU5sGe4Jak5IAEP9XARFVdkMUsfcDeEN5LmYgIYNw5cUgCS pYNXRovuOJY2kQB3RASaRwQgUAoBm7F4QVY0thGXpX3qqZ7riWsnUWsnoHj3 4XoYoD95AS1Wm1UBGXClmhd4wQob0AEh2QIoUHdaCD3j9Z/xlwKiSFwE4Io+ NY82EQBRoADB2gi+GgkeYKUqRmvv1AooILXa17QtV4HoFVooYJMfwFEd4FU8 YgT3ojEclRcnIA0zoAQO4BtqpV7h6LWkILKPuCm9dSBxbeh+MLCyvOcAuQoP GKeokaAAtUgmCeCOhqWvmKc3EwCe0ZQkXgshf6STPHmQ7YkfXuNm35ReG+CW SUANr5YD0JAkN+dJ20Iao1CjXoQBpaBLaHEDHfAVLwdZczMpB5ACrNicIzmc ZhYAIeBhgQAAOw== MIME-tools-5.515/testin/sig0000644000175000017500000000030210677325674013557 0ustar dfsdfs ___ _ _ _ _ ___ _ / _ \| '_| | | |/ _ ' / eryq@enteract.com | __/| | | |_| | |_| | \___||_| \__, |\__, |__ This FIRST signature inserted by MIME-tools |___/ |___/ MIME-tools-5.515/testin/mp-msg-rfc822.msg0000644000175000017500000001121210677325674015770 0ustar dfsdfsFrom specht@kulturbox.de Thu Jun 20 08:35:23 1996 Date: Thu, 20 Jun 1996 08:35:17 +0200 From: Juergen Specht Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: multipart/mixed; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de This is a multi-part message in MIME format. --------------70522FC73543 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit -- Juergen Specht - KULTURBOX --------------70522FC73543 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D --------------70522FC73543-- MIME-tools-5.515/testin/multi-clen.msg0000644000175000017500000000242710677325674015645 0ustar dfsdfsFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary This is implicitly typed plain ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: text/x-numbers; charset=us-ascii Content-length: 30 123456789 123456789 123456789 --simple boundary Content-type: text/x-alphabet; charset=us-ascii Content-length: 600 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 ABCDEFGHIJKLMNOPQRSTUVWXYZ012 --simple boundary-- This is the epilogue. It is also to be ignored. MIME-tools-5.515/testin/x-gzip64.msg0000644000175000017500000000077510677325674015170 0ustar dfsdfsContent-Type: text/plain; name=".signature" Content-Disposition: inline; filename=".signature" Content-Transfer-Encoding: x-gzip64 Mime-Version: 1.0 X-Mailer: MIME-tools 3.204 (ME 3.204 ) Subject: Testing! Content-Length: 281 H4sIAJ+A5jIAA0VPTWvDMAy9+1e8nbpCsS877bRS1vayXdJDDwURbJEEEqez VdKC6W+fnQ0iwdN7ktAHQEQAzV7irAv9DI8fvHLGD/bCobai7TisFUyuXxJW lDB70aucxfHWtBxRnc4bfG+rrTmMztXBobrWlrHvu6YV7LwErVLZZP4n0IJA K3J9N2aaJj3YqD2LeZYzFC75tlTaCtsg/SGRwmJZklnI1wOxa3wtt8Dgu2V2 EdIyAudnBvaOHd7Qd57ji/oFWju6Pg4BAAA= MIME-tools-5.515/testin/multi-igor2.msg0000644000175000017500000002451410677325674015747 0ustar dfsdfsDate: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Makefile Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFy aWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBl cmw1IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZl IGVudGlyZSBwYXRoKToNClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJv YmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlc2UuLi4NCk1PRFMgICAg ICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2VyLnBtIEJh c2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0K DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJnZXRz OiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3Rv dXQvKg0KDQp0ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0K Iwkke1BFUkw1fSBNSU1FL0hlYWQucG0gICA8IHRlc3Rpbi9maXJzdC5oZHIg ICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hvICJURVNUSU5HIERl Y29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQoj CUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQ RVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0aW4vc2ltcGxlLm1zZyAgICAg ID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRFU1RJTkcgUGFy c2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNl ci5wbSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNl ci5tLm91dA0KCUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVz dGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0 aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4ub3V0DQoJ QGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RV TEUqLm91dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRp dCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZpbGUiOyBleGl0IC0xOyBc DQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRFX1BF Ukx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNo b3VsZCB5b3UgYmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAg ICAgICAgIA0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9L01JTUUgXTsgdGhl biBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1FOyBcDQogICAgICAg IGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBv bmx5Li4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1MX0ZMQUdTID0g LS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAg ICAgICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1J TUUNCg0KLlNVRkZJWEVTOiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdl bmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkgaXMgb25seSBiZWNhdXNlIDEu OCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50ZWQJDQoJ VkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRW RVJTSU9OIDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04u dGd6ICR7SE9NRX0vcHVibGljX2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDog JHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoNCglwb2QyaHRtbCAke1BP RDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQktLWlu ZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0K ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: test message TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3 aG9yZmluQHlveW9keW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5l LmNvbT4NClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQgbXVsdGlwYXJ0IGV4 YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KICAgICBi b3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2Yg dGhlIG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRo YXQgdW5kZXJzdGFuZCBtdWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3Jl IHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyB0ZXh0 LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcgdG8gYSBt YWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkg ZGlzcGxheSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFy eS0xDQoNClBhcnQgMSBvZiB0aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRo YXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1lYW5zDQpubyBoZWFkZXIg ZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGggY2hh cnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRo IGV4cGxpY2l0IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11 bmlxdWUtYm91bmRhcnktMQ0KQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUgb3V0ZXIgbWVzc2Fn ZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxp Y2l0DQp0eXBpbmcgb2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRh cnktMQ0KU3ViamVjdDogUGFydCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlz IG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3BhcmFsbGVs Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1s aW5lIHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2Uu DQotLXVuaXF1ZS1ib3VuZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dp Zg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQpDb250ZW50 LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21wcmVzcy5n aWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMg YSBHSUYsICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFB QUFBQUFBQWdCNlEveTlQVDI1dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQ LzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtBQW9BQUFFL2hESlNhdTll SkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpvRkNZ NDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNj c3h0OWM0SGdYeFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdH Z29NSGhZY2tpV1Z1UjMrT1RnQ0dlWlJzbG90d2dKMmxuWWlnZlpkVGpRVUxy N0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJldFFOOHQ4SWp1cnkr d010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpF QmVCbDZhZmdDc09CckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhC WlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1Z3pPVTdtemhCUGlTWjV1RE5uQTdi L2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4bHdjUjE3WXNX TXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRl bnQtVHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n OiBiYXNlNjQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5h bWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQYXJ0IDIgb2YgdGhlIGlubmVy IG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0KDQpSMGxH T0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8v K2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFv QUFBRS9oREpTYXU5ZUpiTU95NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQx b1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGprdm1zUW11OG9jL0tCVVNW V2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RDZVJS amZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNU QUtHaWFhU2Zwd0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJn QXhzVzR2RmFidjhCT3RCc0J0N2NHdndDSVQ5bk95TkVJeHVDNHpycUt6YzlY Yk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5hNnIyYmhLUVhOMTdG WUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUt Ym91bmRhcnktMi0tDQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11 bHRpcGFydCBtZXNzYWdlLg0KDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQpDb250 ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8Ym9sZD5wYXJ0 IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBk ZWZpbmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3Qg aXQgPGJpZ2dlcj48YmlnZ2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoN Ci0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9y ZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpUbzogKGFk ZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91 dGVyIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29u dGVudC1UeXBlOiBUZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNv bnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1wcmludGFibGUNCg0K UGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBSRkM4 MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBl cGlsb2d1ZSBmb3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo= ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: out from parser KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCkNvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVk DQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQg bXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250 ZW50LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC9tc2ctMzUzOC0xLmRvYw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0 ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAuL3Rlc3RvdXQvbXNnLTM1Mzgt Mi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L3Bh cmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFy dCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBO dW0tcGFydHM6IDINCiAgICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGlt YWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1jb21w cmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBpbm5l ciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAg ICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAg ICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1leWUuZ2lmDQogICAgICAgIFN1 YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2FnZSBpcyBhbm90aGVy IEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0K ---490585488-806670346-834061839=:2195-- MIME-tools-5.515/testin/third.hdr0000644000175000017500000000125310677325674014671 0ustar dfsdfsFrom eryq@rhine.gsfc.nasa.gov Thu Dec 21 16:34:23 1995 Path: news.clark.net!rahul.net!a2i!bug.rahul.net!a2i!olivea!decwrl!lll-winken.llnl.gov!simtel!news.sprintlink.net!news.ais.net!usenet From: "Josh E. Schneider" Newsgroups: comp.infosystems.www.authoring.cgi Subject: EMPLOYEMENT: CHICAGO, IL UNIX/CGI/WEB/DBASE Date: 7 Oct 1995 17:27:44 GMT Organization: American Information Systems, Inc. Lines: 33 Message-ID: <456dag$jc2@news.ais.net> NNTP-Posting-Host: www.ama.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 1.1N (X11; I; Linux 1.2.8 i586) X-URL: news:comp.infosystems.www.authoring.cgi MIME-tools-5.515/testin/second.hdr0000644000175000017500000000116410677325674015033 0ustar dfsdfsPath: news.clark.net!rahul.net!a2i!bug.rahul.net!a2i!olivea!decwrl!lll-winken.llnl.gov!simtel!news.sprintlink.net!news.ais.net!usenet From: "Josh E. Schneider" Newsgroups: comp.infosystems.www.authoring.cgi Subject: EMPLOYEMENT: CHICAGO, IL UNIX/CGI/WEB/DBASE Date: 7 Oct 1995 17:27:44 GMT Organization: American Information Systems, Inc. Lines: 33 Message-ID: <456dag$jc2@news.ais.net> NNTP-Posting-Host: www.ama.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 1.1N (X11; I; Linux 1.2.8 i586) X-URL: news:comp.infosystems.www.authoring.cgi MIME-tools-5.515/testin/multi-nested3.msg0000644000175000017500000000617410677325674016274 0ustar dfsdfsMIME-Version: 1.0 From: Lord John Whorfin To: Subject: A complex nested multipart example Content-Type: multipart/mixed; boundary=unique-boundary-1 The preamble of the outer multipart message. Mail readers that understand multipart format should ignore this preamble. If you are reading this text, you might want to consider changing to a mail reader that understands how to properly display multipart messages. --unique-boundary-1 Part 1 of the outer message. [Note that the preceding blank line means no header fields were given and this is text, with charset US ASCII. It could have been done with explicit typing as in the next part.] --unique-boundary-1 Content-type: text/plain; charset=US-ASCII Part 2 of the outer message. This could have been part of the previous part, but illustrates explicit versus implicit typing of body parts. --unique-boundary-1 Subject: Part 3 of the outer message is multipart! Content-Type: multipart/parallel; boundary=unique-boundary-2 A one-line preamble for the inner multipart message. --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-vise.gif" Subject: Part 1 of the inner message is a GIF, "3d-vise.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --unique-boundary-2 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-eye.gif" Subject: Part 2 of the inner message is another GIF, "3d-eye.gif" R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --unique-boundary-2-- The epilogue for the inner multipart message. --unique-boundary-1 Content-type: text/richtext This is part 4 of the outer message as defined in RFC1341 Isn't it cool? --unique-boundary-1 Content-Type: message/rfc822; name="nice.name"; From: (mailbox in US-ASCII) To: (address in US-ASCII) Subject: Part 5 of the outer message is itself an RFC822 message! Content-Type: Text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: Quoted-printable Part 5 of the outer message is itself an RFC822 message! --unique-boundary-1-- The epilogue for the outer message. MIME-tools-5.515/testin/words.txt0000644000175000017500000000223010732516507014740 0ustar dfsdfsGOOD "Subject: Oc\xE9 3165 Network Copier down for maintenance" Subject: =?ISO-8859-1?Q?Oc=E9_3165_Network_Copier_down_for_maintenance?= BAD "" Subject: =?ISO-8859-1?Q?Oc=E9_3165_Network_Copier_down_for_maintenance? BAD "" Subject: =?ISO-8859-1?Q?Oc=E9_3165_Network_Copier_down_for_maintenance GOOD "Keith Moore " =?US-ASCII?Q?Keith_Moore?= GOOD "Keld J\xF8rn Simonsen " =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= GOOD "Andr\xE9 (<- one space) Pirard " =?ISO-8859-1?Q?Andr=E9_?=(<- one space) Pirard GOOD "Andr\xE9 (<- two spaces) Pirard " =?ISO-8859-1?Q?Andr=E9_?= (<- two spaces) Pirard GOOD "If you can read this you understand the example... cool!" =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?==?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?==?US-ASCII?Q?.._cool!?= GOOD "If you can read this you understand the example... cool!" =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= =?US-ASCII?Q?.._cool!?= GOOD "_-_" =?ISO-8859-1?Q?=5F-=5F?= MIME-tools-5.515/testin/up.gif.uu0000644000175000017500000000026110677325674014621 0ustar dfsdfsbegin 644 up.gif M1TE&.#=A$P`3`*$``/___P```("`@,#`P"P`````$P`3```"1X2/F<'MSTQ0 M%(@)YMB\;W%)@$<.(*:5W2F2@<=F8]>LH4P[7)P.T&NZI7Z,(&JF^@B121Y3 4Y4SNEJ"J]8JZ:JTH(K$"/A0``#L` ` end MIME-tools-5.515/testin/sig30000644000175000017500000000030310677325674013643 0ustar dfsdfs ___ _ _ _ _ ___ _ / _ \| '_| | | |/ _ ' / eryq@enteract.com | __/| | | |_| | |_| | \___||_| \__, |\__, |__ This THIRD signature inserted by MIME-tools |___/ |___/ MIME-tools-5.515/testin/multi-2gifs.msg0000644000175000017500000000443210677325674015734 0ustar dfsdfsReturn-Path: eryq@rhine.gsfc.nasa.gov Sender: john-bigboote Date: Thu, 11 Apr 1996 01:10:30 -0500 From: Eryq Organization: Yoyodyne Propulsion Systems X-Mailer: Mozilla 2.0 (X11; I; Linux 1.1.18 i486) MIME-Version: 1.0 To: john-bigboote@eryq.pr.mcs.net Subject: Two images for you... Content-Type: multipart/mixed; boundary="------------299A70B339B65A93542D2AE" This is a multi-part message in MIME format. --------------299A70B339B65A93542D2AE Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit When unpacked, this message should produce two GIF files: * The 1st should be called "3d-compress.gif" * The 2nd should be called "3d-eye.gif" Different ways of specifying the filenames have been used. -- ____ __ / __/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) / __/ _/ / / , / Hughes STX Corporation, NASA/Goddard /___/_/ \ /\ /___ /_/ /_____/ http://selsvr.stx.com/~eryq/ --------------299A70B339B65A93542D2AE Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="3d-compress.gif" R0lGODdhKAAoAOMAAAAAAAAAgB6Q/y9PT25ubnCAkKBSLb6+vufn5/Xes/+lAP/6zQAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJLMOyYbcoxkaZ5oCkoH6L5wLMfiWqd4btZhmxbA oFCY47EIqMJgyWw2ATjj7aRkAq5YwDMl9VGtKO0SiuoiTVlscsxt9c4HgXxUIA0EAVOVfDKT 8Hl1B3kDAYYle202XnGGgoMHhYckiWVuR3+OTgCGeZRslotwgJ2lnYigfZdTjQULr7ALBZN0 qTurjHgLKAu0B5Wqopm7J72etQN8t8Ijury+wMtvw8/Hv7Ylfs0BxCbGqMmK0yOOQ0GTCgrR 2bhwJGlXJQYG6mMKoeNoWSbzCWIACe5JwxQm3AkDAbUAQCiQhDZEBeBl6afgCsOBrD45edIv QceGWSMevpOYhl6CkydBHhBZQmGKjihVshypjB9ClAHZMTugzOU7mzhBPiSZ5uDNnA7b/aTZ 0mhMnfl0pDBFa6bUElSPWb0qtYuHrxlwcR17YsWMs2jTql3LFkQEADs= --------------299A70B339B65A93542D2AE Content-Type: image/gif; name="3d-eye.gif" Content-Transfer-Encoding: base64 R0lGODdhKAAoAPMAAAAAAAAAzN3u/76+voiIiG5ubszd7v///+fn5wAAAAAAAAAAAAAAAAAA AAAAAAAAACwAAAAAKAAoAAAE/hDJSau9eJbMOy4bMoxkaZ5oCkoD6L5wLMfiWns41oZt7lM7 VujnC96IRVsPWQE4nxPjkvmsQmu8oc/KBUSVWk7XepGGLeNrxoxJO1MjILjthg/kWXQ6wO/7 +3dCeRRjfAKHiImJAV+DCF0BiW5VAo1CElaRh5NjlkeYmpyTgpcTAKGiaaSfpwKpVQaxVatL rU8GaQdOBAQAB7+yXliXTrgAxsW4vFabv8BOtBsBt7cGvwCIT9nOyNEIxuC4zrqKzc9XbODJ vs7Y5ewH3d7Fxe3jB4rj8t6PuNa6r2bhKQXN17FYCBMqTGiBzSNhx5g0nEMhlsSJjiRYvDjw E0cdGxQ/gswosoKUkmuU2FnJcsSKGTBjypxJsyaICAA7 --------------299A70B339B65A93542D2AE-- MIME-tools-5.515/testin/phil2.b640000644000175000017500000000033410677325674014412 0ustar dfsdfsFitQnSUoXL0OZhJ0Oc0OoRGuWAABkM1lJFahDqEOirdQh1CHVqihWoQ6hDoh E0WLEBKFNOoQ6xQgNQoQ6hDqFC5bSLlCHUK0LrFihDqEMWqhWoQ6hDqEOqKE Ok6KFC5YoUJ1vVQh1CHUK1CHUK06hCqF1ihDqFahDqFadQtmqhWsUJ0YQGoX KFCtFqhWsUIdQiNcsAABkM9iFlE6SINXROrR MIME-tools-5.515/testin/multi-simple.msg0000644000175000017500000000117510677325674016214 0ustar dfsdfsFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample message MIME-Version: 1.0 Content-type: multipart/mixed; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary This is implicitly typed plain ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: text/plain; charset=us-ascii This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. MIME-tools-5.515/testin/intl.msg0000644000175000017500000000063610677325674014542 0ustar dfsdfsFrom: =?US-ASCII?Q?Keith_Moore?= To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= CC: =?ISO-8859-1?Q?Andr=E9_?= Pirard BCC: =?ISO-8859-1?Q?Patrik_F=E4ltstr=F6m?= Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= =?US-ASCII?Q?.._so,_cool!?= Content-type: text/plain How's this? MIME-tools-5.515/testin/mime-sm.gif0000644000175000017500000000665510677325674015126 0ustar dfsdfsGIF87a``÷###'//3#$55577:::;%&??? B:;C&)G GGGJJ:;OO R:;S%'VWWZ]____ `57c&(eggg jj moopppquu uuuwy#(  ‚=@ƒ')……uvŠ  ’• •x{™™™š š>AŸ   ¥ ¥wy¬ ­wy° °°°µ µxz¸°°º »:A¿ ÀvzÂÂÂȱ²Ëuzб²Û°²ëëëPÜ=öõÿÿ¿¿Ä²²‰PPÈpˆôÿ¿\pˆõÿ¿L€¨¨ƒ//PPl€ö€ßÿ¿ô@¼€P”°ß>ˆL¨ /€ |ˆöôÿÿ¿¿¸ö²ÿ¿P­ü(ùˆ\ÌŒAõÿ¿ ª ,¨Œ÷/ôÿÿ¿P¿ € (ä÷€Yÿ,”Ø÷ßùÿÿ¿¿Œ ÷ÿ¿è/öÿ¿ì ,õÿ1 (Pذù`ÔØõùÿÿ¿¿`üöÿ¿¨/P`0÷Üÿ¿,÷ÿ¿èØöùÿÿ¿¿ÌÔ,õœ¿œ œOver;w˜rit¤e exôi$sôtônõgÿ ¿f@OiµleP ,``þ©H° Áƒ*\Ȱ¡Ã‡#JœH±¢Å‹3jÜȱ£Ç CVü!¢¤É“(Sª\ɲ¥Ë—(, ¦Í›8sêÜɳ§ÏŸ8EÌJ´¨Ñ£;…&|©Ó§Pq‚ ò¤à’4£jEJàfןJvpú€€­6ËUËSÄUKªÂ}’õçYjæM»êÞ¾=äìSÄ“'Rª.Y ·îλ9°E rMÈ“txuqÜ«cצ%@ºæ×Ìi£~Ŭóî]¥OF·ƒÂxÏÞ¾MzB—ðÞmÖõÙg…ßü›¼yîËÏ0 À€ò¿5CÄmB¥s÷Å( þ ]¶+[Òo!?¾½xɦoÂw-Þ}ýÓòë·p–Àüšxö–€T PÞ¥€žzê™Gžæ×_y;©ŸMûe¨ŸdÞ Ÿ·Ûn¤ Еp`ÀàŠéEÑC /ÂØCHf£n(^'€<*°€†@ægÈÙ!!ÄÖ„gÝÅ¶Ä ¤!ÀÞƒ²hå•W©å–˜F%‡(Ø™€ú'#t%€@`–pÂÉåœRI‡ˆÃaKH±„3v 0@Z„’–fœŒ²Hç£üÙi¤(±Œ‰Ùœ’Æ!›‰&Úè¨[@JçxˆBø`˜2¹ÄþKàÐijk¢µ’Ú¨©sÊ&|tõ‚˜Š%« Šè  0;¨ÉêÊ(¯\&;¨pšl.á­¥ßYŠ i&*ilž‹¨´qR»e§è²‰¨4à€ƒöRâ–@€©‚šj#€Ê®œî©À¿‚ * ‹Ù»§¾EìùÀ š€›l‹hÆ ìhÂ>`®Ç最 "!DlöZºDòŒî¿’Šl%ÉR í¿sZ/U8,!¾°.‘Îé–o¨:ì.R`+ÀÚ² ñŸEç`ïö.MŸ|´ƒõ5¨G²>ÀéÜ d-A Þúà­þ1‡íðóšK(¨¯ €ÛînAõ~>c=·ã%Ä*9ßãPÂÏ“g3ylF]⼦×3à ?~wß8P.ñɺ­uЀ¯ ˆ\ƒmƒN'DÀ $Éšþx •§^üåœnÊ)£Ë.p‡¯©èZ6.üÜÄW®ºß¥ü¯ðª=êMYrIDz‹W½àŸ®}ñüÛ€àC;wœÎ.¾z¿ðÛÿ¿qB»‚Ä;Å=ŠSÀ_ý$€?÷Il{–{œòF>屯sêùœÈ‚d@SqŠ‚D`Á²÷ÀãI`sí[^Á*È¿èmPCÔ3•&ȾrŠ„ö‚à 8åúµ¯‡þè!5À¿ô aÓP ÒG@"Ä CôGP úpÅ£ p0‚ËIQŠíKa%PÄ-|°}¤Ò÷s>­q†'\á ¶E{I‚%˜ãOxB8~±ŒCáG0-ó•o?íÓ#G°Å”6Øâ èç>RÒŠVœ¡•”PÃDÒO XÒR °´Æü`’’õ›a pƒUÂ@‹ö‚Áç8ÃAÖòJw¬áA¹3†H³œå¥(Ë‚IL˜` fÁ@N1Žì;d†LeR–\td-a ËZbRŠ `%GD8)“áü"/¤DRniŠÞŒ"I@Ì;r±˜ŠþÌg¥È¨sÚRŠëŒ¡~~ùNhZó‹\.—ܨ,S@Ôz‪0¸‚QÊ3|ñ£6"VÓÅa&“©_ÄfMºÕ‰"ÕE«5cZC¦f“‹vdå=ÙºÕ·š›K=hEH?,â ¬ŒÜb$[)ÅÅ2¡­~µ€^G`V†’Ü”¥€øÁb³ŽÇÄ«h Y¿ÒT¯•kd1ù(¼ì5ÒŽu,þf1qPZ¤:²x¸­*Dç¾ìU6–•[åaíÅѾ¾•›¸•ØoW Å ÀqŒ -^t‹—Óµù5¹É]-kçFRµÑ­®ÎÞzìâ6ÏÞÌ‹ÝßBÁº»³ï4$ƒÔþV¹öb®¯ç]öï½Ò²èÎ7'·êÇ¿©Ý®ð2€`ó²Ë^( ,ÙÇrŒ)Þ…“ `]AÁïÍOt¾'xÃö*AS(8ãV_ ŽÚœ,bý”ÅÈcS­jØÝ}Æ/.žŒ¹ÄÕüÜxÃ9þY³Øäb àlöªØ“íå°ùà^1ËŠ¸« r ¾ÓnñU9½áË[-ÀZþ†÷èb°ñ«hI#³½$‡e`aE. ‰‹œŸäâ+V}kÕüÕ0>*ÊÅ2+Úœï+97ºhKXQî C>÷™Ì€þ3¦‹‡‚Ÿ1 [Ù„P!PáÊBðÁŸJjo•ZÐH¸sÓ£„Z×¥û±‚zVjK}«Ê8ÀT«…à²'¼Lie#ÃF±X9iÓ\‹¤!m¥ƒênE+µÀ è«È ff òJǹîêK\d–Ygн˜¤Í™Aý£43äq=¡h÷¸ -6Î ds Rý*L Ü[ÆÔ¥–@…{¦ êA@q:G•jé¢A,¥ê`ÇÊe2#ø¸þ<†³Z€Uá^LÈe3&1±Üœ6Ŷ–ÄôzÓ™Ûžñ¹Óä&ˆÑÓv¹Í…¾˜8Åœ§Âøgjž)•³Ü3ã:Ôx e–$@;õvÙ’Ð' ÈëNjBl´§’V7Ì@ºÂ‹°˜%‘z;‡áúÖñý§ ˆVQT®/Ïxè€t—¹Dwª¸.z25ÔË4¡3‘}ºËcSs'ý1ƒ¿8Í[îwÑy "ð”¯l‚Ľí‹ILl”ä$ªÌfI,‡ýô¤ˆ]@\ìC„zÝwGìB˜Õˆp¦ö@¾éLç|ç—Ntj‰XW±¼w¨"ÖwGf¡MñIþêå7ýûà§¼bzõABM2~8v¨$Õ—„q©—zTÁÑç€Qr‘…RP}T‘K7!„1 ŠarÁÒ÷ê׃;(~\8&Y8‚È…mH‡ŽQ¸Ô·‡­—~88‚1hx|ˆeè‚!œœñ†cxˆ€ˆ9ASAªG}[ˆ…|r‰ª·…’x•8\X‰Q}(‰]H} h‡A‡oAq‡(haA‡f(‡¨H‹.ø ˆQˆ{háŠb˜ˆ‹(Œq‹e(‹ ‹Œ7‹ŠŒX‰¡‰"ÌHؘ@AÚØÞøŠßŽÙ¸>äXŽæxŽè˜Žê87âØŽØ;MIME-tools-5.515/testin/phil.bin0000644000175000017500000000024210677325674014503 0ustar dfsdfs+P%(\½ft9Í¡®XÍe$V¡¡Š·P‡P‡V¨¡Z„:„:!E‹…4êë 5 êê.[H¹BB´.±b„:„1j¡Z„:„:„:¢„:NŠ.X¡Bu½T!Ô!Ô+P‡P­:„*…Ö(C¨V¡¡Zu fª¬P@j(P­¨V±BB#\°ÏbQ:HƒWDêÑMIME-tools-5.515/testin/andreas-1296.uu0000644000175000017500000002032510677325674015450 0ustar dfsdfsbegin 600 MP.fails.for.this M4F5C96EV960Z(&9R;VT@=7)I96QA+FEN+6)E2!A;FYA+FEN M+6)E2!F MBYW=RY452U"97)L:6XN1$4@*#@N-RXS+S@N-RXS*2!I9"!804$P,3BYW=RY452U"97)L:6XN1$4^ M"E)EBY452U"97)L M:6XN1$4@*&UA:6QG>G)Z+E15+4)EBYW=RY452U"97)L M:6XN1$4^.R!3=6XL(#(R($1E8R`Q.3DV(#(S.C(T.C,R("LP,3`P("A#150I M"E)E8V5I=F5D.B!FG)Z+E15+4)E MBYW=RYT=2UB M97)L:6XN9&4*1G)O;3H@36%I;"!!9&UI;FES=')A=&]R(#Q0;W-T;6%S=&5R M0&-H86QL96YG92YU7-T96T@17)R;W(@+2!2971U&5D M.R!";W5N9&%R>3TB/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]7R!?/2`* M("`@("`@("`@("`@("`R,C@S-C,P*#$V,C,U*2(*0V]N=&5N="U47!E M.B!T97AT+W!L86EN.R!C:&%R2!P2!A="`O<&%G97,O M<&YE="]A9&UI;B]M86EL7W!R;V,N<&P@;&EN92`Y-BP@/#X@;&EN92`Y,RX* M("`@("`@("`@($)R;VME;B!P:7!E"B`@("`@"B`@("`@5&AE('!R;V=R86T@ M(B]P86=EG)Z+E0N,#8Q.C(R+C$R+CDV+C(R+C(T+C(Q(D!452U"97)L:6XN M1$4^"@I296-E:79E9#H@9G)O;2!FBYW=RY452U"97)L:6XN1$4@*%LQ M,S`N,30Y+C(P,"XU,5TI(`H@("`@("`@("`@8GD@8VAA;&QE;F=E+G5S8V]M M+F-O;2`H3F5TBY452U"97)L:6XN1$4@ M6S$S,"XQ-#DN-"XQ,%TI(`H@("`@("`@("`@8GD@9G)A;GHN=WBYW=RYT=2UB97)L:6XN9&4*26XM6]U7,@86=O.@H*1&%T93H@1G)I+"`V($1E8R`Q.3DV M(#$U.C0W.C4Q("LP,3`P"E1O.B!MBYW=RYT=2UB97)L M:6XN9&4*4W5B:F5C=#H@2&]W(%1O(%5N6]U+"!AV-C8WM: M8Z5"X1C:Y1:ZU2WM[>Y1S[UC>XQ[ M>YQS>[5K>[UCE)Q[>X2$A+UKA)Q[E*5[>[UKC*5[A*5[E)R$>[USC*5[G-YC MC(R,C*U[G*6$A,YKE+U[C*V$A+5[G,YSC*V$C+5[I=YKE)24E*V,C+6$I;V$ MI;6,C+6,E-9[G+V,C*V4C+V,E-Y[E-Y[G)R>$I;V^,I:VM MK<:EI>4O>^4M=:EI=:EK>>>EK?>>EM=ZMK>>EO=ZMM>^EK?^^EO?^MK>>MM>^ESO>EO?^E MO>^MO?^EQN>UM?^ESO>MQL;&QN^UM=Z]M>^UO?^MO?>UO>>]O>^]O?^USO^U MQO>]O<[.SN?&O?>]QO^]QO^]SO?&QO^]WO?&SM;6UO_&QO_&SO_&WO_&Y__. MSN_6SO_.UM[>WO_.WO_6UO_6WO_6Y^?GY__>WO_>Y__GWO_GY__G[__G]^_O M[__O[_?W]__W]__W_____RP`````6P!P``<(_P#_"1Q(L*#!@P@3*ES(L*'# MAQ`C2IQ(L:+%BQ@S:I08J:-'2"!#BAP9DI')1(12JES)LF6@ES!C^IE)L^9, M/3ASZE2XH:?/GAB"8KA`M"B%HT@A*(7PH('3IU`;*)BJ(('5JPBR:M5ZH&N! MKV#!$AA+8(#9LSQ__A0ZM"A1I$F7-HT:E6K5JUBW379 MU["/(]_0V3-SN:,=/_^&[/MW];YCL6>/C;S[7]U66H(+\-6C;;?&%)R%>U)U7 M@$(C*(CA=H9YQR&$$4;76XA]D5BBB?NAJ-Q[<.76HHL@9I5`!M.9=Z",,]*H M77LW(I9CA]#Q:)4-9#22R2:*".+"9'P1.4*1-&;8X'?./4?78PM$T8@K=4A1 M@P4U,*$($WN-F!`)6]9I9'9>!E7;BBQZJ(`5I6RBA@B1I7"(!7LI1`*==7+9 MI8UZJKADGXV]4`HQ9U@@759()+'5`8HNVJBC)N89J9*3BMG``W8\H\@,]('_ MB$,3>H6Z**-VWKG@9AJ"&:!3+\CBRA/B.6F5!F_4FM`)MXK:J*Z[$M8K@`%: M$4TC)M05JU6'*(O0"$>01)`(*@1NNN,_J M:NJ>H+VP##'$RL=;!F/D5:^]]SJ;ZYW[2GH4$>2$,!DDTBD`)G&&W,\*K0-NV4'.89XH-C)8RKP!*%XL8QPPAV3 M6RZ#21HB#AO4JDJ:&!D0F(#//[O\,L.0ZHG*-EB@FZK2#5R`!7T*L?!SU%)[ M_#'1&,BRC1(X/DAQ`Q'H@(48+@Q85=ABC]WRK5-3_[U=*MP4P>^DO]90BSWW MW*.+!G;CS<(*>MM;]I8P(W=U$>?ZVI0&M'S#3C_WL+/*`DY-Y3@+>4?.<="5 MJW6U$?V%[."#7[3B2S7L?).-+STCL$@#;Q81_K@P<`&RB,=QV!@.Q3X"S2` M8%IP:8(02C`$(0AA""5(P/\0(L`2IDYUXH*!';"A0/4UL('O4$<$7SC!=8`# M$!>47?0\4`49J."'*G!`5/_J94(!@@^%BWJ#-<[1PG:\,![Q>$<^@@'%>-!0 M@>C`QAF^!!B`$(>XK!.LH(@!)"`)@'"*;IP#'2U\(3SBD0YYS*** M5KSB.LX!CD_D`'IPT4(*(L`DC9T1C2?\612@X48FQI&&\CC&._`HQQJB@X_4 M4`(@*:"#)$CO5SY#9"+!E09&@N.-"EQ@`]NA#F2L@Y*53.4YSM$-:H3A2V(0 MP=8:`+5#HA%A>8"&-;HQ#E0^$A[M(`@P0;_X$`*?&(* MU,PH2E(F`QK:(*8QT^=$>&Q#&N!H9B6?&8H99O@$F47 M@*'_#&J$LYCC5!\WEH$-==*0G;.4IC:@`0Q-L@4'1T!57/`)+E\*T`FX``8T M_-F-4XYS'=R0QC#*6<55KB^5T$QH-Q::C%/H('9DT(##D*(H`EJ4!3$812TT MRE%P`!2.ZPB'-&SAQ'C0XQ[XN$<]Z(%,E&)QEN-0*#24`8Q+A(`[.V#"821* M@5`1\`0"Y`,M=KI1:X33HV\4QS-F<0XGU@,?_A#(/N[!5*=>4J7:>"=5:3&& MGIS!`YF#BZV^BKH=T&*L_!1F.#LZRW,TPQ8L;`<]\%&0?-0#'JE$QUWYV(V5 MZA48M/`$"(QPA!1)RE:+LBD@8G'8Q%+#K)T]93.:P0LX_\*C'OTP"#[B`LEQB'>\U@BN<`^KBDY<05KGTM)R$=:"3IC"%*I@K72_6=9BA((: ML06'=N-QCWV8>!]UY:,TQTM>:$`C&<`X;RQ,P0E$\"I)6AK!A,'E!$YXXL+0 MC2XP.$R,69Q"&TB.+1/+*<$]KGBE>4VPBV$,6O326!(^N+%R7C.J'<>!$YRP M<'V%#(Q>%.,0U'BM61?KT_!"=?_%2(ZR@I5!Y<.N0A6>X,0CFH`V/6%G7,L] M!)C#C&'61G<8R`"$,EQ<5FNL.JZ:?+MX*! M)"9Q"3#_.,.TR$4Q*)$+?BZ:T1M-% M0%T$21A;$J8N]"YF<0E<2U<9K[:UM%T,;6?7XM*9SC,G)%$(.,PO0\/NLA*. M;>QDLZ(8=3CL3IT-#&%`&]KN?KNNM\2M?5A=WYG7^O;U'[%YG_J`1]5V%HB-?"%\#PA#T97:%W&'QN\!Y7M0>++]3M^5/_?RE=?YA3W!]8P_0O!T<`,8JN`"(Y7= M(OQ(O>I7S_K6N_[UL(?]1A32>GW$_O:XSST_9D][U=M>]ZLO"/!?S_O>\^/W MPU_(\%5?_(',0Q\$\?WR$<(/=\SC^0))OD4&P8#N>]_[CG!'__2/O_S=%\08 M/!```-8?`!08XQ_`OT@;UD__^FO"_`,A__3S3X7Z&Z#^2X!\L8<1Y@`*!FB` MFA```,``YF`0YB=[^<=\V<<#Z\+!^CE`0 MW@`*FG"!U]=Z_U"`FJ`)&)AZ`U$&ZX<'$9AZMZ"`K]!ZT_""H`!]PG=]/9B" M0.@0\Z"`/#`/`^$.*%!_`!`$WA"#J><.%%A_/.`-0.@."K@%XZ=Z\V!]7F@, M'%!_`4`%^*'MQ"#YI"'=^B' MM[![(R@`^'=[\_`*"FB'>+A^%0!]_/]P@G7(`#S``.O'`&V($-.P?EOP@)3( M`=XP$--0`0#``<9@>Z*(`MZ@>MXPAA6`@11(!=D'?_`7@O"G#].@?CQ@#JIW MBT_8@L:`B^(G$(Z`BPPABA7PB0*A"788C,ZG?GC@#LIHB06A#_\W"/PPAGC@ MA>ZPC=RXC>;PA?V'`LRW>[>P?FG8?QP0@OPP@@#0@`GA""1($$$``#SP@O;X M@C0``#3@#?,8!/=HC_G(`_S0A&6@>J_@A/77!N9`B5OPCYK@")0X"+=`B53@ M"/\(D0`P"`FA#[BHA`,QA@A9?Q5@#B`9DA7(#V](`[]7CB;Y"MY@DO6W!0<) MD^M7!@G1?W'_6!!-6`$HL`14\)-`N01M,)`+&`1+<)1(>91#J8P!D(K'UXWN MD(;J]X7KQP-'"914<)6O,)-!@)59J968J(FTN`7T.`W,*'QDF8NL%WT<28\" MZ'OSZ('\0(GW1Q#Z,`_F-PW_IPG19PZ7:!!CR`%G*1`L"0K?.!#ZD)6ZF(D` M``K/9WZ)N00QJ(Q/B)>KIP]O*`"ZN(X+Z)'_<)>OX),"\8;2^)E1J0FB>1"@ M```!L(=0.0W3,(\!H)"I9PRG.!"RV08Q.)$`((ZJ-W]P6`:O8`Z:4`9Y&(BI M1XT+N(/\8`YXH(`V^)G_QP"EJ`_>T`;0B1#`&9*TF8^L:0"1Z)GZ_["&`0"> ME6B9JN<(B>B$##`-P=>'ZR<`!I"(2T`0=!B?\[E^L(@0$/E]WF<`=?D/@Y"' M<+@%E\@/;5"'!?J6J3$H-">LSB`.$VQB%([B'7QB" M:!A]*)I_M_""@3@/AQF%U@<*GYB!MNB#[O^H$.7H"%@H$-9'$*"@H`!0`;>@ MA.Q(?V19?PP0`"[*`Z"ZA`!@D_P`"@2ZG!#Z#WJ)`I28C1JXAO07!']IEP'@ MB<^G#VU(@T'0HO-P"Z+H"'YYA*TX#R?8?V4`"N6HD0*A#PH("@,!CZDX"*.8 MJ8?XJ=VWI?^WCW>9@P!Z?>XP@J6)$(@8`$N@@AY9CEP8?:)Z"]`G`.DX$,HH MA_]0`31@?DP9!-E'`PRPI?K(IZ+8K[\8`-"G#^[0?2[Z#R.XGPGAH)0H`&5@ M#@U(`TUI$,[*`^('K_AWD/3ZG,'(`Q6P!83X#UC:!OK@H7]YD&+ZBS0@J=1* MKP3A#A40`&=Z$*__0(F]J@^C.)@"$00&\'X&4`$;"P"O(*D92;(!@`=<^G[* M:`[N(`#Z:A#F$*;_<`L"4)];ZJ%."Y7A"@!ENJ)`.`]CZ`B9&`0\^P_S5Z5! M6X0'6;0"P0$""8_B%P";"+(D"P!MA#*.)SF5XXVR0$,F+#_((D"80`,(+G.A[WQ^N\CCA_#-M]^%>.D_L/ M\&B^`T&!4BH0%%@&OS<-3=A^4PH`Z7N^'2A^U:<)#&``LAM]\\BI!3%_Y9F? MFS@0;4H0Y0BS=UO`#>RB*/F=_R<`J&J^+VF3!(&(=FB>*'#!!G&"FL"X2]@& M61FQ!?$*7SL//_C#;:@/_SN'6_"3@P!]M_"EB.J`@_"36T#"5EK%5GS%6)S% 36KS%7-S%7OS%8!S&8IP1`<$`.P`` ` end MIME-tools-5.515/testin/german.msg0000644000175000017500000000760110677325674015044 0ustar dfsdfsX-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D MIME-tools-5.515/testin/sig-uu.msg0000644000175000017500000000166310677325674015006 0ustar dfsdfsContent-type: text/plain Subject: Here's my UU'ed sig! Well, I don't know much about how these things are output, so here goes... first off, my .sig file: begin 644 .signature M("!?7U\@(%\@7R!?("`@7R`@7U]?(%\@("!%2\*("`@("`@("`@("!\7U]?+R`@("!\ M7U]?7U]?+R!O9B!T:&4@:&]M96QE+Z3Q4C@U3S$I@0XC#J?UFD2]3I.JU5O#+R4CLD4,;IK7I>%[EX[+M\, +C/A\<0=Y^J4)`#L` end Done! MIME-tools-5.515/testin/simple.msgb0000644000175000017500000000067310677325674015230 0ustar dfsdfsI will be taking vacation from Friday, 12/22/95, through 12/26/95. I will be back on Wednesday, 12/27/95. Advance notice: I may take a second stretch of vacation after that, around New Year's. Thanks, ____ __ | _/__________/_/ Eryq (eryq@rhine.gsfc.nasa.gov) | _| _/ | | . | Hughes STX Corporation, NASA/Goddard Space Flight Cntr. |___|_|\_ |_ |___ | | |____/ http://selsvr.stx.com/~eryq/ `-' MIME-tools-5.515/testin/twopart.msg0000644000175000017500000012322510677325674015274 0ustar dfsdfsFrom 0647842285@uk.wowlg.com Wed Jan 12 08:08:13 2005 Return-Path: <0647842285@uk.wowlg.com> Delivered-To: wowlgcard@cpostale.com Received: from WOWLG POSTCARD (unknown [57.67.194.147]) by lbn-int.qualimucho.com (Postfix) with SMTP id B33BE3F06 for ; Wed, 12 Jan 2005 08:08:12 +0100 (CET) MIME-Version: 1.0 From: 0647842285@uk.wowlg.com To: wowlgcard@cpostale.com Message-Id:102.10200000000105 Content-Type: multipart/mixed; boundary="=_wowlgpostcardsender102.10200000000105_=" Date: Wed, 12 Jan 2005 08:08:12 +0100 (CET) This is a multi-part message in MIME format... --=_wowlgpostcardsender102.10200000000105_= Content-Type: text/plain; charset="ISO-8859-1" Content-Disposition: inline Content-Transfer-Encoding: 8bit JOY LEE;Batiment Le Rabelais 22 Ave. des Nations ZI PARIS NORD II; VILLEPINTE 93240;Greece#This is test message. Términos y Condiciones ¿Contraseña? Álbum êtes le propriétaire für geschäftliche --=_wowlgpostcardsender102.10200000000105_= Content-Type:image/jpeg; name="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-Disposition: attachment;filename="/home1/eucyon/data/img_event/postcard/uk7200_110_6.jpg" Content-transfer-encoding: base64 /9j/4AAQSkZJRgABAgEASABIAAD/7Ri2UGhvdG9zaG9wIDMuMAA4QklNA+0KUmVzb2x1dGlvbgAA AAAQAEgAAAABAAIASAAAAAEAAjhCSU0EDRhGWCBHbG9iYWwgTGlnaHRpbmcgQW5nbGUAAAAABAAA AHg4QklNBBkSRlggR2xvYmFsIEFsdGl0dWRlAAAAAAQAAAAeOEJJTQPzC1ByaW50IEZsYWdzAAAA CQAAAAAAAAAAAQA4QklNBAoOQ29weXJpZ2h0IEZsYWcAAAAAAQAAOEJJTScQFEphcGFuZXNlIFBy aW50IEZsYWdzAAAAAAoAAQAAAAAAAAACOEJJTQP1F0NvbG9yIEhhbGZ0b25lIFNldHRpbmdzAAAA SAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1 AAAAAQAtAAAABgAAAAAAAThCSU0D+BdDb2xvciBUcmFuc2ZlciBTZXR0aW5ncwAAAHAAAP////// //////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//////// /////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQIBkd1 aWRlcwAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHg1VUkwgb3ZlcnJpZGVzAAAABAAAAAA4QklN BBoGU2xpY2VzAAAAAHUAAAAGAAAAAAAAAAAAAADwAAABXgAAAAoAVQBuAHQAaQB0AGwAZQBkAC0A MgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABXgAAAPAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAOEJJTQQREUlDQyBVbnRhZ2dlZCBGbGFnAAAAAQEAOEJJTQQUF0xh eWVyIElEIEdlbmVyYXRvciBCYXNlAAAABAAAAAI4QklNBAwVTmV3IFdpbmRvd3MgVGh1bWJuYWls AAAVDQAAAAEAAABwAAAATQAAAVAAAGUQAAAU8QAYAAH/2P/gABBKRklGAAECAQBIAEgAAP/uAA5B ZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwM 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 IxoVFRojIhcXFxcXIhEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEUExMWGRYb FxcbFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM /8AAEQgA8AFeAwEiAAIRAQMRAf/dAAQAFv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkK CwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEF QVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKz hMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAME BQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcm NcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eH l6e3x//aAAwDAQACEQMRAD8A7bYFKAkkSAiigs5u5pbxPgsXLYytxG6VrvG9hBJY3ueNFzuSaxY5 tR36Fw/eLWfSe2tvvf8A+fFl/EIkygBH1fv8X/qNt8pqSb08v+6Q2WMAOvCgMq6v+be5p7wS1V3Z DCSBrGh00lDdZx+VVowIrcF0aBFbti7NybG7bLXOb4ElV2NN7y3dta0SXf8AfPzvzEGxxI+78idh aaN1d4bbWDupLfpH97fu/wCt+p/o1OISlrfr/rLZERG1Rv8ARDp2lux0z6RgAxLdoP0fas9zy93i OCeJktb6ntRLXSweEaQZ/t/nsQnktdPZ/wBIa/5vv/8ARajhGkg0EkwWhokyBPxPt9yiXPbuEQ4a OB51/eYovJAYeTE/eVVyMrbVO4usbMg66H+X/OP+knxiSxymALTt6rm4mSRTe4A+4Ncd9f7tn6F/ 8v8A4uxdV0frbc+arG7Mhokx9B4/er/cXn92ZvrFbQCJBPciPzmfuI+B1G7FvZfXBe3TaeCP3Vfg ZRA/50WjLhlf736M31BJc1jfW7GcIyKLKj+8yLWf+irv/AlsYvVunZZ20ZDXO/dMsd/23d6b1NY6 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 AIJJuOTEonpe7YPmNfD6P76PCVP/2Q== --=_wowlgpostcardsender102.10200000000105_=-- MIME-tools-5.515/testin/crlf.hdr0000644000175000017500000000133410677325674014505 0ustar dfsdfsFrom eryq@rhine.gsfc.nasa.gov Thu Dec 21 16:34:23 1995 Path: news.clark.net!rahul.net!a2i!bug.rahul.net!a2i!olivea!decwrl!lll-winken.llnl.gov!simtel!news.sprintlink.net!news.ais.net!usenet From: "Josh E. Schneider" Newsgroups: comp.infosystems.www.authoring.cgi Subject: EMPLOYMENT: CHICAGO, IL UNIX/CGI/WEB/DBASE Date: 7 Oct 1995 17:27:44 GMT Organization: American Information Systems, Inc. Lines: 33 Message-ID: <456dag$jc2@news.ais.net> NNTP-Posting-Host: www.ama.org Mime-Version: 1.0 Content-Type: text/plain (a comment!); (another comment!) charset=us-ascii Content-Transfer-Encoding: 7bit X-Mailer: Mozilla 1.1N (X11; I; Linux 1.2.8 i586) X-URL: news:comp.infosystems.www.authoring.cgi MIME-tools-5.515/testin/infinite.msg0000644000175000017500000001255710677325674015406 0ustar dfsdfsContent-Type: TEXT/PLAIN; name=109f53c446c8882f4318316ecf4480ce Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: UmV0dXJuLVBhdGg6IDxvd25lci1jYWNvbXAtbEBsaW5mLnVuYi5icj4NClJl Y2VpdmVkOiBmcm9tIGVpZmZlbC5iYXNlLmNvbS5iciBieSBtYWlsYnIxLm1h aWxici5jb20uYnIgOyBUaHUsIDA1IE5vdiAxOTk4IDIyOjU4OjIzICswMDAN ClJlY2VpdmVkOiBmcm9tIG1hcmNvbmkuYmFzZS5jb20uYnIgKFsyMDAuMjQw LjEwLjU1XSkgYnkgZWlmZmVsLmJhc2UuY29tLmJyDQogICAgICAgICAgKE5l dHNjYXBlIE1haWwgU2VydmVyIHYyLjApIHdpdGggRVNNVFAgaWQgQURINDkx DQogICAgICAgICAgZm9yIDxhY2VjaWxpYUBtYWlsYnIuY29tLmJyPjsgVGh1 LCA1IE5vdiAxOTk4IDIxOjU1OjI0IC0wMjAwDQpSZWNlaXZlZDogZnJvbSBr ZXBsZXIuYmFzZS5jb20uYnIgKFsyMDAuMjQwLjEwLjEwNF0pIGJ5IG1hcmNv bmkuYmFzZS5jb20uYnINCiAgICAgICAgICAoTmV0c2NhcGUgTWFpbCBTZXJ2 ZXIgdjIuMCkgd2l0aCBFU01UUCBpZCBBQUU2ODY7DQogICAgICAgICAgV2Vk LCA0IE5vdiAxOTk4IDE0OjAwOjEwIC0wMjAwDQpSZWNlaXZlZDogZnJvbSBj eXJpdXMubGluZi51bmIuYnIgKFsxNjQuNDEuMTIuNF0pIGJ5IGtlcGxlci5i YXNlLmNvbS5icg0KICAgICAgICAgIChQb3N0Lk9mZmljZSBNVEEgdjMuNSBy ZWxlYXNlIDIxNSBJRCMgMC0wVTEwTDJTMTAwKSB3aXRoIFNNVFANCiAgICAg ICAgICBpZCBicjsgV2VkLCA0IE5vdiAxOTk4IDEzOjUzOjQ3IC0wMjAwDQpS ZWNlaXZlZDogZnJvbSBzZW5kbWFpbCBieSBjeXJpdXMubGluZi51bmIuYnIg d2l0aCBlc210cA0KCWlkIDB6YjVJOS0wMDAzb00tMDA7IFdlZCwgNCBOb3Yg MTk5OCAxMzo1NjoxNyAtMDIwMA0KUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0 IChtYWpvcmRvbUBsb2NhbGhvc3QpDQoJYnkgY3lyaXVzLmxpbmYudW5iLmJy ICg4LjguNy84LjguNykgd2l0aCBTTVRQIGlkIE5BQTE0NjM5Ow0KCVdlZCwg NCBOb3YgMTk5OCAxMzo1NDo1NCAtMDIwMCAoRURUKQ0KUmVjZWl2ZWQ6IGJ5 IGxpbmYudW5iLmJyIChidWxrX21haWxlciB2MS42KTsgV2VkLCA0IE5vdiAx OTk4IDEzOjU0OjU0IC0wMjAwDQpSZWNlaXZlZDogKGZyb20gbWFqb3Jkb21A bG9jYWxob3N0KQ0KCWJ5IGN5cml1cy5saW5mLnVuYi5iciAoOC44LjcvOC44 LjcpIGlkIE5BQTE0NjMwDQoJZm9yIGNhY29tcC1sLW91dHRlcjsgV2VkLCA0 IE5vdiAxOTk4IDEzOjU0OjUzIC0wMjAwIChFRFQpDQpSZWNlaXZlZDogKGZy b20gc2VuZG1haWxAbG9jYWxob3N0KQ0KCWJ5IGN5cml1cy5saW5mLnVuYi5i ciAoOC44LjcvOC44LjcpIGlkIE5BQTE0NjIzDQoJZm9yIGNhY29tcC1sQGxp bmYudW5iLmJyOyBXZWQsIDQgTm92IDE5OTggMTM6NTQ6NTAgLTAyMDAgKEVE VCkNClJlY2VpdmVkOiBmcm9tIGJyYXNpbGlhLm1wZGZ0Lmdvdi5iciBbMjAw LjI1Mi44NS4yXSANCglieSBjeXJpdXMubGluZi51bmIuYnIgd2l0aCBlc210 cA0KCWlkIDB6YjVGei0wMDAzbEYtMDA7IFdlZCwgNCBOb3YgMTk5OCAxMzo1 NDoyOCAtMDIwMA0KUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0IChsYmVja2Vy QGxvY2FsaG9zdCkNCglieSBicmFzaWxpYS5tcGRmdC5nb3YuYnIgKDguOC41 LzguOC44KSB3aXRoIEVTTVRQIGlkIE5BQTAyNTcxDQoJZm9yIDxjYWNvbXAt bEBsaW5mLnVuYi5icj47IFdlZCwgNCBOb3YgMTk5OCAxMzozNjoxNCAtMDIw MCAoRURUKQ0KCShlbnZlbG9wZS1mcm9tIGxiZWNrZXJAYnJhc2lsaWEubXBk ZnQuZ292LmJyKQ0KRGF0ZTogV2VkLCA0IE5vdiAxOTk4IDEzOjM2OjE0IC0w MjAwIChFRFQpDQpGcm9tOiBMdWxhIEJlY2tlciA8bGJlY2tlckBicmFzaWxp YS5tcGRmdC5nb3YuYnI+DQpUbzogY2Fjb21wLWxAbGluZi51bmIuYnINClN1 YmplY3Q6IFtjYWNvbXAtbF0gPT8/UT9SZT0zQV89NUJjYWNvbXAtbD01RF9F X249M0FfQnJhcz1FRGxpYV9jb2JyZT89DQpJbi1SZXBseS1UbzogPFBpbmUu U1VOLjMuOTEuOTgxMTAzMjM1OTQzLjIyNDFFLTEwMDAwMEBhbnRhcmVzLmxp bmYudW5iLmJyPg0KTWVzc2FnZS1JRDogPFBpbmUuQlNGLjMuOTYuOTgxMTA0 MTMzNTQ3LjI1MzJCLTEwMDAwMEBicmFzaWxpYS5tcGRmdC5nb3YuYnI+DQpN SU1FLVZlcnNpb246IDEuMA0KQ29udGVudC1UeXBlOiBURVhUL1BMQUlOOyBj aGFyc2V0PQ0KWC1NSU1FLUF1dG9jb252ZXJ0ZWQ6IGZyb20gOGJpdCB0byBx dW90ZWQtcHJpbnRhYmxlIGJ5IGJyYXNpbGlhLm1wZGZ0Lmdvdi5iciBpZCBO QUEwMjU3MQ0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdA0KWC1N SU1FLUF1dG9jb252ZXJ0ZWQ6IGZyb20gcXVvdGVkLXByaW50YWJsZSB0byA4 Yml0IGJ5IGN5cml1cy5saW5mLnVuYi5iciBpZCBOQUIxNDYyMw0KU2VuZGVy OiBvd25lci1jYWNvbXAtbEBsaW5mLnVuYi5icg0KUmVwbHktVG86IGNhY29t cC1sQGxpbmYudW5iLmJyDQpQcmVjZWRlbmNlOiBidWxrDQpYLVJjcHQtVG86 IDxhY2VjaWxpYUBtYWlsYnIuY29tLmJyDQpYLURQT1A6IERQT1AgVmVyc2lv biAyLjNkDQpYLVVJREw6IDkxMDM4NjgxNi4wMDQNClN0YXR1czogUk8NCg0K DQoNCglDb21vIGFzc2ltLCBkYWggdW0gZXhlbXBsby4gRGVpeGFuZG8gYSBj b250YSBhYmVydGEsIG5laCwgRnJlZC4uLg0KDQoJDQoNCk9uIFdlZCwgNCBO b3YgMTk5OCwgRnJlZGVyaWNvIE5hcmRvdHRvIHdyb3RlOg0KDQo+IFBvcnF1 ZSBldSBzb3UgZWggZm9kYS4uLi4gDQo+IFByZWdvIGVoIG8gY2FyYWxobywg VmMgbmFvIG1lIGNvbmhlY2UgcGFyYSBmaWNhciBmYWxhbmRvIGFzc2ltLi4u IE5hbyANCj4gc2FiZSBkZSBvbmRlIGV1IHZpbSwgcXVlbSBzb3UsIG91IHNl amEsIFBPUlJBIE5FTkhVTUEuLi4NCj4gDQo+IFZBSSBUT01BUiBOTyBDVSBF IE1FIERFSVhBIEVNIFBBWiEhISEhISENCj4gDQo+IE9uIFR1ZSwgMyBOb3Yg MTk5OCwgR3VpbGhlcm1lIE9saXZpZXJpIENhaXhldGEgQm9yZ2VzIHdyb3Rl Og0KPiANCj4gPiBT82NyYXRlcywNCj4gPiANCj4gPiAgICAgcG9ycXVlIHZv Y+ogZmF6IHRhbnRhIHF1ZXN0428gZGUgc2UgaW5kaXNwb3IgY29tIFRPRE8g TVVORE8hISEgSuEgbuNvIGJhc3Rhc3NlDQo+ID4gbWVpYSBjb21wdXRh5+Nv IHRlIGFjaGFyIHVtIHByZWdvLCB2b2PqIHJlc29sdmUgYW1wbGlhciBlc3Rl IHVuaXZlcnNvIHBhcmEgb3V0cmFzDQo+ID4gcGVzc29hcy4uLiBNYW7pIQ0K PiA+IA0KPiA+IFNvY3JhdGVzIEFyYW50ZXMgVGVpeGVpcmEgRmlsaG8gKDk3 LzE4NDQzKSB3cm90ZToNCj4gPiANCj4gPiA+ICAgICAgVm9j6iB0ZW0gcXVl IHZlciBxdWUgcGFjaepuY2lhIHRlbSBsaW1pdGUuIEV1IGFn/GVudGVpIG8g beF4aW1vDQo+ID4gPiBwb3Nz7XZlbCBlbGUgZmljYXIgZXNjcmV2ZW5kbyBl c3NhcyBidXJyaWNlcyBuYSBub3NzYSBzYWxhIGRlIGRpc2N1cnPjby4NCj4g PiA+IENvbSBnZW50ZSBpZ25vcmFudGUgY29tbyBlbGUsIHF1ZSB1bSByb3Jp emlzdGEgY2VnbywgbvNzIHPzIGNvbnNlZ3VpbW9zDQo+ID4gDQo+ID4gICAg IEVtIHNlIGZhbGFuZG8gZGUgaWdub3LibmNpYTog6SBiZW0gdmVyZGFkZSBx dWUgb3MgbWFpbHMgZGEgY2Fjb21wIGVzdONvIGF0aW5naW5kbw0KPiA+IHBy b3Bvcuf1ZXMgZGFudGVzY2FzLCBtYXMgbyBjZXJ0byDpIERJU0NVU1PDTy4N Cj4gPiANCj4gPiBTZW0gbWFpcywNCj4gPiANCj4gPiAtLQ0KPiA+IEd1aWxo ZXJtZSBPbGl2aWVyaSBDYWl4ZXRhIEJvcmdlcw0KPiA+ICoqKioqKioqKioq KioqKioqKioqKioqKioqDQo+ID4gV2ViIERlc2lnbiAtIFZpYSBJbnRlcm5l dA0KPiA+ICgwNjEpIDMxNS05NjU3IC8gOTY0LTkxOTkNCj4gPiBndWlib3Jn ZXNAYnJhc2lsaWEuY29tLmJyDQo+ID4gZ3VpYm9yZ2VzQHZpYS1uZXQuY29t LmJyDQo+ID4gKioqKioqKioqKioqKioqKioqKioqKioqKioNCj4gPiANCj4g PiANCj4gPiANCj4gPiANCj4gPiANCj4gDQo+IA0KDQoNCg== MIME-tools-5.515/testin/encoded.hdr0000644000175000017500000000046610677325674015165 0ustar dfsdfsFrom: =?US-ASCII?Q?Keith_Moore?= To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= CC: =?ISO-8859-1?Q?Andr=E9_?= Pirard Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= =?US-ASCII?Q?.._cool!?= MIME-tools-5.515/testin/multi-digest.msg0000644000175000017500000000120510677325674016174 0ustar dfsdfsFrom: Nathaniel Borenstein To: Ned Freed Subject: Sample digest message MIME-Version: 1.0 Content-type: multipart/digest; boundary="simple boundary" This is the preamble. It is to be ignored, though it is a handy place for mail composers to include an explanatory note to non-MIME conformant readers. --simple boundary This is implicitly typed plain ASCII text. It does NOT end with a linebreak. --simple boundary Content-type: text/plain; charset=us-ascii This is explicitly typed plain ASCII text. It DOES end with a linebreak. --simple boundary-- This is the epilogue. It is also to be ignored. MIME-tools-5.515/testin/badbound.msg0000644000175000017500000001367210677325674015356 0ustar dfsdfsReceived: from uriela.in-berlin.de by anna.in-berlin.de via SMTP (940816.SGI.8.6.9/940406.SGI) for id AAA04436; Mon, 23 Dec 1996 00:08:02 +0100 Resent-From: koenig@franz.ww.TU-Berlin.DE Received: by uriela.in-berlin.de (/\oo/\ Smail3.1.29.1 #29.8) id ; Mon, 23 Dec 96 00:08 MET Received: by methan.chemie.fu-berlin.de (Smail3.1.29.1) from franz.ww.TU-Berlin.DE (130.149.200.51) with smtp id ; Mon, 23 Dec 96 00:07 MET Received: (from koenig@localhost) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) id XAA01761 for k@anna.in-berlin.de; Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Date: Sun, 22 Dec 1996 23:25:10 +0100 (CET) Resent-Message-Id: <199612222225.XAA01761@franz.ww.TU-Berlin.DE> Resent-To: k Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id XAA01754 for ; Sun, 22 Dec 1996 23:24:32 +0100 (CET) Received: from challenge.uscom.com (actually mail.uscom.com) by mailgzrz.TU-Berlin.DE with SMTP (PP); Sun, 22 Dec 1996 23:19:35 +0100 To: koenig@franz.ww.tu-berlin.de From: Mail Administrator Reply-To: Mail Administrator Subject: Mail System Error - Returned Mail Date: Sun, 22 Dec 1996 17:21:12 -0500 Message-ID: <19961222222112.AAE16235@challenge.uscom.com> MIME-Version: 1.0 Content-Type: multipart/mixed; Boundary="===========================_ _= 2283630(16235)" Content-Transfer-Encoding: 7BIT X-Filter: mailagent [version 3.0 PL44] for koenig@franz.ww.tu-berlin.de X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de --===========================_ _= 2283630(16235) Content-type: text/plain; charset="us-ascii" This Message was undeliverable due to the following reason: The Program-Deliver module couldn't deliver the message to one or more of the intended recipients because their delivery program(s) failed. The following error messages provide the details about each failure: The delivery program "/pages/pnet/admin/mail_proc.pl" produced the following output while delivering the message to pnet@uscom.com Can't exec "/usr/sbin/sendmail -t": No such file or directory at /pages/pnet/admin/mail_proc.pl line 96, <> line 93. Broken pipe The program "/pages/pnet/admin/mail_proc.pl" exited with an unknown value of 141 while delivering the message to pnet@uscom.com The message was not delivered to: pnet@uscom.com Please reply to Postmaster@challenge.uscom.com if you feel this message to be in error. --===========================_ _= 2283630(16235) Content-type: message/rfc822 Content-Disposition: attachment Date: Sun, 22 Dec 1996 22:24:21 +0000 Message-ID: <"mailgzrz.T.061:22.12.96.22.24.21"@TU-Berlin.DE> Received: from franz.ww.TU-Berlin.DE ([130.149.200.51]) by challenge.uscom.com (Netscape Mail Server v2.02) with ESMTP id AAA685 for ; Wed, 18 Dec 1996 16:58:30 -0500 Received: from mailgzrz.TU-Berlin.DE (mailgzrz.TU-Berlin.DE [130.149.4.10]) by franz.ww.TU-Berlin.DE (8.7.3/8.7.3) with ESMTP id SAA23400 for ; Wed, 18 Dec 1996 18:59:21 +0100 (CET) Received: from anna.in-berlin.de by mailgzrz.TU-Berlin.DE with SMTP (PP); Wed, 18 Dec 1996 18:59:11 +0100 Received: by anna.in-berlin.de (940816.SGI.8.6.9/940406.SGI) id SAA19491; Wed, 18 Dec 1996 18:55:21 +0100 Date: Wed, 18 Dec 1996 18:55:21 +0100 Message-Id: <199612181755.SAA19491@anna.in-berlin.de> From: Andreas Koenig To: michelle@eugene.net CC: msqlperl@franz.ww.tu-berlin.de In-reply-to: (message from Michelle Brownsworth on Wed, 18 Dec 1996 09:32:02 -0700) Subject: HOWTO (Was: unsubscribe) >>>>> On Wed, 18 Dec 1996 09:32:02 -0700, >>>>> Michelle Brownsworth >>>>> who can be reached at: michelle@eugene.net >>>>> (whose comments are cited below with " michelle> "), >>>>> sent the cited message concerning the subject of "unsubscribe" >>>>> twice to the whole list of subscribers michelle> unsubscribe michelle> ************************************************************ michelle> Michelle Brownsworth michelle> System Administrator michelle> Internet Marketing Services michelle@eugene.net michelle> 2300 Oakmont Way, #209 541-431-3374 michelle> Eugene, OR 97402 FAX 431-7345 michelle> ************************************************************ Welcome new subscriber! You've joined the mailing list of unsubscribers' collected wisdom of unsubscribe messages. Relax! You won't have to subscribe to any mailing list for the rest of your life. Better yet, you can't even unsubscribe! So just lean back and enjoy to watch your IO stream of millions of unsubscribe messages daily. Isn't that far more than everything you ever dared to dream of? andreas P.S. This was posted 12 days ago: Date: Fri, 6 Dec 1996 15:47:51 +0100 To: msqlperl@franz.ww.tu-berlin.de Subject: How To Unsubscribe (semi-regular posting) To get off this list, send mail to -------------------- majordomo@franz.ww.tu-berlin.de with the following words in the body of the message (subject line will be ignored): unsubscribe msqlperl <_insert_your_subscription_address_here_> To find out who you are subscribed as, send mail to ------------------------------------- majordomo@franz.ww.tu-berlin.de with only nothing but who msqlperl in the body of the message: If you encounter problems, ------------------------- please try sending the message "help" to majordomo@franz.ww.tu-berlin.de. Hope that help, andreas NOTE: if the above recipe does not work for you, ask me for assistance and do not spam the list with the request. Thank you! --===========================_ _= 2283630(16235)-- MIME-tools-5.515/testin/quot-print.body0000644000175000017500000000340510677325674016062 0ustar dfsdfsMime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Date: Fri, 15 Sep 1995 22:40:17 -0700 To: Eryq Subject: Re: STOMP! >"STOMP" is coming to Chicago! Deb has wanted to see them for the >longest time, and by dumb luck I happened to be watching TV when >they flashed the TicketMaster ad. I got mezzanine tickets on >opening night... PSYCH! > >(Hee hee... she doesn't know yet... think I'll spring it on her now...) :-) > >Just thought I'd share that little bit of news... so, how are >YOU doing? I'm submerged in school and my own plans for performances. I have one= planned for later in the fall. We have this wonderful theater space that= comes complete with tech and techies, and no one uses it. Evidently, there= is a bias against "theatrical" work here. So I get almost unlimited= rehearsal time! Heh heh. =20 My professors are ok so far. The lecture class that looks the most= promising is a seminar on race and gender as it pertains to culture,= history, art history and popular images. The teacher is great, only she= tried to fit too much stuff into one semester. I have an exciting oral= report to work on for the next few weeks. I've met some truly= amazing individuals here. I get to take the DAT tape recorder out= for a spin in a week. I can't wait! =20 I also got my video and sound up and working. Apple sent me a disk with an= older version of Quicktime on it so that my machine will stop crashing= during video capture. I'm set. I'm beyond thrilled.=20 I'm also getting into the hairier parts of HTMLing. Right now I'm figuring= out imagemapping. The job at the Center has panned out nicely.= I work at the computers the whole time. =20 Have fun at "STOMP!" *envy*.... MIME-tools-5.515/testin/x-gzip64.body0000644000175000017500000000043110677325674015324 0ustar dfsdfsH4sIAJ+A5jIAA0VPTWvDMAy9+1e8nbpCsS877bRS1vayXdJDDwURbJEEEqez VdKC6W+fnQ0iwdN7ktAHQEQAzV7irAv9DI8fvHLGD/bCobai7TisFUyuXxJW lDB70aucxfHWtBxRnc4bfG+rrTmMztXBobrWlrHvu6YV7LwErVLZZP4n0IJA K3J9N2aaJj3YqD2LeZYzFC75tlTaCtsg/SGRwmJZklnI1wOxa3wtt8Dgu2V2 EdIyAudnBvaOHd7Qd57ji/oFWju6Pg4BAAA= MIME-tools-5.515/testin/bluedot.jpg0000644000175000017500000001026010677325674015216 0ustar dfsdfsÿØÿàJFIFÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?÷ú(¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¨çžn.%Ž"BòI#TP2I'€ç4%ÃêtØÔÇ¢[KªÎ ðÐ[Œ¾k/ÌÎ jààd€A®NóÅ^)Ô£òî5x­cÁV]6ÛÉ2Ô3;;b…Éç8ÇezÚÆ:wzv'5Âaݧ={-¯™ì”WÍn×Q47—ºä ÷ »¿žxŸÈîTààŒŽ¨ªŸðè¿ô°ÿÀdÿ íŽKW¬‘æK‰h'îÁþðO¡è¯ž“CÒ¡‘e‡Nµ‚T!’Xbº0èÊË‚¤AzV„7¬«5®½¬Ç2ý×{ùg<’RèxõSŽ£JY5eðÉ2¡Ä¸gñů¹þ§ºÑ^MaãÏiêqe«ÆÏþ1$ç,謇Œ׌swvÚômvdµI$³Ô;l¯I[Ÿ“¬˜'c6ÐFì+‚¶µg?ÕÃflN”¥wÛg÷Q\ÇhQEQEQEQEQEQEQEQEQEQEq~1ñ‹iìúN“"HçÏ€Ëh¤dpx2A x†n6«éNœªÉB í™W¯N…7R£²FŸ‰<_aáÑörçR’=ðÚF<àpr-×km FÚó_Q¿ñÒÜjò,‘Ç'›of m›±^v}öç%¶„ V©Ão¸-0Ò9’G'-#ž¬Ìyf=Øäžõ-}.-§GÞž²üˆÌ3ºØ›ÂŸ»ÅúÿQEéž QEQETsÛÃu Cq sDØÜ’(e<çjJ)5}Ói݃ã}KEd·ÔÚ]KNÈv9¸¶P1À ™‡CÉßÃÈHQézv£i«iðßXγ[L2Ž ò ‚ ‚âu6—{s ê‡SÓkpø7Ê—J?…ÈGð¾ _pY[ÅÆeQ•çGGÛü¦Ë³ùAªxW~¿>ÿŸ©îVv‡®YxƒM[Û&lgd±H’ŽpFAî ‚Aè×Ï´Ó³>½5%u°QE†QEQEQEQEQEQEQUïï­ôÍ:æþòO.ÖÖ'šgÚNÔPKN=(Æþ"} GY¾ÝNû|6¬6Ÿ$í$ÌTç*œv ³"œnÈòèãX—jî9%‹3fbrY‰ä’I$žI$š±q¬ë:µâì–oÝÅò Vc7ıÉù™°v…ú¬· ì)óK⇑ð9ÖcõªÜ~ävó}ÿËþQEé0QEQEQEQEQE>«ÏáÝR=^Ýe’8ÁvÐýë˜@o”…”Ëß ®T;ö¸'†êÞ+‹ycš Pæ}Wæ6U¨ý?ËüL¢Š+À>´(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ξ%êÞ|ö~ˆü§mõçûŠÇÉ^äBù'aëÑkÄ5KÇÔüM­_ɸy%²#6ï- & ô,&:#uäžü¶Š«ˆIìµþ¾g•b^'å¢ùÿÀ¹Q_Z~zQEQEQEQEQEQEâNöÌmc»Œ¬¶Ò7D™hØðr8Át=*z*e(¸½™P›„”ãºÔöU¶×4{]NÓp†æ0á_÷FNU†x ŽÕz¼ûáuæZÒ˜¹0Ü%Üc?"G*ãhô&H¥b1Ÿ9$œz |Mjn•IAôgéøjʽÕ]RaEVfÁEPEPEPEPEPsÏ ­¼·Ç !y$‘‚ª($“ÀsšùûCáÐ4ØäFIÖ%ea‚¤ È#Ö½—ÇòOŸ×â|·Âð§>ͯ¾ßä_¢Š+è‘ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€.xþG¯ ×Ü¿úK={Uy7€QßÇâDVd‹Kd`2¼°ìöݱñë±±Ð׬×Éæ’¾&Kµ¿#ïòràbûÝþ!EWž{EPEPEPEPEP^+¯ÙfxËZ³ùqI2ÞÀ™ÎRUË6}æðy€m¯j®âvšÒivZÔI–Óe"v$[H0ütÀq³accž öà+ûêOg§Þy¹¾ë8IEnµ_/êÇEWןQ@Q@Q@Q@Q@Q@S$[™š+[$W½¹‘`·VíаíQ–b9 ¬{TNjr–ȺtåRjÝèw_ ì ƒVÖX0s­¬'#kEàN:ƒæ¼ÊsÔ*àw=ýQÑô«mGµÓ-7m£ñ¹Ïwb˜å˜ã’IïW«â«Tuj9¾¬ý;EP¥K¢°QE™°QEQEQEQEQETsÁ Õ¼¶÷G4¡I#‘C+© ƒÁqŠ’ŠñMgH—úäº\ŒÏ =œ­ŸšÄlËrÍʬrIœ¾JõŸø|x‹C{xÊ¥ôÏe#± “…e]Ø*C2·áŽ0@#É~t–Xf†H.!.hdO”“åä-}5…Ov®ðÿ€|faÔ¡yÐ÷£Ûªÿ?ëN¦mØäI£I#uxÜVSÀô úS«Ö>{`¢Š)€QEQEE%ÄqË8y'—>TÆÒK&9;QAfÀäàO2’м‘P„§%«¶KWô-÷ÄמM¨– $$O~c;TAX‹ ®ùq•Bî@Fè4‡“]2]x“jDeÓbpêãÄíŽyÀ(‡oÊAi°=!µ·ŠÞÞ(á‚$ q¨UE81^36½áCïÿ/ó>«.áû5Wÿ€ÿŸùÃéÚu¦“§ÃccÃm $õ9$“É$’I9$’I$Õª(¯ú½‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( SXø}¢j·uŸ¥ÝHååšÀªy¤’Ided,IÉ}»ÎÝŽ+“¼ð‰ìòmåÓu8Õw’¥íd'ûЇz“ÇÈ “ƒ€2}^Šé£‹¯GHKC‹—aqÕ‚o¾ÏïG‰M£øŠÖ&šëÃ:œp¯Þt0ÎFx$R;ž}ã©ÀÕOô¿úkŸø'ºÿãuïWdsŒBÝ'òÿ‚y²áÌz9/šýQá üÒ,qhšÛHä*+i“Æ =g@«õbî@­|1â»™V%ðì–Å¿å­ÝÜ ÷ùŒníì0§’3’=šŠRÍñk/—ù•ÁÇ{¿WþIqaðÊîYõeL${kLg Organization: KULTURBOX X-Mailer: Mozilla 2.02 (WinNT; I) MIME-Version: 1.0 To: andreas.koenig@mind.de, kun@pop.combox.de, 101762.2307@compuserve.com Subject: [Fwd: Re: 34Mbit/s Netz] Content-Type: MULTIPART/MIXED; boundary="------------70522FC73543" X-Filter: mailagent [version 3.0 PL44] for k@.in-berlin.de This is a multi-part message in MIME format. --------------70522FC73543 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit -- Juergen Specht - KULTURBOX --------------70522FC73543 Content-Type: message/rfc822 Content-Transfer-Encoding: 7bit Content-Disposition: inline X-POP3-Rcpt: specht@trachea Return-Path: hermes Received: (from hermes@localhost) by kulturbox.netmbx.de (8.7.1/8.7.1) id SAA04513 for specht; Wed, 19 Jun 1996 18:30:12 +0200 Received: by netmbx.netmbx.de (/\==/\ Smail3.1.28.1) from mail.cs.tu-berlin.de with smtp id ; Wed, 19 Jun 96 18:12 MES Received: (from nobody@localhost) by mail.cs.tu-berlin.de (8.6.12/8.6.12) id SAA12413; Wed, 19 Jun 1996 18:26:28 +0200 Resent-Date: Wed, 19 Jun 1996 18:26:28 +0200 Resent-Message-Id: <199606191626.SAA12413@mail.cs.tu-berlin.de> Resent-From: nobody@cs.tu-berlin.de Resent-To: kultur@kulturbox.netmbx.de Received: from gatekeeper.telekom.de ([194.25.15.11]) by mail.cs.tu-berlin.de (8.6.12/8.6.12) with SMTP id SAA11678 for ; Wed, 19 Jun 1996 18:11:29 +0200 Received: from ULM02.mnh.telekom.de by gatekeeper.telekom.de; (5.65v3.0/1.1.8.2/02Aug95-0132PM) id AA01376; Wed, 19 Jun 1996 18:11:27 +0200 Received: from ulm02.mnh.telekom.de (deuschle@mnh.telekom.de) by ULM02.mnh.telekom.de (8.6.10/3) with SMTP id SAA30680 for ; Wed, 19 Jun 1996 18:14:40 GMT Message-Id: <199606191814.SAA30680@ULM02.mnh.telekom.de> X-Sender: deuschle@ulm02.mnh.telekom.de X-Mailer: Windows Eudora Version 1.4.4 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Date: Wed, 19 Jun 1996 18:12:02 +0200 To: Juergen Specht From: deuschle@mnh.telekom.de (Guenter Deuschle) Subject: Re: 34Mbit/s Netz X-Mozilla-Status: 0011 Hallo Herr Specht, entschuldigen Sie vorab, dass ich Ihnen nicht telefonisch zur Verfuegung stehe, ich Praesentationen gehalten/ noch zu halten und viele Kundennachfragen zu projektieren. Nach Informationen des Produkt-Managers Temme steht der POP schon zur Verf=FCgung! Standort: voraussichtlich: Winterfeldstr. 21, 10781 Berlin. Der POP hat zur Zeit direkte 34M-Anbindungen zu folgenden Orten: Rostock, Hamburg, Hannover & Leipzig. 4 weitere werden in kuerze in Betrieb gehen. Damit haben Sie einen Besonderen Sicherheitsstandard verfuegbar! Kontakt muessen Sie ueber Ihre oerltliche Vertriebseinheit aufnehmen: entweder den Geschaefts-Kunden-Vertrieb oder das GrossKundenManagement. Diese Vertriebseinheiten greifen auf den oertlichen Technischen Vertriebs-Support zu. Die Informationen werden ueber TVS zur Vertriebseiheit gegeben und dann zu Ihnen. Sie benoetigen eine Standleitung von Ihrer Lokation zum Internet-POP Uebergabepunkt zu Ihrem Info-Server ist ein CISCO 1000-Router. Dann zahlen Sie neben den monatlichen Kosten fuer die Standleitung die Kosten fuer den Internet-Zugang: zB bei 64k: 1500DM bei 2GByte Freivolumen. 128K: 3000 DM bei 5 GB Freivolumen & 2M: 30.000 DM bei 50GB Freivolumen. Freundliche Gruesse=20 Guenter Deuschle >Sehr geehrter Herr Deuschle, >Sie sind mir von Herrn Meyendriesch empfohlen worden. >Ich versuche Informationen ueber das T-eigene 34Mbit/s Netz und den=20 >lokalen Pop-Berlin rauszufinden, bzw. was ein Anschluss kostet und=20 >wo man ihn herbekommt. Laut Herrn Schnick in Berlin gibt es den=20 >T-Pop nicht, laut Traceroute von Herrn Meyendriesch sehrwohl. Auch=20 >ist dies Netz in der IX vom Mai 96 erwaehnt. >Koennen Sie mir helfen? > >MfG >--=20 >Juergen Specht - KULTURBOX > > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D Dipl.-Ing. Guenter D E U S C H L E Deutsche Telekom AG Niederlassung 3 Hannover GrossKundenManagement - Techn. Vertriebs-Support: Team-Leiter Internet Online-Dienste --------------------------------------------------- GrKM-TVS-IOD Tel: +49-511-333-2772 Vahrenwalder-Str. 245 FAX: +49-511-333-2751 30179 Hannover eMail: deuschle@mnh.telekom.de=20 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D --------------70522FC73543-- MIME-tools-5.515/testin/andreas-1296.txt0000644000175000017500000002301510677325674015635 0ustar dfsdfsFrom - Mon Dec 30 07:59:17 1996 Received: from rhine.gsfc.nasa.gov (rhine.gsfc.nasa.gov [192.150.28.74]) by enteract.com (8.8.4/8.7.6) with ESMTP id RAA12395 for ; Sun, 22 Dec 1996 17:44:16 -0600 (CST) Received: from anna.in-berlin.de (anna.in-berlin.de [193.175.21.66]) by rhine.gsfc.nasa.gov (8.8.3/8.8.3) with SMTP id SAA22845 for ; Sun, 22 Dec 1996 18:43:59 -0500 (EST) Received: by anna.in-berlin.de (940816.SGI.8.6.9/940406.SGI) id AAA05063; Mon, 23 Dec 1996 00:42:39 +0100 Date: Mon, 23 Dec 1996 00:42:39 +0100 Message-Id: <199612222342.AAA05063@anna.in-berlin.de> X-UIDL: 851954010.073 From: Andreas Koenig To: Eryq Subject: MIME::Parser fails on this message Status: U X-Mozilla-Status: 0001 Hi, Eryq, I hope, all's well! In case you're on holidays, happy holidays! In case you're hacking, I have something to crack for you. In case you're busy, good luck with your work! Today I got a message that resulted in k@anna:~% perl Mail/unmime.it < Mail/mh/mime/94 MIME::ParserBase::parse_preamble() unexpected eof in preamble couldn't parse MIME stream at Mail/unmime.it line 78, chunk 160. zsh: exit 2 perl Mail/unmime.it < Mail/mh/mime/94 I append the original mail uuencoded. All the best, andreas begin 600 MP.fails.for.this M4F5C96EV960Z(&9R;VT@=7)I96QA+FEN+6)E2!A;FYA+FEN M+6)E2!F MBYW=RY452U"97)L:6XN1$4@*#@N-RXS+S@N-RXS*2!I9"!804$P,3BYW=RY452U"97)L:6XN1$4^ M"E)EBY452U"97)L M:6XN1$4@*&UA:6QG>G)Z+E15+4)EBYW=RY452U"97)L M:6XN1$4^.R!3=6XL(#(R($1E8R`Q.3DV(#(S.C(T.C,R("LP,3`P("A#150I M"E)E8V5I=F5D.B!FG)Z+E15+4)E MBYW=RYT=2UB M97)L:6XN9&4*1G)O;3H@36%I;"!!9&UI;FES=')A=&]R(#Q0;W-T;6%S=&5R M0&-H86QL96YG92YU7-T96T@17)R;W(@+2!2971U&5D M.R!";W5N9&%R>3TB/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]/3T]7R!?/2`* M("`@("`@("`@("`@("`R,C@S-C,P*#$V,C,U*2(*0V]N=&5N="U47!E M.B!T97AT+W!L86EN.R!C:&%R2!P2!A="`O<&%G97,O M<&YE="]A9&UI;B]M86EL7W!R;V,N<&P@;&EN92`Y-BP@/#X@;&EN92`Y,RX* M("`@("`@("`@($)R;VME;B!P:7!E"B`@("`@"B`@("`@5&AE('!R;V=R86T@ M(B]P86=EG)Z+E0N,#8Q.C(R+C$R+CDV+C(R+C(T+C(Q(D!452U"97)L:6XN M1$4^"@I296-E:79E9#H@9G)O;2!FBYW=RY452U"97)L:6XN1$4@*%LQ M,S`N,30Y+C(P,"XU,5TI(`H@("`@("`@("`@8GD@8VAA;&QE;F=E+G5S8V]M M+F-O;2`H3F5TBY452U"97)L:6XN1$4@ M6S$S,"XQ-#DN-"XQ,%TI(`H@("`@("`@("`@8GD@9G)A;GHN=WBYW=RYT=2UB97)L:6XN9&4*26XM6]U7,@86=O.@H*1&%T93H@1G)I+"`V($1E8R`Q.3DV M(#$U.C0W.C4Q("LP,3`P"E1O.B!MBYW=RYT=2UB97)L M:6XN9&4*4W5B:F5C=#H@2&]W(%1O(%5N6]U+"!A To: imswww@rhine.gsfc.nasa.gov Mime-Version: 1.0 Subject: note the bogus filename Content-Type: text/plain; charset=iso-8859-1; name="/tmp/whoa" Content-Transfer-Encoding: 8bit This had better not end up in /tmp! MIME-tools-5.515/testin/short.txt0000644000175000017500000000020610677325674014755 0ustar dfsdfsDear «François Müller», As you requested, I have rewritten the MIME:: parser modules to support the creation of MIME messages. Eryq MIME-tools-5.515/testin/simple.msgh0000644000175000017500000000034210677325674015227 0ustar dfsdfsReturn-Path: eryq@rhine.gsfc.nasa.gov Date: Wed, 20 Dec 95 19:59 CST From: eryq@rhine.gsfc.nasa.gov To: sitaram@selsvr.stx.com Cc: johnson@killians.gsfc.nasa.gov,harvel@killians.gsfc.nasa.gov, eryq Subject: Request for Leave MIME-tools-5.515/testin/fun.txt0000644000175000017500000000573310677325674014420 0ustar dfsdfsThis is a fun little file. It contains a lot of things intended to break any badly-written decoder class. Here is a line that's extremely long (120 a's)... So long, in fact, that it goes past the normal 80-character limit: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa The next line is longer (2000 b's): it goes past the 1000-character limit that mail programs normally assume. All the decoders (except binary) are expected to produce output that's much shorter. bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb Here's some 7-bit binary data:  Here's some 8-bit Latin-1 text: «François Müller» MIME-tools-5.515/testin/jt-0498.msg0000644000175000017500000001153610677325674014614 0ustar dfsdfsFrom owner-funnel-pc@hpc.uh.edu Thu Apr 30 14:27:51 1998 Received: from farabi.hpc.uh.edu (farabi.hpc.uh.edu [129.7.102.2]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id OAA27026; Thu, 30 Apr 1998 14:27:51 -0500 (CDT) Received: from sina.hpc.uh.edu (lists@[10.1.1.1]) by farabi.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id WAD14645; Mon, 27 Apr 1998 22:20:19 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Thu, 30 Apr 1998 14:26:26 -0500 (CDT) Received: (from tibbs@localhost) by sina.hpc.uh.edu (8.7.3/8.7.3) id OAA26968 for pc800@hpc.uh.edu; Thu, 30 Apr 1998 14:26:17 -0500 (CDT) Received: from imo11.mx.aol.com (imo11.mx.aol.com [198.81.17.33]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id KAA22560 for ; Thu, 30 Apr 1998 10:29:47 -0500 (CDT) Received: from Gaffneydp@aol.com by imo11.mx.aol.com (IMOv14.1) id QICDa02864 for ; Thu, 30 Apr 1998 11:28:50 -0400 (EDT) From: Gaffneydp Message-ID: Date: Thu, 30 Apr 1998 11:28:50 EDT To: PC800@hpc.uh.edu Mime-Version: 1.0 Subject: Fwd: PC800: Tall Hondaline Windshield Distortion Content-type: multipart/mixed; boundary="part0_893950130_boundary" X-Mailer: AOL 3.0 16-bit for Windows sub 41 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7 This is a multi-part message in MIME format. --part0_893950130_boundary Content-ID: <0_893950130@inet_out.mail.aol.com.1> Content-type: text/plain; charset=US-ASCII Hello to all, I purchased a tall windshield about two weeks ago from Waynesville Cycle Center in NC. The entire length and width of the windshield has optical waves or ripples which distort the view through it. It was very uncomfortable to ride with and I would be afraid to ride at night with it. I contacted the manager at WCC. He in turn contacted Honda Customer Service (310-532-9811). They replied to him that there were no bulletins concerning this problem and that they inspected several windshields. They claim that all the windshields had distortions. They have offered to give me a full refund. What bothers me is two things. First, the stock windshield has no optical distortion. Second, it appears that Honda knows that it is selling a less than perfect product and is apparently unconcerned about it (seems like a strange way to do business). Perhaps my windshield is the worst one ever made, but they made no offer to inspect mine and compare to others that they have in stock. I am going to call Honda on Monday and raise the issues of safety and quality. I will ask them if they have a problem with me forwarding their position to publications such as Cycle World, Rider, etc. Dennis Gaffney Marlboro, NY gaffneydp@aol.com 1994 PC800 Bought used in 1997 (2000 miles) Modifications: tall windshield? --part0_893950130_boundary Content-ID: <0_893950130@inet_out.mail.aol.com.2> Content-type: message/rfc822 Content-transfer-encoding: 7bit Content-disposition: inline Return-Path: Received: from rly-za04.mx.aol.com (rly-za04.mail.aol.com [172.31.36.100]) by air-za04.mail.aol.com (v42.4) with SMTP; Wed, 29 Apr 1998 09:14:18 -0400 Received: from sina.hpc.uh.edu (Sina.HPC.UH.EDU [129.7.3.5]) by rly-za04.mx.aol.com (8.8.5/8.8.5/AOL-4.0.0) with ESMTP id JAA27623; Wed, 29 Apr 1998 09:14:08 -0400 (EDT) Received: from sina.hpc.uh.edu (lists@Sina.HPC.UH.EDU [129.7.3.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25294; Wed, 29 Apr 1998 08:14:23 -0500 (CDT) Received: by sina.hpc.uh.edu (TLB v0.09a (1.20 tibbs 1996/10/09 22:03:07)); Wed, 29 Apr 1998 08:14:20 -0500 (CDT) Received: from donald.cybercomm.nl (donald.cybercomm.nl [194.235.113.5]) by sina.hpc.uh.edu (8.7.3/8.7.3) with ESMTP id IAA25275 for ; Wed, 29 Apr 1998 08:14:11 -0500 (CDT) Received: from default (poort22-ip-x2.enertel.cybercomm.nl [194.235.118.22]) by donald.cybercomm.nl (8.8.6/8.8.6) with ESMTP id OAA25676 for ; Wed, 29 Apr 1998 14:12:10 -0100 (MET) Message-Id: <199804291512.OAA25676@donald.cybercomm.nl> From: "Emile Nossin" To: "PC800" Subject: Re: PC800: Tall Hondaline Windshield Distortion Date: Wed, 29 Apr 1998 15:13:20 +0200 X-MSMail-Priority: Normal X-Priority: 3 X-Mailer: Microsoft Internet Mail 4.70.1155 Sender: owner-pc800@hpc.uh.edu Precedence: list X-Majordomo: 1.94.jlt7 Mime-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: quoted-printable Hi Pat, I don't see any distortion in my tall Honda screen, nor any maginfication= -- Visit the PC800 web page at To unsubscribe from the list, send "unsubscribe pc800" in the body of a message to majordomo@hpc.uh.edu. To report problems, send mail to pc800-owner@hpc.uh.edu. MIME-tools-5.515/testin/sig20000644000175000017500000000030410677325674013643 0ustar dfsdfs ___ _ _ _ _ ___ _ / _ \| '_| | | |/ _ ' / eryq@enteract.com | __/| | | |_| | |_| | \___||_| \__, |\__, |__ This SECOND signature inserted by MIME-tools |___/ |___/ MIME-tools-5.515/testin/multi-igor.msg0000644000175000017500000002451410677325674015665 0ustar dfsdfsDate: Thu, 6 Jun 1996 15:50:39 +0400 (MOW DST) From: Starovoitov Igor To: eryq@rhine.gsfc.nasa.gov Subject: Need help MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-490585488-806670346-834061839=:2195" This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. Send mail to mime@docserver.cac.washington.edu for more info. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII Dear Sir, I have a problem with Your MIME-Parser-1.9 and multipart-nested messages. Not all parts are parsed. Here my Makefile, Your own multipart-nested.msg and its out after "make test". Some my messages not completely parsed too. Is this a bug? Thank You for help. Igor Starovoytov. ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name=Makefile Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Makefile Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQ0KIyBNYWtlZmlsZSBmb3IgTUlNRTo6DQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCiMgV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFy aWVzOg0KU0lURV9QRVJMID0gL3Vzci9saWIvcGVybDUNCg0KIyBXaGF0IFBl cmw1IGlzIGNhbGxlZCBvbiB5b3VyIHN5c3RlbSAobm8gbmVlZCB0byBnaXZl IGVudGlyZSBwYXRoKToNClBFUkw1ICAgICA9IHBlcmwNCg0KIyBZb3UgcHJv YmFibHkgd29uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlc2UuLi4NCk1PRFMgICAg ICA9IERlY29kZXIucG0gRW50aXR5LnBtIEhlYWQucG0gUGFyc2VyLnBtIEJh c2U2NC5wbSBRdW90ZWRQcmludC5wbQ0KU0hFTEwgICAgID0gL2Jpbi9zaA0K DQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQojIEZvciBpbnN0YWxsZXJzLi4uDQojLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tDQoNCmhlbHA6CQ0KCUBlY2hvICJWYWxpZCB0YXJnZXRz OiB0ZXN0IGNsZWFuIGluc3RhbGwiDQoNCmNsZWFuOg0KCXJtIC1mIHRlc3Rv dXQvKg0KDQp0ZXN0Og0KIwlAZWNobyAiVEVTVElORyBIZWFkLnBtLi4uIg0K Iwkke1BFUkw1fSBNSU1FL0hlYWQucG0gICA8IHRlc3Rpbi9maXJzdC5oZHIg ICAgICAgPiB0ZXN0b3V0L0hlYWQub3V0DQojCUBlY2hvICJURVNUSU5HIERl Y29kZXIucG0uLi4iDQojCSR7UEVSTDV9IE1JTUUvRGVjb2Rlci5wbSA8IHRl c3Rpbi9xdW90LXByaW50LmJvZHkgPiB0ZXN0b3V0L0RlY29kZXIub3V0DQoj CUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAoc2ltcGxlKS4uLiINCiMJJHtQ RVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0aW4vc2ltcGxlLm1zZyAgICAg ID4gdGVzdG91dC9QYXJzZXIucy5vdXQNCiMJQGVjaG8gIlRFU1RJTkcgUGFy c2VyLnBtIChtdWx0aXBhcnQpLi4uIg0KIwkke1BFUkw1fSBNSU1FL1BhcnNl ci5wbSA8IHRlc3Rpbi9tdWx0aS0yZ2lmcy5tc2cgPiB0ZXN0b3V0L1BhcnNl ci5tLm91dA0KCUBlY2hvICJURVNUSU5HIFBhcnNlci5wbSAobXVsdGlfbmVz dGVkLm1zZykuLi4iDQoJJHtQRVJMNX0gTUlNRS9QYXJzZXIucG0gPCB0ZXN0 aW4vbXVsdGktbmVzdGVkLm1zZyA+IHRlc3RvdXQvUGFyc2VyLm4ub3V0DQoJ QGVjaG8gIkFsbCB0ZXN0cyBwYXNzZWQuLi4gc2VlIC4vdGVzdG91dC9NT0RV TEUqLm91dCBmb3Igb3V0cHV0Ig0KDQppbnN0YWxsOg0KCUBpZiBbICEgLWQg JHtTSVRFX1BFUkx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJQbGVhc2UgZWRp dCB0aGUgU0lURV9QRVJMIGluIHlvdXIgTWFrZWZpbGUiOyBleGl0IC0xOyBc DQogICAgICAgIGZpICAgICAgICAgIA0KCUBpZiBbICEgLXcgJHtTSVRFX1BF Ukx9IF07IHRoZW4gXA0KCSAgICBlY2hvICJObyBwZXJtaXNzaW9uLi4uIHNo b3VsZCB5b3UgYmUgcm9vdD8iOyBleGl0IC0xOyBcDQogICAgICAgIGZpICAg ICAgICAgIA0KCUBpZiBbICEgLWQgJHtTSVRFX1BFUkx9L01JTUUgXTsgdGhl biBcDQoJICAgIG1rZGlyICR7U0lURV9QRVJMfS9NSU1FOyBcDQogICAgICAg IGZpDQoJaW5zdGFsbCAtbSAwNjQ0IE1JTUUvKi5wbSAke1NJVEVfUEVSTH0v TUlNRQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRm9yIGRldmVsb3BlciBv bmx5Li4uDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClBPRDJIVE1MX0ZMQUdTID0g LS1wb2RwYXRoPS4gLS1mbHVzaCAtLWh0bWxyb290PS4uDQpIVE1MUyAgICAg ICAgICA9ICR7TU9EUzoucG09Lmh0bWx9DQpWUEFUSCAgICAgICAgICA9IE1J TUUNCg0KLlNVRkZJWEVTOiAucG0gLnBvZCAuaHRtbA0KDQojIHYuMS44IGdl bmVyYXRlZCAzMCBBcHIgOTYNCiMgdi4xLjkgaXMgb25seSBiZWNhdXNlIDEu OCBmYWlsZWQgQ1BBTiBpbmdlc3Rpb24NCmRpc3Q6IGRvY3VtZW50ZWQJDQoJ VkVSU0lPTj0xLjkgOyBcDQoJbWtkaXN0IC10Z3ogTUlNRS1wYXJzZXItJCRW RVJTSU9OIDsgXA0KCWNwIE1LRElTVC9NSU1FLXBhcnNlci0kJFZFUlNJT04u dGd6ICR7SE9NRX0vcHVibGljX2h0bWwvY3Bhbg0KCQ0KZG9jdW1lbnRlZDog JHtIVE1MU30gJHtNT0RTfQ0KDQoucG0uaHRtbDoNCglwb2QyaHRtbCAke1BP RDJIVE1MX0ZMQUdTfSBcDQoJCS0tdGl0bGU9TUlNRTo6JCogXA0KCQktLWlu ZmlsZT0kPCBcDQoJCS0tb3V0ZmlsZT1kb2NzLyQqLmh0bWwNCg0KIy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQ0K ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="multi-nested.msg" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: test message TUlNRS1WZXJzaW9uOiAxLjANCkZyb206IExvcmQgSm9obiBXaG9yZmluIDx3 aG9yZmluQHlveW9keW5lLmNvbT4NClRvOiA8am9obi15YXlhQHlveW9keW5l LmNvbT4NClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQgbXVsdGlwYXJ0IGV4 YW1wbGUNCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KICAgICBi b3VuZGFyeT11bmlxdWUtYm91bmRhcnktMQ0KDQpUaGUgcHJlYW1ibGUgb2Yg dGhlIG91dGVyIG11bHRpcGFydCBtZXNzYWdlLg0KTWFpbCByZWFkZXJzIHRo YXQgdW5kZXJzdGFuZCBtdWx0aXBhcnQgZm9ybWF0DQpzaG91bGQgaWdub3Jl IHRoaXMgcHJlYW1ibGUuDQpJZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyB0ZXh0 LCB5b3UgbWlnaHQgd2FudCB0bw0KY29uc2lkZXIgY2hhbmdpbmcgdG8gYSBt YWlsIHJlYWRlciB0aGF0IHVuZGVyc3RhbmRzDQpob3cgdG8gcHJvcGVybHkg ZGlzcGxheSBtdWx0aXBhcnQgbWVzc2FnZXMuDQotLXVuaXF1ZS1ib3VuZGFy eS0xDQoNClBhcnQgMSBvZiB0aGUgb3V0ZXIgbWVzc2FnZS4NCltOb3RlIHRo YXQgdGhlIHByZWNlZGluZyBibGFuayBsaW5lIG1lYW5zDQpubyBoZWFkZXIg ZmllbGRzIHdlcmUgZ2l2ZW4gYW5kIHRoaXMgaXMgdGV4dCwNCndpdGggY2hh cnNldCBVUyBBU0NJSS4gIEl0IGNvdWxkIGhhdmUgYmVlbg0KZG9uZSB3aXRo IGV4cGxpY2l0IHR5cGluZyBhcyBpbiB0aGUgbmV4dCBwYXJ0Ll0NCg0KLS11 bmlxdWUtYm91bmRhcnktMQ0KQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBj aGFyc2V0PVVTLUFTQ0lJDQoNClBhcnQgMiBvZiB0aGUgb3V0ZXIgbWVzc2Fn ZS4NClRoaXMgY291bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIHByZXZpb3Vz IHBhcnQsDQpidXQgaWxsdXN0cmF0ZXMgZXhwbGljaXQgdmVyc3VzIGltcGxp Y2l0DQp0eXBpbmcgb2YgYm9keSBwYXJ0cy4NCg0KLS11bmlxdWUtYm91bmRh cnktMQ0KU3ViamVjdDogUGFydCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlz IG11bHRpcGFydCENCkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3BhcmFsbGVs Ow0KICAgICBib3VuZGFyeT11bmlxdWUtYm91bmRhcnktMg0KDQpBIG9uZS1s aW5lIHByZWFtYmxlIGZvciB0aGUgaW5uZXIgbXVsdGlwYXJ0IG1lc3NhZ2Uu DQotLXVuaXF1ZS1ib3VuZGFyeS0yDQpDb250ZW50LVR5cGU6IGltYWdlL2dp Zg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQpDb250ZW50 LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSIzZC1jb21wcmVzcy5n aWYiDQpTdWJqZWN0OiBQYXJ0IDEgb2YgdGhlIGlubmVyIG1lc3NhZ2UgaXMg YSBHSUYsICIzZC1jb21wcmVzcy5naWYiDQoNClIwbEdPRGRoS0FBb0FPTUFB QUFBQUFBQWdCNlEveTlQVDI1dWJuQ0FrS0JTTGI2K3Z1Zm41L1hlcy8rbEFQ LzZ6UUFBQUFBQQ0KQUFBQUFBQUFBQ3dBQUFBQUtBQW9BQUFFL2hESlNhdTll SkxNT3lZYmNveGthWjVvQ2tvSDZMNXdMTWZpV3FkNGJ0WmhteGJBDQpvRkNZ NDdFSXFNSmd5V3cyQVRqajdhUmtBcTVZd0RNbDlWR3RLTzBTaXVvaVRWbHNj c3h0OWM0SGdYeFVJQTBFQVZPVmZES1QNCjhIbDFCM2tEQVlZbGUyMDJYbkdH Z29NSGhZY2tpV1Z1UjMrT1RnQ0dlWlJzbG90d2dKMmxuWWlnZlpkVGpRVUxy N0FMQlpOMA0KcVR1cmpIZ0xLQXUwQjVXcW9wbTdKNzJldFFOOHQ4SWp1cnkr d010dnc4L0h2N1lsZnMwQnhDYkdxTW1LMHlPT1EwR1RDZ3JSDQoyYmh3Skds WEpRWUc2bU1Lb2VOb1dTYnpDV0lBQ2U1Snd4UW0zQWtEQWJVQVFDaVFoRFpF QmVCbDZhZmdDc09CckQ0NWVkSXYNClFjZUdXU01ldnBPWWhsNkNreWRCSGhC WlFtR0tqaWhWc2h5cGpCOUNsQUhaTVR1Z3pPVTdtemhCUGlTWjV1RE5uQTdi L2FUWg0KMG1oTW5mbDBwREJGYTZiVUVsU1BXYjBxdFl1SHJ4bHdjUjE3WXNX TXMyalRxbDNMRmtRRUFEcz0NCi0tdW5pcXVlLWJvdW5kYXJ5LTINCkNvbnRl bnQtVHlwZTogaW1hZ2UvZ2lmDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n OiBiYXNlNjQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5h bWU9IjNkLWV5ZS5naWYiDQpTdWJqZWN0OiBQYXJ0IDIgb2YgdGhlIGlubmVy IG1lc3NhZ2UgaXMgYW5vdGhlciBHSUYsICIzZC1leWUuZ2lmIg0KDQpSMGxH T0RkaEtBQW9BUE1BQUFBQUFBQUF6TjN1Lzc2K3ZvaUlpRzV1YnN6ZDd2Ly8v K2ZuNXdBQUFBQUFBQUFBQUFBQUFBQUENCkFBQUFBQUFBQUN3QUFBQUFLQUFv QUFBRS9oREpTYXU5ZUpiTU95NGJNb3hrYVo1b0Nrb0Q2TDV3TE1maVduczQx b1p0N2xNNw0KVnVqbkM5NklSVnNQV1FFNG54UGprdm1zUW11OG9jL0tCVVNW V2s3WGVwR0dMZU5yeG94Sk8xTWpJTGp0aGcva1dYUTZ3Ty83DQorM2RDZVJS amZBS0hpSW1KQVYrRENGMEJpVzVWQW8xQ0VsYVJoNU5qbGtlWW1weVRncGNU QUtHaWFhU2Zwd0twVlFheFZhdEwNCnJVOEdhUWRPQkFRQUI3K3lYbGlYVHJn QXhzVzR2RmFidjhCT3RCc0J0N2NHdndDSVQ5bk95TkVJeHVDNHpycUt6YzlY Yk9ESg0KdnM3WTVld0gzZDdGeGUzakI0cmo4dDZQdU5hNnIyYmhLUVhOMTdG WUNCTXFUR2lCelNOaHg1ZzBuRU1obHNTSmppUll2RGp3DQpFMGNkR3hRL2dz d29zb0tVa211VTJGbkpjc1NLR1RCanlweEpzeWFJQ0FBNw0KLS11bmlxdWUt Ym91bmRhcnktMi0tDQoNClRoZSBlcGlsb2d1ZSBmb3IgdGhlIGlubmVyIG11 bHRpcGFydCBtZXNzYWdlLg0KDQotLXVuaXF1ZS1ib3VuZGFyeS0xDQpDb250 ZW50LXR5cGU6IHRleHQvcmljaHRleHQNCg0KVGhpcyBpcyA8Ym9sZD5wYXJ0 IDQgb2YgdGhlIG91dGVyIG1lc3NhZ2U8L2JvbGQ+DQo8c21hbGxlcj5hcyBk ZWZpbmVkIGluIFJGQzEzNDE8L3NtYWxsZXI+PG5sPg0KPG5sPg0KSXNuJ3Qg aXQgPGJpZ2dlcj48YmlnZ2VyPmNvb2w/PC9iaWdnZXI+PC9iaWdnZXI+DQoN Ci0tdW5pcXVlLWJvdW5kYXJ5LTENCkNvbnRlbnQtVHlwZTogbWVzc2FnZS9y ZmM4MjINCg0KRnJvbTogKG1haWxib3ggaW4gVVMtQVNDSUkpDQpUbzogKGFk ZHJlc3MgaW4gVVMtQVNDSUkpDQpTdWJqZWN0OiBQYXJ0IDUgb2YgdGhlIG91 dGVyIG1lc3NhZ2UgaXMgaXRzZWxmIGFuIFJGQzgyMiBtZXNzYWdlIQ0KQ29u dGVudC1UeXBlOiBUZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTENCkNv bnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1wcmludGFibGUNCg0K UGFydCA1IG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIGl0c2VsZiBhbiBSRkM4 MjIgbWVzc2FnZSENCg0KLS11bmlxdWUtYm91bmRhcnktMS0tDQoNClRoZSBl cGlsb2d1ZSBmb3IgdGhlIG91dGVyIG1lc3NhZ2UuDQo= ---490585488-806670346-834061839=:2195 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="Parser.n.out" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: out from parser KiBXYWl0aW5nIGZvciBhIE1JTUUgbWVzc2FnZSBmcm9tIFNURElOLi4uDQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0NCkNvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVk DQpCb2R5LWZpbGU6IE5PTkUNClN1YmplY3Q6IEEgY29tcGxleCBuZXN0ZWQg bXVsdGlwYXJ0IGV4YW1wbGUNCk51bS1wYXJ0czogMw0KLS0NCiAgICBDb250 ZW50LXR5cGU6IHRleHQvcGxhaW4NCiAgICBCb2R5LWZpbGU6IC4vdGVzdG91 dC9tc2ctMzUzOC0xLmRvYw0KICAgIC0tDQogICAgQ29udGVudC10eXBlOiB0 ZXh0L3BsYWluDQogICAgQm9keS1maWxlOiAuL3Rlc3RvdXQvbXNnLTM1Mzgt Mi5kb2MNCiAgICAtLQ0KICAgIENvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L3Bh cmFsbGVsDQogICAgQm9keS1maWxlOiBOT05FDQogICAgU3ViamVjdDogUGFy dCAzIG9mIHRoZSBvdXRlciBtZXNzYWdlIGlzIG11bHRpcGFydCENCiAgICBO dW0tcGFydHM6IDINCiAgICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGlt YWdlL2dpZg0KICAgICAgICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1jb21w cmVzcy5naWYNCiAgICAgICAgU3ViamVjdDogUGFydCAxIG9mIHRoZSBpbm5l ciBtZXNzYWdlIGlzIGEgR0lGLCAiM2QtY29tcHJlc3MuZ2lmIg0KICAgICAg ICAtLQ0KICAgICAgICBDb250ZW50LXR5cGU6IGltYWdlL2dpZg0KICAgICAg ICBCb2R5LWZpbGU6IC4vdGVzdG91dC8zZC1leWUuZ2lmDQogICAgICAgIFN1 YmplY3Q6IFBhcnQgMiBvZiB0aGUgaW5uZXIgbWVzc2FnZSBpcyBhbm90aGVy IEdJRiwgIjNkLWV5ZS5naWYiDQogICAgICAgIC0tDQo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0NCg0K ---490585488-806670346-834061839=:2195-- MIME-tools-5.515/t/0000755000175000017500000000000014612223175011776 5ustar dfsdfsMIME-tools-5.515/t/Misc.t0000644000175000017500000001011010677325674013065 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 14; use MIME::Head; use MIME::Parser; use Mail::Field; use MIME::Head; use MIME::Decoder::QuotedPrint; #------------------------------ # Bug 971008 from Michael W. Normandin : #------------------------------ # I've found something you may be interested in : # Header: # Content-Type: application/vnd.ms-powerpoint; name="June97V4.0.ppt" # Code: # $mtype = $pentity->head->mime_type; # print "$mytype\n"; # # Produces: # application/vnd # { my $head = MIME::Head->new([ 'Content-Type: application/vnd.ms-powerpoint; name="June97V4.0.ppt"' ]); is($head->mime_type, "application/vnd.ms-powerpoint", "bug 971008-MWN: are MIME attributes parsed ok?"); } #------------------------------ # Bug 970822 from Anselm Lingnau #------------------------------ # use Mail::Field; # use MIME::Head; # $field = Mail::Field->new('Content-type', 'text/HTML; charset="US-ASCII"'); # print $field->type, "\n"; # # but all I see is: # # Can't locate object method "parse" via package "Mail::Field::ContType" # at /local/pkg/perl/5.004/lib/site_perl/Mail/Field.pm line 306. # # I suppose this has to do with the fact that it is `MIME::Field' rather # than `Mail::Field', but I am at a loss as to what to do next. Maybe you # can help? Thank you very much. { my $field = Mail::Field->new('Content-type', 'text/HTML; charset="US-ASCII"'); is($field->paramstr('_'), "text/HTML", "bug 970822-AL: Mail::Field register problem (paramstr)"); is($field->type, "text/html", "bug 970822-AL: Mail::Field register problem (type)"); } #------------------------------ # Bug 970725 from Denis N. Antonioli #------------------------------ # Were it possible to incorporate the guideline #8 from RFC 2049? # The change involved is minim: just adding the 2 lines # $res =~ s/\./=2E/go; # $res =~ s/From /=46rom /go; # at the start of encode_qp_really in MIME::Decoder::QuotedPrint? # # Textual mode. { my $pair; foreach $pair (["From me", "=46rom me=\n"], [".", ".=\n"], # soft line-break [".\n", "=2E\n"], # line-break [" From you", " From you=\n"]) { my $out = MIME::Decoder::QuotedPrint::encode_qp_really($pair->[0], 1); is($out, $pair->[1], "bug 970725-DNA: QP use of RFC2049 guideline 8"); } } # Binary mode { my $pair; foreach $pair (["From me", "=46rom me=\n"], [".", ".=\n"], # soft line-break [".\n", ".=0A=\n"], # line-break [" From you", " From you=\n"]) { my $out = MIME::Decoder::QuotedPrint::encode_qp_really($pair->[0], 0); is($out, $pair->[1], "bug 970725-DNA: QP use of RFC2049 guideline 8"); } } #------------------------------ # Bug 970626 from Sun, Tong #------------------------------ # @history = $head->get_all('Received'); # # The above code does not work. It confused me at the beginning. Then, I # found out it is only a spelling error: when I changed the 'Received' to # 'received', it works ( you know why ). { my $head = MIME::Head->new(["Received: first\n", "Received: second\n", "received: third\n", "Received: fourth\n", "subject: hi!\n"]); my @received = $head->get_all('Received'); is(scalar @received, 4, "bug 970626-TS: header get_all() case problem fixed?"); } #------------------------------ # Bug 980430 from Jason L Tibbitts III #------------------------------ # Boundary-parsing errors for this message. { my $parser = new MIME::Parser; $parser->output_to_core('ALL'); my $e = eval { $parser->parse_open("testin/jt-0498.msg") }; is(scalar $e->parts, 2, "bug 980430-JT: did we get 2 parts?"); } # Bug reported by Marcel Brouillet. MT 5.416 would parse as a single part. { my $parser = new MIME::Parser; $parser->output_to_core('ALL'); my $e = eval { $parser->parse_open("testin/twopart.msg") }; is( scalar $e->parts, 2, "bug: did we get 2 parts?"); } 1; MIME-tools-5.515/t/Globby.pm0000644000175000017500000000124210677325674013567 0ustar dfsdfspackage Globby; # More-portable but limited glob(). It does what we need. use Exporter; use vars qw(@ISA @EXPORT); @ISA = qw(Exporter); @EXPORT = qw(globby); sub globby { my $globpath = shift; # full glob my %r = ('.'=>'\.', '*'=>'.*', '?'=>'.'); # Get directory and regexp: my ($dir, $glob) = ($globpath =~ m{^(.*?)/?([^/]+\Z)}); defined($dir) or $dir = ''; my $re = $glob; $re =~ s{([\.\*\?])}{$r{$1}}g; # Get files which match pattern: my @f; if (opendir DIR, $dir) { @f = grep /^$re\Z/, sort(readdir(DIR)); closedir DIR; } # Return as full paths: map { ($dir ne '') ? "$dir/$_" : $_} @f; } 1; MIME-tools-5.515/t/ticket-80433.t0000644000175000017500000000051412046017063014121 0ustar dfsdfsuse strict; use warnings; use Test::More tests => 2; # proper quoting of params and parsing them use MIME::Field::ParamVal; my $field = MIME::Field::ParamVal->parse( 'inline; filename="f\oo\"bar\"b\az\\\\"' ); is($field->param('filename'), 'foo"bar"baz\\'); is($field->stringify, 'inline; filename="foo\\"bar\\"baz\\\\"'); MIME-tools-5.515/t/ticket-41632.t0000644000175000017500000000246611521635536014137 0ustar dfsdfsuse strict; use warnings; use Test::More tests => 6; # Handle the case of both RFC-2231 and non-RFC-2231 parameter values. # In this case, we ignore the non-RFC-2231 parameters use MIME::Field::ParamVal; use MIME::WordDecoder; my $params; my $wd = supported MIME::WordDecoder 'UTF-8'; $params = MIME::Field::ParamVal->parse_params('inline; filename="foo"; filename*1="ar"; filename*0="b"'); is($params->{'_'}, 'inline', 'Got the "inline" right'); is($wd->decode($params->{'filename'}), 'bar', 'Ignored non-RFC-2231 value if RFC-2231 parameters are present'); $params = MIME::Field::ParamVal->parse_params('inline; filename="foo"'); is($wd->decode($params->{'filename'}), 'foo', 'Got filename if RFC-2231 parameters are absent'); $params = MIME::Field::ParamVal->parse_params('inline; filename*1="ar"; filename*0="b"'); is($wd->decode($params->{'filename'}), 'bar', 'Got RFC-2231 value'); $params = MIME::Field::ParamVal->parse_params('inline; filename*1="ar"; filename="foo"; filename*0="b"'); is($wd->decode($params->{'filename'}), 'bar', 'Ignored non-RFC-2231 value if RFC-2231 parameters are present'); $params = MIME::Field::ParamVal->parse_params('inline; filename*1="ar"; filename*0="b"; filename="foo"'); is($wd->decode($params->{'filename'}), 'bar', 'Ignored non-RFC-2231 value if RFC-2231 parameters are present'); MIME-tools-5.515/t/BodyPrint.t0000644000175000017500000000107410712346526014102 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 7; use MIME::Body; use MIME::Tools; my $body = MIME::Body::InCore->new("hi\n"); my $fh = $body->open("r"); my @ary = <$fh>; $fh->close(); is(scalar(@ary), 1); is($ary[0], "hi\n"); $body = MIME::Body::InCore->new(\"hi\n"); $fh = $body->open("r"); @ary = <$fh>; $fh->close(); is(scalar(@ary), 1); is($ary[0], "hi\n"); $body = MIME::Body::InCore->new(["line 1\n", "line 2\n"]); $fh = $body->open("r"); @ary = <$fh>; $fh->close(); is(scalar(@ary), 2); is($ary[0], "line 1\n"); is($ary[1], "line 2\n"); MIME-tools-5.515/t/Body.t0000644000175000017500000000460214121157257013064 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 30; use MIME::Body; use MIME::Tools; use Cwd; # Check bodies: my @bodies = ( MIME::Body::Scalar->new(), MIME::Body::File->new('./testout/fbody'), MIME::Body::InCore->new(), ); my $buf; my @lines; my $line; my $pos; foreach my $body ( @bodies ) { my $io; my $class = ref($body); # diag("Checking class: ", ref($body)); # Open body for writing, and write stuff: $io = $body->open("w"); ok($io, "$class: opened for writing"); $io->print("Line 1\nLine 2\nLine 3"); $io->close; # Open body for reading: $io = $body->open("r"); ok($io, "$class: able to open body for reading?"); # Read all lines: @lines = $io->getlines; ok((($lines[0] eq "Line 1\n") && ($lines[1] eq "Line 2\n") && ($lines[2] eq "Line 3")), "$class: getlines method works?" ); # Seek forward, read: $io->seek(3, 0); $io->read($buf, 3); is($buf, 'e 1', "$class: seek(SEEK_START) plus read works?"); # Tell, seek, and read: $pos = $io->tell; $io->seek(-5, 1); $pos = $io->tell; is($pos, 1, "$class: tell and seek(SEEK_CUR) works?"); $io->read($buf, 5); is($buf, 'ine 1', "$class: seek(SEEK_CUR) plus read works?"); # Read all lines, one at a time: @lines = (); $io->seek(0, 0); while ($line = $io->getline()) { push @lines, $line } ok((($lines[0] eq "Line 1\n") && ($lines[1] eq "Line 2\n") && ($lines[2] eq "Line 3")), "$class: getline works?" ); # Done! $io->close; # Slurp lines: @lines = $body->as_lines; ok((($lines[0] eq "Line 1\n") && ($lines[1] eq "Line 2\n") && ($lines[2] eq "Line 3")), "$class: as_lines works?" ); # Slurp string: my $str = $body->as_string; is($str, "Line 1\nLine 2\nLine 3", "$class: as_string works?"); } # Check that we can open files with leading whitespace in name # (RT ticket #22680) { my $cwd = cwd(); # Untaint if ($cwd =~ /^(.*)$/) { $cwd = $1; } ok( chdir './testout', 'chdir to ./testout to avoid clutter'); eval { my $body = MIME::Body::File->new(" bad file "); my $fh = $body->open('w'); $fh->close(); ok( -e ' bad file ', 'file created with leading whitespace, as expected'); unlink(' bad file '); }; ok( chdir $cwd, 'chdir back'); } 1; MIME-tools-5.515/t/Decoder.t0000644000175000017500000000426314121167747013544 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More; use File::Spec; use MIME::Tools; use MIME::Decoder; #------------------------------------------------------------ # BEGIN #------------------------------------------------------------ # Is gzip available? Quick and dirty test: my $has_gzip; foreach (split $^O eq "MSWin32" ? ';' : ':', $ENV{PATH}) { last if ($has_gzip = -x "$_/gzip"); } if ($has_gzip) { require MIME::Decoder::Gzip64; install MIME::Decoder::Gzip64 'x-gzip64'; } # Get list of encodings we think we provide: my @encodings = ('base64', 'quoted-printable', '7bit', '8bit', 'binary', ($has_gzip ? 'x-gzip64' : ()), 'x-uuencode', 'binhex'); plan( tests => scalar @encodings); # Report what tests we may be skipping: diag($has_gzip ? "Using gzip: $has_gzip" : "No gzip: skipping x-gzip64 test"); # Test each encoding in turn: my ($e, $eno) = (undef, 0); foreach $e (@encodings) { ++$eno; my $warning; local $SIG{__WARN__} = sub { $warning = $@; }; my $decoder = MIME::Decoder->new($e); unless(defined($decoder)) { my $msg = "Encoding/decoding of $e not supported -- skipping test"; if( $warning =~ /^Can't locate ([^\s]+)/ ) { $msg .= " (Can't locate $1)"; } pass($msg); next; } my $infile = File::Spec->catfile('.', 'testin', 'fun.txt'); my $encfile = File::Spec->catfile('.', 'testout', "fun.en$eno"); my $decfile = File::Spec->catfile('.', 'testout', "fun.de$eno"); # Encode: open IN, "<$infile" or die "open $infile: $!"; open OUT, ">$encfile" or die "open $encfile: $!"; binmode IN; binmode OUT; $decoder->encode(\*IN, \*OUT) or next; close OUT; close IN; # Decode: open IN, "<$encfile" or die "open $encfile: $!"; open OUT, ">$decfile" or die "open $decfile: $!"; binmode IN; binmode OUT; $decoder->decode(\*IN, \*OUT) or next; close OUT; close IN; # Can we compare? if ($e =~ /^(binhex|base64|quoted-printable|binary|x-gzip64|x-uuencode)$/i) { is(-s $infile, -s $decfile, "Encoding/decoding of $e: size of $infile == size of $decfile"); } else { pass("Encoding/decoding of $e: size not comparable, marking pass anyway"); } } MIME-tools-5.515/t/Parser.t0000644000175000017500000001173610723116613013424 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 31; use MIME::Tools; use lib "./t"; use Globby; use MIME::Parser; # Set the counter, for filenames: my $Counter = 0; # Check and clear the output directory: my $DIR = "./testout"; ((-d $DIR) && (-w $DIR)) or die "no output directory $DIR"; unlink globby("$DIR/[a-z]*"); #------------------------------------------------------------ # BEGIN #------------------------------------------------------------ my $parser; my $entity; my $msgno; my $infile; my $type; my $enc; #------------------------------------------------------------ package MyParser; @MyParser::ISA = qw(MIME::Parser); sub output_path { my ($parser, $head) = @_; # Get the recommended filename: my $filename = $head->recommended_filename; if (defined($filename) && $parser->evil_filename($filename)) { ## diag("Parser.t: ignoring an evil recommended filename ($filename)"); $filename = undef; # forget it: it was evil } if (!defined($filename)) { # either no name or an evil name ++$Counter; $filename = "message-$Counter.dat"; } # Get the output filename: my $outdir = $parser->output_dir; "$outdir/$filename"; } package main; #------------------------------------------------------------ $parser = new MyParser; $parser->output_dir($DIR); #------------------------------------------------------------ ##diag("Read a nested multipart MIME message"); #------------------------------------------------------------ open IN, "./testmsgs/multi-nested.msg" or die "open: $!"; $entity = $parser->parse(\*IN); ok($entity, "parse of nested multipart"); #------------------------------------------------------------ ##diag("Check the various output files"); #------------------------------------------------------------ is(-s "$DIR/3d-vise.gif", 419, "vise gif size ok"); is(-s "$DIR/3d-eye.gif" , 357, "3d-eye gif size ok"); for $msgno (1..4) { ok(-s "$DIR/message-$msgno.dat", "message $msgno has a size"); } #------------------------------------------------------------ ##diag("Same message, but CRLF-terminated and no output path hook"); #------------------------------------------------------------ $parser = new MIME::Parser; $parser->output_dir($DIR); open IN, "./testmsgs/multi-nested2.msg" or die "open: $!"; $entity = $parser->parse(\*IN); ok($entity, "parse of CRLF-terminated message"); #------------------------------------------------------------ ##diag("Read a simple in-core MIME message, three ways"); #------------------------------------------------------------ my $data_scalar = <This is test one. EOF my $data_scalarref = \$data_scalar; my $data_arrayref = [ map { "$_\n" } (split "\n", $data_scalar) ]; $parser->output_to_core('ALL'); foreach my $data_test ($data_scalar, $data_scalarref, $data_arrayref) { $entity = $parser->parse_data($data_test); isa_ok($entity, 'MIME::Entity'); is($entity->head->mime_type, 'text/html', 'type is text/html'); } $parser->output_to_core('NONE'); #------------------------------------------------------------ ##diag("Simple message, in two parts"); #------------------------------------------------------------ $entity = $parser->parse_two("./testin/simple.msgh", "./testin/simple.msgb"); my $es = ($entity ? $entity->head->get('subject',0) : ''); like($es, qr/^Request for Leave$/, " parse of 2-part simple message (subj <$es>)"); # diag('new_tmpfile(), with real temp file'); { my $fh; eval { local $parser->{MP5_TmpToCore} = 0; $fh = $parser->new_tmpfile(); }; ok( ! $@, '->new_tmpfile() lives'); ok( $fh->print("testing\n"), '->print on fh ok'); ok( $fh->seek(0,0), '->seek on fh ok'); my $line = <$fh>; is( $line, "testing\n", 'Read line back in OK'); } # diag('new_tmpfile(), with in-core temp file'); { my $fh; eval { local $parser->{MP5_TmpToCore} = 1; $fh = $parser->new_tmpfile(); }; ok( ! $@, '->new_tmpfile() lives'); ok( $fh->print("testing\n"), '->print on fh ok'); ok( $fh->seek(0,0), '->seek on fh ok'); my $line = <$fh>; is( $line, "testing\n", 'Read line back in OK'); } # diag('new_tmpfile(), with temp files elsewhere'); { my $fh; eval { local $parser->{MP5_TmpDir} = $DIR; $fh = $parser->new_tmpfile(); }; ok( ! $@, '->new_tmpfile() lives'); ok( $fh->print("testing\n"), '->print on fh ok'); ok( $fh->seek(0,0), '->seek on fh ok'); my $line = <$fh>; is( $line, "testing\n", 'Read line back in OK'); } # diag('native_handle() on various things we might get'); { my $io_file_scalar = IO::File->new( do { my $foo = ''; \$foo }, '>:' ); ok( MIME::Parser::Reader::native_handle( $io_file_scalar ), 'FH on scalar is OK'); my $io_file_real = IO::File->new_tmpfile(); ok( MIME::Parser::Reader::native_handle( $io_file_real ), 'FH on real file is OK'); my $globref = \*STDOUT; ok( MIME::Parser::Reader::native_handle( $globref ), 'globref is OK'); } # diag('tmp_recycling() exists again, as a no-op'); { my $rc = $parser->tmp_recycling(1); is( $rc, undef, 'tmp_recycling no-op method returned undef'); } MIME-tools-5.515/t/ParamVal.t0000644000175000017500000000355112543007553013673 0ustar dfsdfsuse strict; use warnings; use Test::More tests => 13; use MIME::Field::ContType; use MIME::WordDecoder; use Encode; # Trivial test { my $field = Mail::Field->new('Content-type'); isa_ok( $field, 'MIME::Field::ParamVal'); isa_ok( $field, 'Mail::Field'); $field->param('_', 'stuff'); $field->param('answer', 42); is( $field->stringify, 'stuff; answer="42"', 'Object stringified to expected value'); } # Test for CPAN RT #34451 { my $header = 'stuff; answer*=utf-8\'\'%c3%be%20%c3%bf'; my $field = Mail::Field->new('Content-type'); $field->parse( $header ); is( $field->param('_'), 'stuff', 'Got body of header'); # We get it back in UTF-8! my $expected = pack('CCCCC', 0xc3, 0xbe, 0x20, 0xc3, 0xbf); my $wd = supported MIME::WordDecoder 'UTF-8'; is( encode('utf8', $wd->decode($field->param('answer'))), $expected, 'answer param was unpacked correctly'); } # Test for CPAN RT #105455 { my $header = 'attachment; filename=wookie.zip size=3; junk=cabbage'; my $field = Mail::Field->new('Content-type'); $field->parse( $header ); is( $field->param('_'), 'attachment', 'Got body of header'); is ($field->param('filename'), 'wookie.zip', 'Got correct filename'); is ($field->param('junk'), 'cabbage', 'Got correct final param'); $header = 'attachment; filename="wookie.zip size=3"'; $field = Mail::Field->new('Content-type'); $field->parse( $header ); is( $field->param('_'), 'attachment', 'Got body of header'); is ($field->param('filename'), 'wookie.zip size=3', 'Got correct filename'); $header = 'attachment; filename="wookie.zip;x=1"; (crap); (more_crap) adhesive=glueme'; $field = Mail::Field->new('Content-type'); $field->parse( $header ); is( $field->param('_'), 'attachment', 'Got body of header'); is ($field->param('filename'), 'wookie.zip;x=1', 'Got correct filename'); is ($field->param('adhesive'), 'glueme', 'Got correct final parameter'); } MIME-tools-5.515/t/02-kwalitee.t0000644000175000017500000000044612202447360014210 0ustar dfsdfsBEGIN { use Test::More; unless ($ENV{AUTHOR_TESTING}||$ENV{RELEASE_TESTING}) { plan(skip_all => 'These tests are for author or release candidate testing'); } } eval { require Test::Kwalitee; Test::Kwalitee->import() }; plan( skip_all => 'Test::Kwalitee not installed; skipping' ) if $@; MIME-tools-5.515/t/ticket-52924.t0000644000175000017500000000110411317205773014130 0ustar dfsdfsuse strict; use warnings; use Test::More tests => 2; # Ticket 52924: Ensure we add < > arround Content-ID header contents. use MIME::Entity; my $bare_id = '123456789.09876@host.example.com'; my $e = MIME::Entity->build( Path => "./testin/short.txt", Id => $bare_id, ); is( $e->head->mime_attr('content-id'), "<$bare_id>", '<> added around bare Id value when creating'); undef $e; $e = MIME::Entity->build( Path => "./testin/short.txt", Id => "<$bare_id>", ); is( $e->head->mime_attr('content-id'), "<$bare_id>", '<> not added around Id value when already present'); MIME-tools-5.515/t/ticket-71041.t0000644000175000017500000000101011636367431014117 0ustar dfsdfsuse Test::More tests => 1; use MIME::Parser; my $parser = MIME::Parser->new(); $parser->output_to_core(1); my $message = <<'EOF'; From: To: Subject: Ticket #71041 test Message-Id: MIME-Version: 1.0 Content-Type: text/plain This should parse properly. EOF # Set $\ to something wacky $\ = "\n"; my $entity = $parser->parse_data($message); my $head = $entity->head; is ($head->get('From'), "\n", 'Header was parsed as expected'); MIME-tools-5.515/t/ParserPreamble.t0000644000175000017500000000172411450700206015063 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 7; use Test::Deep; my %files = ( 'testmsgs/empty-preamble.msg' => [ '' ], 'testmsgs/multi-simple.msg' => [ "This is the preamble. It is to be ignored, though it\n", "is a handy place for mail composers to include an\n", "explanatory note to non-MIME conformant readers." ], 'testmsgs/ticket-60931.msg' => [ ], ); #-- Load MIME::Parser use_ok("MIME::Parser"); #-- Prepare parser my $parser = MIME::Parser->new(); $parser->output_to_core(1); $parser->decode_bodies(0); foreach my $file (keys %files) { #-- Parse quoted-printable encoded file open (my $fh, $file) or die "can't open testmsgs/empty-preamble.msg: $!"; my $entity = $parser->parse($fh); $fh->seek(0,0); my $expected = do { local $/; <$fh> }; close $fh; cmp_deeply( $entity->preamble(), $files{$file}, 'Preamble is as expected'); is( $entity->as_string(), $expected, 'File with preamble roundtripped correctly'); } 1; MIME-tools-5.515/t/Smtpsend.t0000644000175000017500000000420612202447360013757 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Config; use Test::More; $ENV{MAILDOMAIN}='example.com'; my $can_fork = $Config{d_fork} || $Config{d_pseudofork} || (($^O eq 'MSWin32' || $^O eq 'NetWare') and $Config{useithreads} and $Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/); if ($can_fork) { plan tests => 9; } else { plan skip_all => 'This system cannot fork'; } use MIME::Tools; use MIME::Entity; use IO::Socket::INET; # Listen on port 5225 to pretend to be an SMTP server my $sock = IO::Socket::INET->new(Listen => 5, LocalAddr => 'localhost:5225', ReuseAddr => 1, Type => SOCK_STREAM, Timeout => 10, Proto => 'tcp'); die("can't create socket: $!") unless $sock; my $top = MIME::Entity->build( Type => 'multipart/mixed', From => 'devnull@roaringpenguin.com', To => 'devnull@roaringpenguin.com', Subject => 'smtpsend test'); $top->attach( Data => 'plain', Type => 'text/plain'); my $pid = fork(); if (!defined($pid)) { die("fork() failed: $!"); } if (!$pid) { # In the child sleep(1); $top->smtpsend(Host => '127.0.0.1', Port => 5225); exit(0); } # In the parent my $s = $sock->accept(); if (!$s) { sleep(1); $s = $sock->accept(); if (!$s) { kill(9, $pid); die("accept failed: $!"); } } $s->print("220 Go ahead\n"); $s->flush(); my $line = $s->getline(); like($line, qr/^EHLO/i); $s->print("220 Hi there\n"); $s->flush(); $line = $s->getline(); like($line, qr/^MAIL/i); $s->print("220 OK\n"); $s->flush(); $line = $s->getline(); like($line, qr/^RCPT/i); $s->print("220 OK\n"); $s->flush(); $line = $s->getline(); like($line, qr/^DATA/i); $s->print("311 Send it\n"); $s->flush(); my $body = ''; while(<$s>) { last if ($_ =~ /^\./); $body .= $_; } $s->print("220 Got it all; thanks\n"); $s->flush(); $line = $s->getline(); like($line, qr/^QUIT/i); $s->print("220 See ya\n"); $s->flush(); $s->close(); my @lines = split("\n", $body); # Get the end of headers while($lines[0] ne "\r") { shift(@lines); } shift(@lines); is(scalar(@lines), 9); is($lines[0], "This is a multi-part message in MIME format...\r"); is($lines[3], "Content-Type: text/plain\r"); is($lines[7], "plain\r"); MIME-tools-5.515/t/ticket-22684.t0000644000175000017500000000256511366353621014144 0ustar dfsdfs#!/usr/bin/perl use Test::More tests => 3; use MIME::Decoder; use IO::File; # Ticket 22684 - use select() for IO multiplexing (to prevent filter() deadlock) SKIP: { skip "Need Proc::ProcessTable for this test", 3 unless eval "use Proc::ProcessTable; 1;"; require MIME::Decoder::Gzip64; install MIME::Decoder::Gzip64 'x-gzip64'; my $input_data = ''; for(1..(1024 * 512)) { $input_data .= chr(int(rand(256))); } my $input_fh = IO::File->new(\$input_data, '<:scalar'); my $output_data = ''; my $output_fh = IO::File->new(\$output_data, '>:scalar'); my $decoder = MIME::Decoder->new('x-gzip64'); eval { local $SIG{ALRM} = sub { die 'timeout' }; alarm(20); $decoder->encode( $input_fh, $output_fh ); alarm(0); }; my $error = ''; my $bad_kids = 0; if( $@ ) { $error = $@; my $pt = Proc::ProcessTable->new(); my @children = grep { $_->ppid == $$ } @{$pt->table()}; foreach my $c (@children) { diag('Killing wayward child '. $c->pid . ' (' . $c->cmndline . ')'); kill('TERM', $c->pid); $bad_kids++; } } # If we didn't deadlock, we should complete in a timely manner and produce # output. MIME-encoded gzipped randomness should be nearly as large, if not # larger, than the input data. unlike( $error, qr/^timeout/, '->encode completed within 20s'); is( $bad_kids, 0, 'No wayward gzip children'); cmp_ok( length($output_data), '>=', 400_000, 'Output data was generated'); } MIME-tools-5.515/t/Gauntlet.t0000644000175000017500000000543510677325674013773 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 63; use MIME::Parser; # Are on a machine where binmode matters? my $txtmode = "./testout/textmode"; open TEXTMODE, ">$txtmode" or die "open textmode file!"; print TEXTMODE "abc\ndef\nghi\n"; close TEXTMODE; my $uses_crlf = ((-s $txtmode) == 12) ? 0 : 1; # Actual length of message: my $MSGLEN = 669; my $MSGLINES = 20; my $MSGLEN_text = $MSGLEN + ($uses_crlf * $MSGLINES); # Gout... sub gout { my ($h, $ent) = @_; my $test; my $pos1; my $pos2; no strict 'refs'; my $sh = (ref($h) ? $h : \*$h); print $sh "\n", "=" x 30, " ", ($test = "ent->print"), "\n"; $pos1 = tell($sh); eval { $ent->print($h) }; $pos2 = tell($sh); ok((!$@ and (($pos2 - $pos1) == $MSGLEN_text)), "$h, $test [$pos1-$pos2 == $MSGLEN_text]"); print $sh "\n", "=" x 30, " ", ($test = "print ent->as_string"), "\n"; $pos1 = tell($sh); eval { print $h $ent->as_string }; $pos2 = tell($sh); ok((!$@ and (($pos2 - $pos1) == $MSGLEN_text)), "$h, $test [$pos1-$pos2]"); print $sh "\n", "=" x 30, " ", ($test = "ent->print_header"), "\n"; eval { $ent->print_header($h) }; ok(!$@, "$h, $test: $@"); print $sh "\n", "=" x 30, " ", ($test = "ent->print_body"), "\n"; eval { $ent->print_body($h) }; ok(!$@, "$h, $test: $@"); print $sh "\n", "=" x 30, " ", ($test = "ent->bodyhandle->print"), "\n"; eval { $ent->bodyhandle->print($h) }; ok(!$@, "$h, $test: $@"); print $sh "\n", "=" x 30, " ",($test = "print ent->bodyhandle->data"),"\n"; eval { print $h $ent->bodyhandle->data }; ok(!$@, "$h, $test: $@"); 1; } # Loops: # When adjusting these, make sure to increment test count. Should be: # 21 * scalar @corelims * scalar @msgfiles my @msgfiles = qw(simple.msg); my @corelims = qw(ALL NONE 512); # Create a parser: my $parser = new MIME::Parser; $parser->output_dir("./testout"); # For each message: my $msgfile; foreach $msgfile (@msgfiles) { my $corelim; foreach $corelim (@corelims) { # Set opt: $parser->output_to_core($corelim); # Parse: my $ent = $parser->parse_open("./testin/$msgfile"); my $out = "./testout/gauntlet.out"; my $outsize = 3201 + ($uses_crlf * 97); # Open output stream 1: open GOUT, ">$out" or die "$!"; gout('::GOUT', $ent); close GOUT; my $s1 = -s $out; is($s1, $outsize, "BARE FH: size $out ($s1) == $outsize?"); # Open output stream 2: open GOUT, ">$out" or die "$!"; gout(\*GOUT, $ent); close GOUT; my $s2 = -s $out; is($s2, $outsize, "GLOB ref: size $out ($s2) == $outsize?"); # Open output stream 3: my $GOUT = IO::File->new($out, '>') || die "$!"; gout($GOUT, $ent); $GOUT->close; my $s3 = -s $out; is($s3, $outsize, "IO::File: size $out ($s3) == $outsize?"); } } 1; MIME-tools-5.515/t/02-pod.t0000644000175000017500000000033710677325674013205 0ustar dfsdfsuse strict; use Test::More; eval "use Test::Pod 1.00"; plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; my @poddirs = qw( lib ); # Should probably be blib... all_pod_files_ok( all_pod_files( @poddirs ) ); MIME-tools-5.515/t/ticket-60931.t0000644000175000017500000000161611450700206014122 0ustar dfsdfs#!/usr/bin/perl use Test::More tests => 2; use MIME::Parser; # RT#60931: Printing of empty preamble added extra newline before first boundary my $original = do { local $/; }; close(DATA); my $generated = ''; my $fh = IO::File->new( \$generated, ">:" ); my $parser = MIME::Parser->new(); $parser->output_to_core(1); my $entity = $parser->parse_data($original); isa_ok( $entity, 'MIME::Entity'); $entity->print($fh); $fh->close; is( $original, $generated, 'Message with empty preamble roundtrips back to original'); __DATA__ MIME-Version: 1.0 Received: by 10.220.78.157 with HTTP; Thu, 26 Aug 2010 21:33:17 -0700 (PDT) Content-Type: multipart/alternative; boundary=90e6ba4fc6ea25d329048ec69d99 --90e6ba4fc6ea25d329048ec69d99 Content-Type: text/plain; charset=ISO-8859-1 HELLO --90e6ba4fc6ea25d329048ec69d99 Content-Type: text/html; charset=ISO-8859-1 HELLO
--90e6ba4fc6ea25d329048ec69d99-- MIME-tools-5.515/t/Ref.t0000644000175000017500000001467213022304704012701 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More; use MIME::Tools; use File::Path; use File::Spec; use File::Basename; use MIME::WordDecoder qw(unmime); use lib qw( ./t/ ); use Globby; use MIME::Parser; #print STDERR "\n"; ### Verify directory paths: (-d "testout") or die "missing testout directory\n"; my $output_dir = File::Spec->catdir(".", "testout", "Ref_t"); ### Get messages to process: my @refpaths = @ARGV; if (!@refpaths) { opendir DIR, "testmsgs" or die "opendir: $!\n"; @refpaths = map { File::Spec->catfile(".", "testmsgs", $_) } grep /\w.*\.ref$/, readdir(DIR); closedir DIR; } plan( tests => 2 * scalar(@refpaths) ); ### For each reference: foreach my $refpath (@refpaths) { ### Get message: my $msgpath = $refpath; $msgpath =~ s/\.ref$/.msg/; # print STDERR " $msgpath\n"; ### HACK HACK HACK: MailTools behaviour has changed!!! if ($msgpath =~ /hdr-fakeout.msg$/ && $::Mail::Header::VERSION > 2.14) { $refpath = 'testmsgs/hdr-fakeout-newmailtools-ref'; } ### Get reference, as ref to array: my $ref = read_ref($refpath); if ($ref->{Parser}{Message}) { $msgpath = File::Spec->catfile(".", (split /\//, $ref->{Parser}{Message})); } # diag("Trying $refpath [$msgpath]\n"); ### Create parser which outputs to testout/scratch: my $parser = MIME::Parser->new; $parser->output_dir($output_dir); $parser->extract_nested_messages($ref->{Parser}{ExtractNested}); $parser->extract_uuencode($ref->{Parser}{ExtractUuencode}); $parser->output_to_core(0); $parser->ignore_errors(0); ### Set character set: my $tgt = $ref->{Parser}{Charset} || 'ISO-8859-1'; my $wd; if ($tgt =~ /^ISO-8859-(\d+)/) { $wd = new MIME::WordDecoder::ISO_8859 $1; } else { $wd = new MIME::WordDecoder([uc($tgt) => 'KEEP', 'US-ASCII' => 'KEEP', '*' => 'WARN']); } # diag("Default charset: $tgt"); MIME::WordDecoder->default($wd); ### Pre-clean: rmtree($output_dir); (-d $output_dir) or mkpath($output_dir) or die "mkpath $output_dir: $!\n"; ### Parse: my $ent = eval { $parser->parse_open($msgpath) }; my $parse_error = $@; ### Output parse log: # diag("PARSE LOG FOR $refpath [$msgpath]"); if ($parser->results) { # diag($parser->results->msgs); } else { diag("Parse failed before results object was created"); } ### Interpret results: if ($parse_error || !$ent) { ok($ref->{Msg}{Fail}, "$refpath, problem: $parse_error" ); } else { # TODO: check_ref is evil my $ok = eval { check_ref($msgpath, $ent, $ref) }; if( $@ ) { diag("Eval failed: $@"); } ok($ok, "$refpath Message => $msgpath, Parser => " . ($ref->{Parser}{Name} || 'default')); } ### Is purge working? my @a_files = list_dir($output_dir); my @p_files = $parser->filer->purgeable; $parser->filer->purge; my @z_files = list_dir($output_dir); is(@z_files, 0, 'Did purge work?'); ### Cleanup for real: rmtree($output_dir); } ### Done! exit(0); 1; #------------------------------ sub list_dir { my $dir = shift; opendir DIR, $dir or die "opendir $dir; $!\n"; my @files = grep !/^\.+$/, readdir DIR; closedir DIR; return sort @files; } #------------------------------ sub read_ref { my $path = shift; open IN, "<$path" or die "open $path: $!\n"; my $expr = join('', ); close IN; my $ref = eval $expr; $@ and die "syntax error in $path\n"; $ref; } #------------------------------ sub trim { local $_ = shift; s/^\s*//; s/\s*$//; $_; } #------------------------------ # TODO: replace with cmp_deeply from Test::Deep? sub check_ref { my ($msgpath, $ent, $ref) = @_; my $wd = supported MIME::WordDecoder 'UTF-8'; ### For each Msg in the ref: MSG: foreach my $partname (sort keys %$ref) { $partname =~ /^(Msg|Part_)/ or next; my $msg_ref = $ref->{$partname}; my $part = get_part($ent, $partname) || die "no such part: $partname\n"; my $head = $part->head; $head->unfold; my $body = $part->bodyhandle; ### For each attribute in the Msg: ATTR: foreach (sort keys %$msg_ref) { my $want = $msg_ref->{$_}; my $got = undef; if (/^Boundary$/) { $got = $head->multipart_boundary; } elsif (/^From$/) { $got = trim($head->get("From", 0)); $want = trim($want); } elsif (/^To$/) { $got = trim($head->get("To", 0)); $want = trim($want); } elsif (/^Subject$/) { $got = trim($head->get("Subject", 0)); $want = trim($want); } elsif (/^Charset$/) { $got = $head->mime_attr("content-type.charset"); } elsif (/^Disposition$/) { $got = $head->mime_attr("content-disposition"); } elsif (/^Type$/) { $got = $head->mime_type; } elsif (/^Encoding$/) { $got = $head->mime_encoding; } elsif (/^Filename$/) { $got = $head->recommended_filename; } elsif (/^BodyFilename$/) { $got = (($body and $body->path) ? basename($body->path) : undef); } elsif (/^Preamble$/) { $got = join('', @{$part->preamble}); } elsif (/^Epilogue$/) { $got = join('', @{$part->epilogue}); } elsif (/^Size$/) { if ($head->mime_type =~ m{^(text|message)}) { # diag("Skipping Size evaluation in text message ". # "due to variations in local newline ". # "conventions\n\n"); next ATTR; } if ($body and $body->path) { $got = (-s $body->path) } } else { die "$partname: unrecognized reference attribute: $_\n"; } ### Log this sub-test: # diag("SUB-TEST: msg=$msgpath; part=$partname; attr=$_:\n"); # diag(" want: ".encode($want)."\n"); # diag(" got: ".encode($got )."\n"); # diag("\n"); next ATTR if (!defined($want) and !defined($got)); next ATTR if ($want eq $got); die "$partname: wanted qq{$want}, got qq{$got}\n"; } } 1; } # Encode a string sub encode { local $_ = shift; return '' if !defined($_); s{([\n\t\x00-\x1F\x7F-\xFF\\\"])} {'\\'.sprintf("%02X",ord($1)) }exg; s{\\0A}{\\n}g; return qq{"$_"}; } #------------------------------ sub get_part { my ($ent, $name) = @_; if ($name eq 'Msg') { return $ent; } elsif ($name =~ /^Part_(.*)$/) { my @path = split /_/, $1; my $part = $ent; while (@path) { my $i = shift @path; $part = $part->parts($i - 1); } return $part; } undef; } 1; MIME-tools-5.515/t/ambiguous-parse.t0000644000175000017500000000573414560477015015305 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::Deep; use Test::More tests => 20; use MIME::Entity; use MIME::Parser; use lib qw( ./t ); my $parser = MIME::Parser->new(); $parser->output_to_core(1); my $entity = $parser->parse_open('testmsgs/double-boundary.msg'); my $ans = $entity->head->mime_attr('content-type.@duplicate_parameters'); cmp_deeply($ans, ['boundary'], 'Duplicate "boundary" parameter was detected in bad message'); ok($parser->ambiguous_content(), 'Ambiguous content was detected in bad message'); ok($entity->ambiguous_content(), 'Entity method matches parser method'); $entity = $parser->parse_open('testmsgs/attachment-filename-encoding-UTF8.msg'); $ans = $entity->head->mime_attr('content-type.@duplicate_parameters'); ok(!defined($ans), 'No duplicate "boundary" parameter was detected in good message'); ok(!$parser->ambiguous_content(), 'Ambiguous content was not detected in good message'); ok(!$entity->ambiguous_content(), 'Entity method matches parser method'); $entity = $parser->parse_open('testmsgs/double-content-type.msg'); ok($parser->ambiguous_content(), 'Ambiguous content was detected in message with two Content-Type headers'); ok($entity->ambiguous_content(), 'Entity method matches parser method'); $entity = $parser->parse_open('testmsgs/double-content-transfer-encoding.msg'); ok($parser->ambiguous_content(), 'Ambiguous content was detected in message with two Content-Transfer-Encoding headers'); ok($entity->ambiguous_content(), 'Entity method matches parser method'); $entity = $parser->parse_open('testmsgs/double-content-disposition.msg'); ok($parser->ambiguous_content(), 'Ambiguous content was detected in message with two Content-Disposition headers'); ok($entity->ambiguous_content(), 'Entity method matches parser method'); ok(!$entity->head->ambiguous_content(), 'Ambiguous content is not in top-level part'); ok(!$entity->parts(0)->head->ambiguous_content(), '... or the first sub-part'); ok($entity->parts(1)->head->ambiguous_content(), '... but it is in the second sub-part'); $entity = $parser->parse_open('testmsgs/double-content-id.msg'); ok($parser->ambiguous_content(), 'Ambiguous content was detected in message with two Content-Id headers'); ok($entity->ambiguous_content(), 'Entity method matches parser method'); $entity = $parser->parse_open('testmsgs/double-content-disposition-param.msg'); ok($parser->ambiguous_content(), 'Ambiguous content was detected in message with duplicated Content-Disposition parameters'); ok($entity->ambiguous_content(), 'Entity method matches parser method'); ### Now create an entity with ambiguous content $entity = MIME::Entity->build(From => 'x@example.org', To => 'y@example.org', 'Content-Disposition' => 'attachment; filename="foo"; filename="bar"', Type => 'text/plain', Data => ['Hello, world!']); ok($entity->ambiguous_content(), 'Newly-built entity correctly detects ambiguous content'); MIME-tools-5.515/t/WordEncoder.t0000644000175000017500000000513712102462716014402 0ustar dfsdfsuse strict; use warnings; use Test::More tests => 8; use MIME::Words qw(:all); is(encode_mimeword('wookie', 'Q', 'ISO-8859-1'), '=?ISO-8859-1?Q?wookie?='); is(encode_mimeword('François', 'Q', 'ISO-8859-1'), '=?ISO-8859-1?Q?Fran=E7ois?='); is(encode_mimewords('Me and François'), 'Me and =?ISO-8859-1?Q?Fran=E7ois?='); is(decode_mimewords('Me and =?ISO-8859-1?Q?Fran=E7ois?='), 'Me and François'); is(encode_mimewords('Me and François and François and François and François and François and François'), 'Me and =?ISO-8859-1?Q?Fran=E7ois=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois?='); is(decode_mimewords('Me and =?ISO-8859-1?Q?Fran=E7ois=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois?='), 'Me and François and François and François and François and François and François'); is(encode_mimewords('Me and François and François and François and François and François and François and wookie and wookie and wookie and wookie and wookie and wookie'), 'Me and =?ISO-8859-1?Q?Fran=E7ois=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20?=and wookie and wookie and wookie and wookie and wookie and wookie'); is(decode_mimewords('Me and =?ISO-8859-1?Q?Fran=E7ois=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?=and =?ISO-8859-1?Q?Fran=E7ois=20?=and wookie and wookie and wookie and wookie and wookie and wookie'), 'Me and François and François and François and François and François and François and wookie and wookie and wookie and wookie and wookie and wookie'); MIME-tools-5.515/t/ParserEncoded.t0000644000175000017500000000352110677325674014720 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More; plan tests => 5; main: { my ($fh, $mail_text, $entity, $parser); #-- Check whether Digest::MD5 is available my $has_md5 = eval "require Digest::MD5"; #-- Load MIME::Parser use_ok("MIME::Parser"); #-- Prepare parser $parser = MIME::Parser->new(); $parser->output_to_core(1); #-- Switch parser to encoded mode $parser->decode_bodies(0); #-- Parse quoted-printable encoded file $entity = parse_qp_file($parser); #-- Check if body is stored encoded ok($entity->bodyhandle->is_encoded, "Entity stored encoded"); #-- Check if MD5 resp. length match as expected $mail_text = $entity->as_string; if ( $has_md5 ) { my $md5 = Digest::MD5::md5_hex($mail_text); ok($md5 eq "a00f9b070d3153bbdc43d09a849730df", "Encoded MD5 match"); } else { my $len = length($mail_text); ok($len == 665, "Encoded length match"); } #-- Switch parser to decoded mode $parser->decode_bodies(1); #-- Parse quoted-printable encoded file $entity = parse_qp_file($parser); #-- Check if body is now stored decoded ok(!$entity->bodyhandle->is_encoded, "Entity stored decoded"); #-- Check if MD5 resp. length match as expected $mail_text = $entity->as_string; if ( $has_md5 ) { my $md5 = Digest::MD5::md5_hex($mail_text); ok($md5 eq "54a4ccb3a16f83e851581ffa5178f68a", "Decoded MD5 match"); } else { my $len = length($mail_text); ok($len == 609, "Decoded length match"); } } #-- Parse quoted printable file and return MIME::Entity sub parse_qp_file { my ($parser) = @_; open (my $fh, "testmsgs/german-qp.msg") or die "can't open testmsgs/german-qp.msg: $!"; my $entity = $parser->parse($fh); close $fh; return $entity; } 1; MIME-tools-5.515/t/ticket-119568.t0000644000175000017500000001142014612223067014217 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 4; use MIME::Entity; use MIME::Parser; use lib qw( ./t ); my $e = MIME::Entity->build(From => 'dianne@skoll.ca', To => 'dfs2@roaringpenguin.com', Subject => 'End-of-line test', Data => ["Line 1\n", "Line 2\n"],); my $str = $e->as_string(); is ($str, "Content-Type: text/plain\nContent-Disposition: inline\nContent-Transfer-Encoding: binary\nMIME-Version: 1.0\nX-Mailer: MIME-tools 5.515 (Entity 5.515)\nFrom: dianne\@skoll.ca\nTo: dfs2\@roaringpenguin.com\nSubject: End-of-line test\n\nLine 1\nLine 2\n", 'Got expected line endings'); my $delim = "\r\n"; $MIME::Entity::BOUNDARY_DELIMITER = $delim; $e = MIME::Entity->build(From => 'dianne@skoll.ca', To => 'dfs2@roaringpenguin.com', Subject => 'End-of-line test', Data => ["Line 1$delim", "Line 2$delim"],); $str = $e->as_string(); is ($str, "Content-Type: text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding: binary${delim}MIME-Version: 1.0${delim}X-Mailer: MIME-tools 5.515 (Entity 5.515)${delim}From: dianne\@skoll.ca${delim}To: dfs2\@roaringpenguin.com${delim}Subject: End-of-line test${delim}${delim}Line 1${delim}Line 2${delim}", 'Got expected line endings'); $e->attach(Data => ["More Text$delim"], Type => "text/plain"); $e = MIME::Entity->build(From => 'dianne@skoll.ca', To => 'dfs2@roaringpenguin.com', Subject => 'End-of-line test', Type => 'multipart/mixed', Boundary => 'foo'); $e->attach(Data => ["Text$delim"], Type => "text/plain"); $e->attach(Data => ["More Text$delim"], Type => "text/plain"); $str = $e->as_string(); is ($str, "Content-Type: multipart/mixed; boundary=\"foo\"${delim}Content-Transfer-Encoding: binary${delim}MIME-Version: 1.0${delim}X-Mailer: MIME-tools 5.515 (Entity 5.515)${delim}From: dianne\@skoll.ca${delim}To: dfs2\@roaringpenguin.com${delim}Subject: End-of-line test${delim}${delim}This is a multi-part message in MIME format...${delim}${delim}--foo${delim}Content-Type: text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding: binary${delim}${delim}Text${delim}${delim}--foo${delim}Content-Type: text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding: binary${delim}${delim}More Text${delim}${delim}--foo--${delim}", 'Got expected line endings'); $e = MIME::Entity->build(From => 'dianne@skoll.ca', To => 'dfs2@roaringpenguin.com', Subject => 'End-of-line test', Type => 'multipart/mixed', Boundary => 'foo'); $e->attach(Data => ["Text\n"], Type => "text/plain", Encoding => 'Base64'); $e->attach(Data => ["More Text\n", 'LongLine' x 120], Type => "text/plain", Encoding => 'Base64'); $str = $e->as_string(); is ($str, "Content-Type: multipart/mixed; boundary=\"foo\"${delim}Content-Transfer-Encoding: binary${delim}MIME-Version: 1.0${delim}X-Mailer: MIME-tools 5.515 (Entity 5.515)${delim}From: dianne\@skoll.ca${delim}To: dfs2\@roaringpenguin.com${delim}Subject: End-of-line test${delim}${delim}This is a multi-part message in MIME format...${delim}${delim}--foo${delim}Content-Type: text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding: Base64${delim}${delim}VGV4dAo=${delim}${delim}--foo${delim}Content-Type: text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding: Base64${delim}${delim}TW9yZSBUZXh0CkxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5l${delim}TG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVM${delim}b25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxv${delim}bmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9u${delim}Z0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25n${delim}TGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdM${delim}aW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xp${delim}bmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5l${delim}TG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVM${delim}b25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxv${delim}bmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9u${delim}Z0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25n${delim}TGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdM${delim}aW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xp${delim}bmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZQ==${delim}${delim}--foo--${delim}", 'Got expected line endings for Base64 encoding'); MIME-tools-5.515/t/ticket-37139.t0000644000175000017500000000602611511640147014133 0ustar dfsdfsuse strict; use warnings; use Test::More tests => 2; # Bug discovered by RJBS (rt.cpan.org, ticket 37139) # # Sometimes, when collapsing a message into single part, the # Content-type is horked up. # # It starts as: # # Content-Type: multipart/related; boundary=xyzzy; type=foo # # ...and ends as: # # Content-Type: text/plain; boundary=xyzzy; type=foo # use MIME::Parser; my $parser = MIME::Parser->new(); $parser->output_to_core(1); my $entity = $parser->parse(\*DATA); sub cleanup_mime { # Forcibly trash ->parts() to reproduce bug my ($entity) = @_; foreach my $part ($entity->parts) { cleanup_mime($part); $entity->parts([]); } } #diag( $entity->as_string); cleanup_mime($entity); #diag( $entity->as_string); is($entity->make_singlepart, 'DONE', 'make_singlepart() succeeded'); is($entity->head->get('Content-type'), "text/plain\n"); #diag( $entity->as_string); __DATA__ Received: from indigo.pobox.com (indigo.pobox.com [207.106.133.17]) by chiclet.listbox.com (Postfix) with ESMTP id 2AE91214A41 for ; Tue, 24 Jun 2008 01:22:44 -0400 (EDT) Received: from vip-2fed93075f2 (unknown [116.60.133.101]) by indigo.pobox.com (Postfix) with SMTP id 4DE1A6BF4D; Tue, 24 Jun 2008 01:22:30 -0400 (EDT) From: "ÕÅÃÈÉú"<ÕÅÃÈÉú> Reply-To: "h7w4v4c1@umail.hinet.net" To: "devnull@pobox.com" Subject: =?gb2312?B?uePW3crQwaq3or34s/a/2sOz0tfT0M/euavLvg==?= Date: Tue, 24 Jun 08 13:22:18 +0800 MIME-Version: 1.0 Content-type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_0015_1963AAAC.4C2B0004" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1158 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441 Message-Id: <20080624052230.4DE1A6BF4D@indigo.pobox.com> This is a multi-part message in MIME format. ------=_NextPart_000_0015_1963AAAC.4C2B0004 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0016_1963AAAC.4C2B0004" ------=_NextPart_001_0016_1963AAAC.4C2B0004 Content-Type: text/html; charset=gb2312 Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VO Ij4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgY29udGVudD1odHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29t L2ludGVsbGlzZW5zZS9pZTUgDQpuYW1lPXZzX3RhcmdldFNjaGVtYT4NCjxNRVRBIGh0dHAtZXF1aXY9 Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1nYjIzMTIiPg0KPE1FVEEgY29u dGVudD0iTVNIVE1MIDYuMDAuMjkwMC4zMzU0IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+DQo8Qk9EWSBz dHlsZT0iRk9OVC1TSVpFOiA5cHQ7IEZPTlQtRkFNSUxZOiDLzszlIj4NCjxQPsT6usMhPEJSPiZuYnNw OyZuYnNwOyCxvrmry77XqMPFzqq498Oz0tfJzLvyyfqy+rOnvNK0+sDtu/XO7734s/a/2rGoudihoiAN CsnMvOyhorWl1qShosjrstahorGoudjK1tD4oaLNz7O1oaLW0LjbLLT6sOy499bWsvq12NakyukuwarP tcjLo7rVxc/Iyfogyta7+jEzNjMyMjc4MzMyJm5ic3A7IFRFTDAyMC0zNzIzMjYwNiANCjYxMDMwOTY0 IEZBWDAyMC02MTAzMDUxNSC12Na3o7q549bdytDM7LrTx/jR4MHrwrcxMjC6xb3w0eC088/DIMjn09C0 8sjFx+u8+8HCITxCUj48L1A+PC9CT0RZPjwvSFRNTD4NCg== ------=_NextPart_001_0016_1963AAAC.4C2B0004-- ------=_NextPart_000_0015_1963AAAC.4C2B0004-- MIME-tools-5.515/t/Words.t0000644000175000017500000000236711063527075013274 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 20; use MIME::QuotedPrint qw(decode_qp); use MIME::Words qw( :all ); { local($/) = ''; open WORDS, ") { s{\A\s+|\s+\Z}{}g; # trim my ($isgood, $expect, $enc) = split /\n/, $_, 3; # Create the expected data $expect = eval $expect; my $dec = decode_mimewords($enc); if( $isgood eq 'GOOD' ) { ok( ! $@, 'No exceptions'); is( $dec, $expect, "$enc produced correct output"); } else { ok( $@, 'Got an exception as expected'); } } close WORDS; } # Test case for ticket 5462 { my $source = 'hé hé'; my $encoded = encode_mimewords($source, ('Encode' => 'Q', 'Charset' => 'iso-8859-1')); my $decoded = decode_mimewords($encoded); is( $decoded, $source, 'encode/decode of string with spaces matches original'); } # Second test case for ticket 5462 { my $source = 'Ñто ÑпециальныйÑабжект Ð´Ð»Ñ Ñ‚ÐµÑта ÑиÑтемы тикетов'; my $encoded = encode_mimewords($source, ('Encode' => 'Q', 'Charset' => 'utf8')); my $decoded = decode_mimewords($encoded); is( $decoded, $source, 'encode/decode of string with spaces matches original'); } # vim: set encoding=utf8 fileencoding=utf8: MIME-tools-5.515/t/EmptyPart.t0000644000175000017500000000134611004155416014106 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 6; use MIME::Tools; use lib "./t"; use Globby; use MIME::Parser; my $DIR = "./testout"; ((-d $DIR) && (-w $DIR)) or die "no output directory $DIR"; unlink globby("$DIR/[a-z]*"); my $parser = MIME::Parser->new(); $parser->output_dir($DIR); my $data = <parse_data($data); ok($entity, 'Got an entity'); is($entity->mime_type, 'multipart/alternative'); is($entity->parts, 3, 'Got three parts'); is($entity->parts(0)->mime_type, 'text/plain'); is($entity->parts(1)->mime_type, 'text/plain'); is($entity->parts(2)->mime_type, 'text/plain'); MIME-tools-5.515/t/ticket-65681.t0000644000175000017500000000141011527251155014132 0ustar dfsdfs#!/usr/bin/perl use Test::More tests => 2; use MIME::Parser; open(IN, ' }; close(IN); my $data_with_crlf = $data; # This one MUST have CRLF $data_with_crlf =~ s/\r\n|\n\r|\n|\r/\r\n/g; # This one MUST NOT have CRLF $data =~ s/\r\n|\n\r|\n|\r/\n/g; my $parser = MIME::Parser->new(); $parser->output_to_core(1); my $entity = $parser->parse_data($data); my $entity_crlf = $parser->parse_data($data_with_crlf); is ($entity->head->get('Subject', 0), $entity_crlf->head->get('Subject', 0), 'Headers unchanged by line-ending conventions'); is ($entity->head->get('Subject', 0), 'Request for Leave' . "\n", 'Got expected subject'); #print STDERR "\n\nMIME::tools version is " . $MIME::Tools::VERSION . "\n\n"; MIME-tools-5.515/t/obfuscated-zip.t0000644000175000017500000000075312225565154015113 0ustar dfsdfsuse strict; use warnings; use Test::More tests => 2; # Handle a missing type in the Content-Type: header use MIME::Parser; my $parser = MIME::Parser->new(); $parser->output_to_core(0); $parser->output_under("testout"); my $entity = $parser->parse_open("testmsgs/malformed-content-type-zip.msg"); is(scalar($entity->parts), 2, 'Entity has two parts'); is($entity->parts(1)->head->mime_attr('content-type.name'), 'payroll_report_429047_10092013.zip', 'Got expected attachment name'); 1; MIME-tools-5.515/t/WordDecoder.t0000644000175000017500000000225611527251155014372 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 22; use MIME::QuotedPrint qw(decode_qp); use MIME::WordDecoder; use utf8; binmode STDOUT, ":utf8"; binmode STDERR, ":utf8"; my $mwd = (new MIME::WordDecoder::ISO_8859 1); { local($/) = ''; open WORDS, ") { s{\A\s+|\s+\Z}{}g; # trim my ($isgood, $expect, $enc) = split /\n/, $_, 3; # Create the expected data $expect = eval $expect; my $dec = $mwd->decode($enc); if( $isgood eq 'GOOD' ) { ok( ! $@, 'No exceptions'); is( $dec, $expect, "$enc produced correct output"); } else { ok( $@, 'Got an exception as expected'); } } close WORDS; } my $wd = supported MIME::WordDecoder 'UTF-8'; my $perl_string = $wd->decode('To: =?ISO-8859-1?Q?J=F8rn?= '); is($perl_string, "To: J\x{00f8}rn ", 'Got back expected UTF-8 string'); is(utf8::is_utf8($perl_string), 1, 'Converted string has UTF-8 flag on'); $perl_string = mime_to_perl_string('To: =?ISO-8859-1?Q?J=F8rn?= '); is($perl_string, "To: J\x{00f8}rn ", 'Got back expected UTF-8 string'); is(utf8::is_utf8($perl_string), 1, 'Converted string has UTF-8 flag on'); MIME-tools-5.515/t/ticket-5462.t0000644000175000017500000000071712102462716014047 0ustar dfsdfsuse MIME::Words qw(:all); use MIME::WordDecoder; use Encode; my $s = "Служба поддержки"; use Test::More tests => 2; is(MIME::Words::encode_mimewords($s, Charset => 'utf-8'), '=?UTF-8?Q?=D0=A1=D0=BB=D1=83=D0=B6=D0=B1=D0=B0=20?= =?UTF-8?Q?=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8?='); is(decode_mimewords('=?UTF-8?Q?=D0=A1=D0=BB=D1=83=D0=B6=D0=B1=D0=B0=20?= =?UTF-8?Q?=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8?='), $s); MIME-tools-5.515/t/Entity.t0000644000175000017500000002263012404325547013445 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 39; use MIME::Entity; use MIME::Parser; use lib qw( ./t ); use Globby; # TODO: WTF? my $line; my $LINE; #diag("Testing build()"); {local $SIG{__WARN__} = sub { die "caught warning: ",@_ }; { my $e = MIME::Entity->build(Path => "./testin/short.txt"); my $name = 'short.txt'; my $got; #-----test------ $got = $e->head->mime_attr('content-type.name'); is($got, $name, 'Path: with no Filename, got default content-type.name'); #-----test------ $got = $e->head->mime_attr('content-disposition.filename'); is($got, $name, 'Path: with no Filename, got default content-disp.filename'); #-----test------ $got = $e->head->recommended_filename; is($got, $name, 'Path: with no Filename, got default recommended filename'); } { #-----test------ my $e = MIME::Entity->build(Path => "./testin/short.txt", Filename => undef); my $got = $e->head->mime_attr('content-type.name'); ok(!$got, 'Path: with explicitly undef Filename, got no filename'); my $x = $e->stringify(); my $version = $MIME::Entity::VERSION; my $desired = "Content-Type: text/plain\nContent-Disposition: inline\nContent-Transfer-Encoding: binary\nMIME-Version: 1.0\nX-Mailer: MIME-tools $version (Entity $version)\n\nDear «François Müller»,\n\nAs you requested, I have rewritten the MIME:: parser modules to support\nthe creation of MIME messages.\n\nEryq\n"; is($x, $desired, 'Tested stringify'); } { #-----test------ my $e = MIME::Entity->build(Path => "./testin/short.txt", Filename => "foo.txt"); my $got = $e->head->mime_attr('content-type.name'); is($got, "foo.txt", "Path: verified explicit 'Filename'" ); } { #-----test------ my $e = MIME::Entity->build(Path => "./testin/sig" ); my $got = $e->head->mime_attr('content-type'); is($got, 'text/plain', 'Type: default ok'); } { #-----test------ my $e = MIME::Entity->build(Path => "./testin/sig", Type => "text/foo"); my $got = $e->head->mime_attr('content-type'); is($got, 'text/foo', 'Type: explicit ok'); } { #-----test------ my $e = MIME::Entity->build(Path => "./testin/sig", Encoding => '-SUGGEST'); my $got = $e->head->mime_attr('content-transfer-encoding'); is($got, '7bit', 'Encoding: -SUGGEST yields 7bit'); } { #-----test------ my $e = MIME::Entity->build(Path => "./testin/short.txt", Encoding => '-SUGGEST'); my $got = $e->head->mime_attr('content-transfer-encoding'); is($got, 'quoted-printable', 'Encoding: -SUGGEST yields qp'); } { #-----test------ my $e = MIME::Entity->build(Type => 'image/gif', Path => "./testin/mime-sm.gif", Encoding => '-SUGGEST'); my $got = $e->head->mime_attr('content-transfer-encoding'); is($got, 'base64', 'Encoding: -SUGGEST yields base64'); } { #-----test------ my $e = MIME::Entity->build(Path => "./testin/short.txt" ); my $got = $e->head->mime_attr('content-type.charset'); ok(!$got, 'Charset: default ok'); } { #-----test------ my $e = MIME::Entity->build(Path => "./testin/short.txt", Charset => 'iso8859-1'); my $got = $e->head->mime_attr('content-type.charset'); is($got, 'iso8859-1', 'Charset: explicit'); } { #-----test------ my $croaked = 1; eval { my $e = MIME::Entity->build(Type => 'message/rfc822', Encoding => 'base64', Data => "Subject: phooey\n\nBlat\n"); $croaked = 0; }; ok($croaked, 'MIME::Entity->build croaked on message/rfc822 with base64 encoding'); ok($@ =~ /can't have encoding base64 for message type message\/rfc822/, 'and it croaked with expected error.'); } { #-----test------ my $croaked = 1; eval { my $e = MIME::Entity->build(Type => 'message/global', Encoding => 'base64', Data => "Subject: phooey\n\nBlat\n"); $croaked = 0; }; ok(!$croaked, 'MIME::Entity->build did not croak on message/global with base64 encoding'); } { #-----test------ my $croaked = 1; eval { my $e = MIME::Entity->build(Type => 'multipart/ALTERNATIVE', Encoding => 'base64', Data => "Subject: phooey\n\nBlat\n"); $croaked = 0; }; ok($croaked, 'MIME::Entity->build croaked on multipart/alternative with base64 encoding'); ok($@ =~ /can't have encoding base64 for message type multipart\/ALTERNATIVE/, 'and it croaked with expected error.'); } } #diag("Create an entity"); # Create the top-level, and set up the mail headers in a couple # of different ways: my $top = MIME::Entity->build(Type => "multipart/mixed", -From => "me\@myhost.com", -To => "you\@yourhost.com"); $top->head->add('subject', "Hello, nurse!"); $top->preamble([]); $top->epilogue([]); # Attachment #0: a simple text document: attach $top Path=>"./testin/short.txt"; # Attachment #1: a GIF file: attach $top Path => "./testin/mime-sm.gif", Type => "image/gif", Encoding => "base64", Disposition => "attachment"; # Attachment #2: a document we'll create manually: my $attach = new MIME::Entity; $attach->head(new MIME::Head ["X-Origin: fake\n", "Content-transfer-encoding: quoted-printable\n", "Content-type: text/plain\n"]); $attach->bodyhandle(new MIME::Body::Scalar); my $io = $attach->bodyhandle->open("w"); $io->print(<close; $top->add_part($attach); # Attachment #3: a document we'll create, not-so-manually: $LINE = "This is the first and last line, with no CR at the end."; $attach = attach $top Data=>$LINE; #-----test------ unlink globby("testout/entity.msg*"); #diag("Check body"); my $bodylines = $top->parts(0)->body; is( ref $bodylines, 'ARRAY', '->body returns an array reference'); is( scalar @$bodylines, 6, '... of the correct size'); my $preamble_str = join '', @{$top->preamble || []}; my $epilogue_str = join '', @{$top->epilogue || []}; #diag("Output msg1 to explicit filehandle glob"); open TMP, ">testout/entity.msg1" or die "open: $!"; $top->print(\*TMP); close TMP; #-----test------ ok(-s "testout/entity.msg1", "wrote msg1 to filehandle glob"); #diag("Output msg2 to selected filehandle"); open TMP, ">testout/entity.msg2" or die "open: $!"; my $oldfh = select TMP; $top->print; select $oldfh; close TMP; #-----test------ ok(-s "testout/entity.msg2", "write msg2 to selected filehandle"); #diag("Compare"); # Same? is(-s "testout/entity.msg1", -s "testout/entity.msg2", "message files are same length"); #diag("Parse it back in, to check syntax"); my $parser = new MIME::Parser; $parser->output_dir("testout"); open IN, "./testout/entity.msg1" or die "open: $!"; $top = $parser->parse(\*IN); #diag($parser->results->msgs); #-----test------ ok($top, "parsed msg1 back in"); my $preamble_str2 = join '', @{$top->preamble || []}; my $epilogue_str2 = join '', @{$top->epilogue || []}; #-----test------ is($preamble_str, $preamble_str2, 'preamble strings match'); #-----test------ is($epilogue_str, $epilogue_str2, "epilogue strings match"); #diag("Check the number of parts"); is($top->parts, 4, "number of parts is correct (4)"); #diag("Check attachment 1 [the GIF]"); my $gif_real = (-s "./testin/mime-sm.gif"); my $gif_this = (-s "./testout/mime-sm.gif"); #-----test------ is($gif_real, $gif_this, "GIF is right size (real = $gif_real, this = $gif_this)"); my $part = ($top->parts)[1]; #-----test------ is($part->head->mime_type, 'image/gif', "GIF has correct MIME type"); #diag("Check attachment 3 [the short message]"); $part = ($top->parts)[3]; $io = $part->bodyhandle->open("r"); $line = ($io->getline); $io->close; #-----test------ is($line, $LINE, "getline gets correct value (IO = $io, <$line>, <$LINE>)"); #-----test------ is($part->head->mime_type, 'text/plain', "MIME type okay"); #-----test------ is($part->head->mime_encoding, 'binary', "MIME encoding okay"); #diag("Write it out, and compare"); open TMP, ">testout/entity.msg3" or die "open: $!"; $top->print(\*TMP); close TMP; #-----test------ is(-s 'testout/entity.msg2', -s 'testout/entity.msg3', 'msg2 same size as msg3'); #diag("Duplicate"); my $dup = $top->dup; open TMP, ">testout/entity.dup3" or die "open: $!"; $dup->print(\*TMP); close TMP; my $msg3_s = -s "testout/entity.msg3"; my $dup3_s = -s "testout/entity.dup3"; #-----test------ is($msg3_s, $dup3_s, "msg3 size ($msg3_s) is same as dup3 size ($dup3_s)"); #diag("Test signing"); $top->sign(File=>"./testin/sig"); $top->remove_sig; $top->sign(File=>"./testin/sig2", Remove=>56); $top->sign(File=>"./testin/sig3"); #diag("Write it out again, after synching"); $top->sync_headers(Nonstandard=>'ERASE', Length=>'COMPUTE'); open TMP, ">testout/entity.msg4" or die "open: $!"; $top->print(\*TMP); close TMP; ## Test that parts() replacement works my @newparts = $top->parts; pop @newparts; $top->parts( \@newparts ); is($top->parts, 3, "number of parts is correct (3)"); $bodylines = $top->parts(0)->body; is( ref $bodylines, 'ARRAY', '->body returns an array reference'); is( scalar @$bodylines, 12, '... of the correct size (12 incl. signature)'); $part = ($top->parts)[1]; #-----test------ is($part->head->mime_type, 'image/gif', "GIF has correct MIME type"); #diag("Purge the files"); $top->purge; #-----test------ ok(!-e "./testout/mime-sm.gif", "purge worked"); 1; MIME-tools-5.515/t/ticket-43439.t0000644000175000017500000000104611147321150014123 0ustar dfsdfsuse strict; use warnings; use Test::More tests => 4; # Handle a double semicolon in the Content-Type: header use MIME::Head; my $head = MIME::Head->new->from_file('testmsgs/double-semicolon.msg'); is ($head->mime_type, 'multipart/alternative', 'Got expected MIME type'); is ($head->multipart_boundary, 'foo', 'Got expected boundary'); $head = MIME::Head->new->from_file('testmsgs/double-semicolon2.msg'); is ($head->mime_type, 'multipart/alternative', 'Got expected MIME type'); is ($head->multipart_boundary, 'foo', 'Got expected boundary'); MIME-tools-5.515/t/ticket-66025.t0000644000175000017500000000024111531231310014106 0ustar dfsdfsuse Test::More tests => 1; use Test::Deep; use MIME::Words; cmp_deeply(MIME::Words::decode_mimewords("\nx"), ["\nx"], "Fix for ticket #66025 passes"); MIME-tools-5.515/t/attachment-filename-encoding.t0000644000175000017500000000522611533213600017651 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More; use File::Temp qw(tempdir); use utf8; binmode STDOUT, ":utf8"; binmode STDERR, ":utf8"; plan tests => 7; main: { #-- Load MIME::Parser use_ok("MIME::Parser"); #-- Prepare parser my $parser = MIME::Parser->new(); $parser->output_to_core(1); #-- Parse message file with attachment filename in Latin1 my $msgfile = "testmsgs/attachment-filename-encoding-Latin1.msg"; my $entity = parse_attachment_msg($parser, $msgfile); #-- Check if parsed recommended filename is in UTF-8 my $filename = find_attachment_filename($entity); is(utf8::is_utf8($filename), 1, "Parsed filename should have UTF-8 flag on"); #-- Check if parsed recommended filename matches the expected string is($filename, "attachment.äöü", "Parsed filename should match expectation"); #-- Parse message file with attachment filename in Latin1 $msgfile = "testmsgs/attachment-filename-encoding-UTF8.msg"; $entity = parse_attachment_msg($parser, $msgfile); #-- Check if parsed recommended filename is in UTF-8 $filename = find_attachment_filename($entity); is(utf8::is_utf8($filename), 1, "Parsed filename should have UTF-8 flag on"); #-- Check if parsed recommended filename matches the expected string is($filename, "attachment.äöü", "Parsed filename should match expectation"); # CPAN ticket #65162 # We need the default parser to tickle the bug my $dir = tempdir(CLEANUP => 1); $parser = MIME::Parser->new(); $parser->output_to_core(0); $parser->output_under($dir); $entity = $parser->parse_data("From: test\@example.com\nSubject: test\nDate: Tue, 25 Jan 2011 14:35:04 +0100\nMessage-Id: <123\@example.com>\nContent-Type: text/plain; name*=utf-8''%CE%B2CURE%2Etxt\n\ntest\n"); $filename = $entity->head->recommended_filename; is(utf8::is_utf8($filename), 1, "Parsed filename should have UTF-8 flag on"); is($filename, "\x{3b2}CURE.txt", 'Got expected filename'); } #-- Parse quoted printable file and return MIME::Entity sub parse_attachment_msg { my $parser = shift; my $msgfile = shift; open (my $fh, $msgfile) or die "can't open $msgfile: $!"; my $entity = $parser->parse($fh); close $fh; return $entity; } sub find_attachment_filename { my $entity = shift; return '' unless $entity; if ($entity->is_multipart) { foreach my $subpart ($entity->parts) { my $filename = find_attachment_filename($subpart); return $filename if $filename; } } else { my $head = $entity->head; my $rfn = $head->recommended_filename; return $rfn if $rfn; } return ''; } 1; MIME-tools-5.515/t/Head.t0000644000175000017500000001354010677325674013045 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 20; use MIME::Head; #------------------------------------------------------------ ##diag("Read a bogus file (this had better fail...)"); #------------------------------------------------------------ my $WARNS = $SIG{'__WARN__'}; $SIG{'__WARN__'} = sub { }; my $head = MIME::Head->from_file('BLAHBLAH'); ok(!$head, "parse failed as expected?"); $SIG{'__WARN__'} = $WARNS; #------------------------------------------------------------ ##diag("Parse in the crlf.hdr file:"); #------------------------------------------------------------ # TODO: use lives_ok from Test::Exception ? ($head = MIME::Head->from_file('./testin/crlf.hdr')) or die "couldn't parse input"; # stop now ok('HERE', "parse of good file succeeded as expected?"); #------------------------------------------------------------ ##diag("Did we get all the fields?"); #------------------------------------------------------------ my @actuals = qw(path from newsgroups subject date organization lines message-id nntp-posting-host mime-version content-type content-transfer-encoding x-mailer x-url ); push(@actuals, "From "); my $actual = join '|', sort( map {lc($_)} @actuals); my $parsed = join '|', sort( map {lc($_)} $head->tags); is($parsed, $actual, 'got all fields we expected?'); #------------------------------------------------------------ ##diag("Could we get() the 'subject'? (it'll end in \\r\\n)"); #------------------------------------------------------------ my $subject; ($subject) = ($head->get('subject',0)); # force array context, see if okay is($subject, "EMPLOYMENT: CHICAGO, IL UNIX/CGI/WEB/DBASE\r\n", "got the subject okay?" ); #------------------------------------------------------------ ##diag("Could we replace() the 'Subject', and get it as 'SUBJECT'?"); #------------------------------------------------------------ my $newsubject = "Hellooooooo, nurse!\r\n"; $head->replace('Subject', $newsubject); $subject = $head->get('SUBJECT'); is($subject, $newsubject, 'able to set Subject, and get SUBJECT?'); #------------------------------------------------------------ ##diag("Does the count() method work?"); #------------------------------------------------------------ ok($head->count('NNTP-Posting-Host') && $head->count('nntp-POSTING-HOST') && !$head->count('Doesnt-Exist'), 'count method working?'); #------------------------------------------------------------ ##diag("Create a custom structured field, and extract parameters"); #------------------------------------------------------------ $head->replace('X-Files', 'default ; name="X Files Test"; LENgth=60 ;setting="6"'); my $params; $params = $head->params('X-Files'); ok($params, "got the parameter hash?"); is($params->{_} , 'default', "got the default field?"); is($params->{'name'} , 'X Files Test', "got the name?"); is($params->{'length'} , '60', "got the length?"); is($params->{'setting'}, '6', "got the setting?"); #------------------------------------------------------------ ##diag("Output to a desired file"); #------------------------------------------------------------ open TMP, ">./testout/tmp.head" or die "open: $!"; $head->print(\*TMP); close TMP; ok((-s "./testout/tmp.head") > 50, "output is a decent size?"); # looks okay #------------------------------------------------------------ ##diag("Parse in international header, decode and unfold it"); #------------------------------------------------------------ ($head = MIME::Head->from_file('./testin/encoded.hdr')) or die "couldn't parse input"; # stop now $head->decode; $head->unfold; $subject = $head->get('subject',0); $subject =~ s/\r?\n\Z//; my $to = $head->get('to',0); $to =~ s/\r?\n\Z//; my $tsubject = "If you can read this you understand the example... cool!"; my $tto = "Keld J\370rn Simonsen "; is($to, $tto, "Q decoding okay?"); is($subject, $tsubject, "B encoding and compositing okay?"); #------------------------------------------------------------ ##diag("Parse in header with 'From ', and check field order"); #------------------------------------------------------------ # Prep: ($head = MIME::Head->from_file('./testin/third.hdr')) or die "couldn't parse input"; # stop now my @orighdrs; my @realhdrs = qw(From Path: From: Newsgroups: Subject: Date: Organization: Lines: Message-ID: NNTP-Posting-Host: Mime-Version: Content-Type: Content-Transfer-Encoding: X-Mailer: X-URL:); my @curhdrs; # Does it work? @orighdrs = map {/^\S+:?/ ? $& : ''} (split(/\r?\n/, $head->stringify)); @curhdrs = @realhdrs; is(lc(join('|',@orighdrs)), lc(join('|',@curhdrs)), "field order preserved under stringify?"); # Does it work if we add/replace fields? $head->replace("X-New-Addition", "Hi there!"); $head->replace("Subject", "Hi there again!"); @curhdrs = (@realhdrs, "X-New-Addition:"); @orighdrs = map {/^\S+:?/ ? $& : ''} (split(/\r?\n/, $head->stringify)); is(lc(join('|',@orighdrs)), lc(join('|',@curhdrs)), "field order preserved under stringify after fields added?"); # Does it work if we decode the header? $head->decode; @orighdrs = map {/^\S+:?/ ? $& : ''} (split(/\r?\n/, $head->stringify)); is(lc(join('|',@orighdrs)), lc(join('|',@curhdrs)), "field order is preserved under stringify after decoding?"); { my $h = MIME::Head->new(); $h->replace('Content-disposition', 'inline; filename=good.file'); is($h->recommended_filename(), 'good.file', 'Simple case, good filename'); $h->replace('Content-disposition', 'inline; filename=" "'); $h->replace('Content-type', 'text/x-fake; name="second.choice"'); is($h->recommended_filename(), 'second.choice', 'Simple case, second-best choice of filename'); $h->replace('Content-type', 'text/x-fake; name=" "'); is($h->recommended_filename(), undef, 'no filenames found'); } 1; MIME-tools-5.515/t/02-pod-coverage.t0000644000175000017500000000042710677325674014776 0ustar dfsdfsuse Test::More; plan skip_all => 'Test::Pod::Coverage disabled. TEST_POD_COVERAGE=1 if you want it.' unless $ENV{TEST_POD_COVERAGE}; eval "use Test::Pod::Coverage 1.00"; plan skip_all => "Test::Pod::Coverage 1.00 required for testing POD coverage" if $@; all_pod_coverage_ok(); MIME-tools-5.515/t/test-utf8-bom.t0000644000175000017500000000105713347746066014621 0ustar dfsdfsuse strict; use warnings; use Test::More tests => 4; use MIME::Parser; use IO::File; # Handle a UTF-8 BOM at start of headers my $parser = MIME::Parser->new(); $parser->output_to_core(1); my $entity = $parser->parse(IO::File->new('testmsgs/utf8-bom-at-start.msg')); is ($entity->mime_type, 'multipart/mixed', 'Got expected MIME type'); is ($entity->parts, 2, 'There are two parts'); is ($entity->parts(0)->mime_type, 'text/plain', 'First part is text/plain'); is ($entity->parts(1)->mime_type, 'application/msword', 'Second part is application/msword'); MIME-tools-5.515/t/Filer.t0000644000175000017500000000214414121157066013225 0ustar dfsdfs#!/usr/bin/perl use strict; use warnings; use Test::More tests => 17; use Config; binmode(STDOUT, ":utf8"); binmode(STDERR, ":utf8"); binmode( Test::More->builder()->output(), ':encoding(utf-8)' ); # Perl < 5.10.0 did not handle Unicode at all... my $wookie; if ($Config{'PERL_REVISION'} == 5 && $Config{'PERL_VERSION'} <= 8) { $wookie = 'wookie%D0.doc'; } else { $wookie = 'wookie%42D.doc'; } BEGIN { use_ok('MIME::Parser::Filer'); } # Tests for CPAN ticket 6789, and others { my $filer = MIME::Parser::Filer->new(); # All of these filenames should be considered evil my %evil = ( ' ' => '.dat' , ' leading_space' => 'leading_space.dat', 'trailing_space ' => 'trailing_space.dat', '.' => '..dat', '..' => '...dat', 'index[1].html' => 'index_1_.html', " wookie\x{f8}.doc" => "wookie%F8.doc", " wookie\x{042d}.doc" => $wookie, ); foreach my $name (keys %evil) { ok( $filer->evil_filename( $name ), "$name is evil"); } while( my ($evil, $clean) = each %evil ) { is( $filer->exorcise_filename( $evil), $clean, "$evil was exorcised"); } } MIME-tools-5.515/t/ticket-71677.t0000644000175000017500000000115711647604645014155 0ustar dfsdfs#!/usr/bin/perl use Test::More tests => 2; use MIME::Parser; my $msg = <<'EOF'; From: To: Subject: Weird filename test MIME-Version: 1.0 Content-Type: application/octet-stream; name="[wookie].bin" Content-Disposition: attachment; filename="[wookie].bin" Wookie EOF my $parser = MIME::Parser->new(); $parser->output_to_core(0); $parser->output_under("testout"); my $entity = $parser->parse_data($msg); my $body = $entity->bodyhandle; my $path = $body->path; ok(defined($path), 'Path exists'); ok($path =~ /_wookie_\.bin$/, 'And has the expected form'); $parser->filer->purge; MIME-tools-5.515/t/99-prepare.t0000644000175000017500000000046710677325674014105 0ustar dfsdfs#!/usr/bin/perl -w use strict; use warnings; use Test::More tests => 1; # TBone used to do this, but thankfully, we've done away with that my $output_dir = './testout'; if( ! -d $output_dir ) { mkdir $output_dir or warn "Could not make output directory: $!" } ok( -d $output_dir, "$output_dir exists" ); 1; MIME-tools-5.515/t/ticket-11901.t0000644000175000017500000000720511032231440014106 0ustar dfsdfs#!/usr/bin/perl use Test::More tests => 2; use MIME::Parser; # Ticket 11901 - malformed multipart/mixed caused remove_sig() to die. my $entity = MIME::Parser->new->parse(\*DATA); isa_ok( $entity, 'MIME::Entity'); is($entity->remove_sig(), undef, "Can't remove sig from broken message"); __DATA__ Return-Path: X-Original-To: info2001@lists.sch.bme.hu Delivered-To: info2001@lists.sch.bme.hu Received: by lists.sch.bme.hu (Postfix, from userid 102) id 1CDBB11E21; Mon, 14 Mar 2005 22:41:52 +0100 (CET) Received: from lists.sch.bme.hu ([127.0.0.1]) by localhost (kaa.sch.bme.hu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 25096-10 for ; Mon, 14 Mar 2005 22:41:50 +0100 (CET) Received: from balu.sch.bme.hu (balu.sch.bme.hu [152.66.208.40]) by lists.sch.bme.hu (Postfix) with ESMTP id 8D03D11E21 for ; Mon, 14 Mar 2005 22:41:50 +0100 (CET) Received: from 69.183.13.242.adsl.snet.net ([69.183.13.242]) by balu.sch.bme.hu (Sun ONE Messaging Server 6.0 Patch 1 (built Jan 28 2004)) with SMTP id <0IDD00LL92XIUK80@balu.sch.bme.hu> for info2001@lists.sch.bme.hu (ORCPT info2001@sch.bme.hu); Mon, 14 Mar 2005 22:41:50 +0100 (CET) Received: from 99.94.255.218 by 69.183.13.242.adsl.snet.net Mon, 14 Mar 2005 08:30:34 -0800 Date: Mon, 14 Mar 2005 11:19:01 -0800 From: Justine Cornett To: info2001@sch.bme.hu Message-id: <426080426772888074962@email.msn.com> MIME-version: 1.0 X-Mailer: diana 65.261.2493443 Content-type: multipart/mixed; boundary="Boundary_(ID_tz+jdqVflLNHHe1DVt0NoA)" X-Priority: 3 X-IP: 139.190.7.62 Spam-test: True ; 7.0 / 5.0 ; ALL_TRUSTED,BAYES_99,BIZ_TLD,HTML_30_40,HTML_FONT_TINY,HTML_MESSAGE,LONGWORDS,PLING_QUERY,RCVD_BY_IP,RCVD_DOUBLE_IP_LOOSE,URIBL_SBL,URIBL_WS_SURBL X-Virus-Scanned: by amavisd-new at kaa.sch.bme.hu Subject: [info2001] Have you heard of Rolex Timepieces ? Come on in ! [propel] Reply-To: info2001@sch.bme.hu X-Loop: info2001@sch.bme.hu X-Sequence: 19626 Errors-to: info2001-owner@sch.bme.hu Precedence: list X-no-archive: yes List-Id: List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: ë÷M7ß½¼ß]º ‰íz{Sʗ­{†Ù¥r«±ëºÆ¬r(‚¢{^žÔëj{z±'r‡bžŠØmšVèw#ږ('qéµêÅ8ÔÜ¢Z+}ýÓM…©äʋŸ¢¼¨º¸§µê޲اEêe‰Æ–j×!zÃÃ…8Ôÿ=دjX ÂǞ׫Þ~¶Ÿÿ²ˆñ’Û$~ö–GáŠwèý+Âê.³­raz·¿v+ÃjX ÂǞ׫ãSr‰h­÷ÓM4!ü¨ºÇžj|­†)à¶­š(!¶)íz·¬·*.¢¸ŸÊ‹¡j÷šŸ*®zËb¢{)•æ¬yÚ'¶¬ŠÖ­zÚ/ŠÈ­¢êðy»"µæ­üÿÅ8ÔÃjX ÂǞ׫Þ~¶Ÿÿ¥×¯më-¡ûay¸³ü̎8Ã¥Âæ'È1·*ç©–'ë\…ëk6«üÃn¶ën»)j{-ÊWãSH†DߚmãS-€+‰©\­©ÞŠºÞ¦Vœy¦åzšw'墊ڙ§^ºË^†¶§ž'!¢V¬¦‹-êۮÚânëZ¯(–X®š «¹Ú(®Ièm¶¥Ã§/j«Ê‹Þ¸«v §Ÿ+kj隶ë$…æ¥v+-ŠY^¯&ëªëzÛlŠ{¨ºÆ«nŠÞ¶é¦¢Ê®y©eºÈ¯zÊ(¶ڂ§‚›­·'^z—š­ÚîšØ^²˜šÂÊ%¢fèz˜œº·¬ªçžÂ眡ÊjV¬‘ªh—+^rârÜ"µÈr™©º»nëmz·ÚµºïjW§¶)ÞjZlž‹mŠx!jfëþÊZŸöèw/á¶ië}ÓM֕o7×n‚¢{^žÔò¥ë^Æß镨§r«±ëºÆ¬r(‚¢{^žÔëj{z±'r‡bžۊÔh•ìb³Z´ŒžÜ¨ºÚ0yªü÷®zÓ­5îm§ÿîÊ8ò½ÉÛª'lžÆâÃúˆ²Æ8­úõõ§ª¢j­ª8¥ë÷M7ß½¼ß]º --Boundary_(ID_tz+jdqVflLNHHe1DVt0NoA)-- MIME-tools-5.515/ChangeLog0000644000175000017500000013443314612223000013300 0ustar dfsdfs5.515 2024-04-24 Dianne Skoll * VERSION 5.514 RELEASED * Fix the "version" setting in META.yml. There are no other changes since 5.514. 5.514 2024-02-06 Dianne Skoll * VERSION 5.514 RELEASED * Move the guts of the ambiguous_content method to MIME::Head * Add MIME::Entity->ambiguous_content that returns true if this entity or any of its parts, recursively, has a MIME::Head whose ambiguous_content method returns true. * Keep MIME::Parser->ambiguous_content as a cached version of the most recently parsed $entity->ambiguous_content. * BUGFIX: Add some missing files to MANIFEST 5.513 2024-01-25 Dianne Skoll * VERSION 5.513 RELEASED * Add MIME::Parser->ambiguous_content to indicate one of several types of ambiguous MIME content that could be security risks. * Add the '@duplicate_parameters' pseudo-parameter to let caller detect duplicate MIME parameters on a MIME header. 5.512 2024-01-08 Dianne Skoll * VERSION 5.512 RELEASED * Use much larger chunk sizes for Base-64 encoding which reduces both encoding time and space overhead. https://rt.cpan.org/Ticket/Display.html?id=128400 https://rt.cpan.org/Ticket/Display.html?id=130110 5.511 2024-01-02 Dianne Skoll * VERSION 5.511 RELEASED * Silence a warning if used with a development version of MIME::QuotedPrint https://rt.cpan.org/Ticket/Display.html?id=150118 https://rt.cpan.org/Ticket/Display.html?id=149225 5.510 2022-07-06 Dianne Skoll * VERSION 5.510 RELEASED * Update author contact info * Make code work in taint mode * Clarify MIME::Entity documentation 5.509 2017-04-05 Dianne Skoll * VERSION 5.509 RELEASED * Fix CPAN bug https://rt.cpan.org/Ticket/Display.html?id=120871 Makefile.PL fails with no '.' in @INC * Fix CPAN bug https://rt.cpan.org/Ticket/Display.html?id=118262 Test t/Ref.t fails on Windows install * Fix CPAN bug https://rt.cpan.org/Ticket/Display.html?id=119166 MIME::Parser::parse_data() should check what it gets back... * Fix CPAN bug https://rt.cpan.org/Ticket/Display.html?id=119568 Allow \r\n to be used as line-end delimeter when outputting MIME message. 5.508 2016-08-29 Dianne Skoll * VERSION 5.508 RELEASED * Fix test broken by Perl update https://rt.cpan.org/Ticket/Display.html?id=113887 5.507 2015-09-30 Dianne Skoll * VERSION 5.507 RELEASED * Fix parsing bug https://rt.cpan.org/Public/Bug/Display.html?id=105455 * Fix typo that broke MIME::Body::incore->open() on Perl 5.20 5.506 2015-04-22 Dianne Skoll * VERSION 5.506 RELEASED * Update maintainer's name to "Dianne Skoll" 5.505 2013-11-14 Dianne Skoll * VERSION 5.505 RELEASED * Fix documentation typos. https://rt.cpan.org/Public/Bug/Display.html?id=80473 * Fix broken test. https://rt.cpan.org/Public/Bug/Display.html?id=84668 * Don't run Kwalitee tests unless author or release tests are enabled. https://rt.cpan.org/Public/Bug/Display.html?id=87094 * Fix many documentation typos. https://rt.cpan.org/Public/Bug/Display.html?id=87783 * Fix bug in header parsing that would fail to parse a header like: Content-Type: ; name="malware.zip" 5.504 2013-01-30 Dianne Skoll * VERSION 5.504 RELEASED * Fix encoding of MIME parameters that contain a quoted string: "like \"this" https://rt.cpan.org/Public/Bug/Display.html?id=80433 * Suppress useless warnings from tests https://rt.cpan.org/Public/Bug/Display.html?id=80679 * Fix long-standing bug in encode_mimewords that can break multibyte-encodings (eg, utf-8) https://rt.cpan.org/Public/Bug/Display.html?id=5462 5.503 2012-06-08 Dianne Skoll * VERSION 5.503 RELEASED * Avoid inappropriately untainting data https://rt.cpan.org/Public/Bug/Display.html?id=67119 * Localise $\ to avoid parsing problems if it's set elsewhere https://rt.cpan.org/Public/Bug/Display.html?id=71041 * Improve exorcising of filenames https://rt.cpan.org/Public/Bug/Display.html?id=71677 * Fix potential race condition in t/Smtpsend.t https://rt.cpan.org/Public/Bug/Display.html?id=68879 * Allow native I/O on File::Handle objects https://rt.cpan.org/Public/Bug/Display.html?id=72538 * Add "recommends Convert::BinHex" clause to Makefile.PL https://rt.cpan.org/Public/Bug/Display.html?id=72223 * Add module_name to Makefile.PL https://rt.cpan.org/Public/Bug/Display.html?id=77138 * Fix "Uninitialized value" warning https://rt.cpan.org/Public/Bug/Display.html?id=77190 * Don't run t/Smtpsend.t on systems that lack fork() https://rt.cpan.org/Public/Bug/Display.html?id=77351 * Add "use strict" everywhere https://rt.cpan.org/Public/Bug/Display.html?id=77582 5.502 2011-03-08 Dianne Skoll * VERSION 5.502 RELEASED * NOTE to packagers (Debian, Red Hat, FreeBSD, etc.): Do not ship MIME::tools 5.500 or 5.501. They both had serious bugs! * Fix parsing bug: https://rt.cpan.org/Ticket/Display.html?id=66025 * Fix typo: https://rt.cpan.org/Ticket/Display.html?id=65387 * Fix unit tests on Perl 5.8.x: https://rt.cpan.org/Ticket/Display.html?id=66188 * Fix unit test failure on Win32: (https://rt.cpan.org/Ticket/Display.html?id=66286) 5.501 2011-02-17 Dianne Skoll * VERSION 5.501 RELEASED * Add build_requires 'Test::Deep'; to Makefile (rt.cpan.org #64659) * Fix spelling errors (rt.cpan.org #64610) * Fix double-decoding bug when decoding RFC-2231-encoded parameters (rt.cpan.org #65162) * Fix inappropriate inclusion of CR characters in parsed headers (rt.cpan.org #65681) * Document that MIME::WordDecoder is mostly deprecated. * Document that MIME::Head->get(...) can include a trailing newline. * Increase buffer size from 2kB to 8kB in MIME::Entity and MIME::Body (part of rt.cpan.org #65162) 5.500 2011-01-07 Dave O'Neill * VERSION 5.500 RELEASED * (cleanup) IO-Stringy (specifically, IO::ScalarArray, IO::Lines, and IO::InnerFile) is no longer used * (ticket 22684) Fix deadlock in filter() when invoking external programs such as gzip. (Alexey Tourbin ) * Remove auto_install from Makefile.PL * (ticket 60931) If preamble is empty, make sure it's still empty after roundtripping through MIME::Entity * (ticket 63739) Properly decude RFC2231 encodings in attachment filenames 5.428 2010-04-22 Dave O'Neill * VERSION 5.428 RELEASED * (ticket 56764) Build release with a newer Module::Install * (ticket 52924) ensure we add <> around Content-id data * (ticket 48036) make mimesend example script a bit more useful (courtesy of Jerrad Pierce) * (ticket 43439) fix for parsing of doubled ; in multipart headers * (ticket 41632) If both RFC-2231 and non-RFC-2231 parameters are present, use only the RFC-2231 ones * (ticket 40715) Reference Encode::MIME::Header in docs * (ticket 39985) correct POD typos * Only bind to localhost in smtpsend test, rather than to all available interfaces. This might avoid some of the test failures seen on cpantesters. 5.427 2008-06-30 Dave O'Neill * VERSION 5.427 RELEASED * (bugfix) fix remove_sig() on invalid multipart message (RT #11901) * (bugfix) make_singlepart() no longer creates bizzare Content-Type: headers (RT #37139) * (bugfix) process_part() no longer sets incorrect charset on empty parts (RT #35369) * (bugfix) fix runtime warnings caused by incorrect pack() string (RT #34451, bugs.debian.org #446342) * (docs) add "SEE ALSO" sections to POD docs (RT #30391) * (docs) fix documentation of MIME::Head::get() (RT #34552, bugs.debian.org #235189) * (packaging) Depend on IO::File 1.1.3, for its binmode() support (RT #34178) 5.426 2008-03-07 Dave O'Neill * VERSION 5.426 RELEASED * (bugfix) require File::Temp 0.18 or newer, as we need seek() (RT#31032) * (bugfix) Don't hang forever in t/Smtpsend.t (RT#31082) * (bugfix) require Perl 5.8.0 or newer in Makefile.PL (RT#30927) * (bugfix) encode_mimewords() no longer removes spaces between two encoded words (RT#5462) 5.425 2007-11-17 Dave O'Neill * VERSION 5.425 RELEASED * (bugfix) A stub for MIME::Parser's tmp_recycling() method has been re-added to preserve compatibility. Since recycling of tempfiles never worked and has been removed, any code calling tmp_recycling() should stop attempting to use the feature. 5.424 2007-11-07 Dianne Skoll * VERSION 5.424 RELEASED * (bugfix) [rt.cpan.org #29864] - lines in $entity->body() should be newline-terminated. 5.423 2007-09-27 Dave O'Neill * VERSION 5.423 RELEASED * (bugfix) Fix API regression - MIME::Entity::body() should return an arrayref. Fixes RT 29643. 5.422 2007-09-25 Dave O'Neill * VERSION 5.422 RELEASED * (bugfix) Require File::Temp 0.17 or newer for IO::Seekable support. This fixes test failures seen on Darwin. * (bugfix) Clear filer's purgeable() before calling init_parse(). Fixes RT 7858. 5.421 2007-09-21 Dave O'Neill * VERSION 5.421 RELEASED * (enhancement) Use File::Temp for tempfile generation. MIME::Parser now has a tmp_dir() method for changing the temporary directory on a per-parser basis. 5.420_02 2007-08-29 Dave O'Neill * VERSION 5.420_02 (developer release) * (bugfix) Correct 'use vars' and add a 'use strict' (fixes RT #22681) * (bugfix) Don't allow all-whitespace filenames in recommended_filename() (fixes RT #6115) * (bugfix) Require IO-stringy 2.110. Fixes RT tickets 11312, 11452, 12375, 12784, and 18791 * (docs) Updated RFC references to refer to MIME RFCs 2045-2049 (RT #14119) * (cleanup) Warn if no decoder is found for a given encoding. (RT #22682) * (cleanup) IO::Wrap no longer used, IO::ScalarArray use minimized 5.420_01 2007-06-18 Dave O'Neill * VERSION 5.420_01 (developer release) * (bugfix) Fix warning generated by a header of "Content-Type: /". Previous versions would warn about undefined variables. We now set a blank type and subtype. * (cleanup) Partial removal of dependencies on IO::Scalar and IO::ScalarArray. We now use Perl's built-in I/O on scalars as much as possible. NOTE THAT THIS REQUIRES PERL 5.8! * (cleanup) FileHandle usage removed in favour of IO::File * (cleanup) Remove broken utility methods -- shellquote() because it didn't really make anything safe, and catfile(), because File::Spec is better. * (cleanup) Multiple test cleanups, including removal of ExtUtils/TBone.pm. Tests now use Test::More. * (cleanup) Remove support for recycling tempfiles ( tmp_recycling() and its usage in new_tmpfile() ) * (cleanup) Remove nasty "eval join('',<::DATA>) unless caller()" testing code from various modules * (cleanup) Merge all changelog information from README and MIME/Tools.pm into ChangeLog 5.420 2006-03-17 Dianne Skoll * VERSION 5.420 RELEASED * Fix regression introduced in 5.419 -- quoted-printable encoding would sometimes fail on "textual" MIME parts. 5.419 2005-12-22 Dianne Skoll * VERSION 5.419 RELEASED * Added MIME::Parser->decode_bodies method. This lets you force MIME::Tools to store body parts WITHOUT decoding them. Useful if you need the exact unmangled message source (for example, for GPG-signing.) Patch submitted by Jörn Reder. 5.418 2005-09-29 Dianne Skoll * VERSION 5.418 RELEASED * MIME/Decoder/QuotedPrint.pm: Localize "$_" in a couple of places. * MIME/WordDecoder.pm: Turn off useless debugging output to STDERR * MIME/Entity.pm: Make the stringify method use IO::ScalarArray instead of IO::Scalar. For small messages, performance may be worse; for large messages, it is definitely much better. * MANIFEST: Remove some useless internal files from the manifest. They were never meant to be part of the actual distribution. 5.417 2005-01-20 Dianne Skoll * VERSION 5.417 RELEASED * Require MIME::QuotedPrint 3.03 to use the three-argument "encode_qp" function. If we have an earlier version of MIME::QuotedPrint, fall back to the one-argument version. * Field/ParamVal.pm: The patch to strip trailing whitespace on parameters was buggy and caused decoding errors. This has been fixed. 5.416 2005-01-03 Dianne Skoll * VERSION 5.416 RELEASED * Allow MIME::Tools to work with MIME::QuotedPrint 2.20 again. The Makefile.PL will warn about potential problems, but will allow you to proceed. * Field/ParamVal.pm: Strip trailing whitespace when extracting parameters. Apparently, not doing so can cause Perl to core dump on certain badly-formed messages. 5.415 2004-10-27 Dianne Skoll * VERSION 5.415 RELEASED * Fixed parsing of parameter="" in headers, and fixed case where multipart boundary is "" 5.414 2004-10-06 Dianne Skoll * VERSION 5.414 RELEASED * Remove MIME::QuotedPrint 3.03 as a dependency and add MIME::Base64 3.03 instead. * Check return values of I/O operations like open(), close(), etc. and die if they fail. Problem reported by Mark Martinec. 5.413 2004-09-15 Dianne Skoll * VERSION 5.413 RELEASED * Fix some $VERSION = xxx assignments that were broken; make sure VERSION shows up as 5.413 everywhere. Sorry about that! 5.412 2004-09-09 Dianne Skoll * VERSION 5.412 RELEASED * Recognize "binhex40", "mac-binhex" and "mac-binhex40" Content-Transfer-Encodings. * Filer.pm: Be much more strict in evil_filename, allowing only a set of known good characters. 2004-09-08 Dianne Skoll * Skip BinHex decoding if prerequisite modules not installed. * Fix BinHex decoder so it encodes correctly; regression test for BinHex encoding now passes. * Require MIME::QuotedPrint 3.03 or newer. * Rename variable "$jkfis" to "$how_encoded" * Correct attribution of changes in changelog. * Correct bad regexp test for "bad PDF" files. 2004-09-07 Dianne Skoll * lib/MIME/Parser/Filer.pm (evil_filename): Make evil_filename more paranoid (Julian Field and Martin Blapp) * lib/MIME/Parser/Filer.pm (exorcise_filename): Delete leading and trailing whitespace (Julian Field) * Remove all the Benchmark code (Martin Blapp) * lib/MIME/Decoder.pm: Add support for BinHex encoded attachments (Julian Field) * lib/MIME/Decoder.pm: Require MIME::QuotedPrint 3.03 or newer for correct decoding of binary attachments. (Alexey Kravchuk) * lib/MIME/Decoder/QuotedPrint.pm: Attempt to deal sanely with PDF files encoded using quoted-printable encoding by Outlook, which does not follow the RFC guidelines. (Martin Blapp) * lib/MIME/Field/ParamVal.pm: Deal with RFC2231-encoded parameters. * lib/MIME/Head.pm: Correct "7-bit", "7 bit" and "7_bit" to 7bit; likewise for 8bit lookalikes. (Martin Blapp) * lib/MIME/Parser.pm: Add max_parts method to limit maximum number of MIME parts we are willing to parse. * DSKOLL took over maintainership of MIME::tools at version 5.411a. Version 5.411 Regenerated docs. Bug in HTML docs, now all fixed. Version 5.410 (2000/11/23) Better detection of evil filenames. Now we check for filenames which are suspiciously long, and a new MIME::Filer::exorcise_filename() method is used to try and remove the evil. *Thanks to Jason Haar for the suggestion.* Version 5.409 (2000/11/12) Added functionality to MIME::WordDecoder, including support for plain US-ASCII. MIME::Tools::tmpopen() made more flexible. You can now override the tmpfile-opening behavior. Version 5.408 (2000/11/10) Added new Beta unmime() mechanism. See the MIME::WordDecoder manpage for full details. Also see the section on "Understand how international characters are represented". Version 5.405 (2000/11/05) Added a purge() that does what people want it to. Now, when a parse finishes and you want to delete everything that was created by it, you can invoke `purge()' on the parser's filer. All files/directories created during the last parse should vanish. *Thanks to everyone who complained about MIME::Entity::purge.* Version 5.404 (2000/11/04) Added new automatic MIME-decoding of attachment filenames with encoded (non-ASCII) characters. Hopefully this will do more good than harm. The use of MIME::Parser::decode_headers() and MIME::Head::decode() has been deprecated in favor of the new MIME::Words "unmime" mechanism. Please see the "unmime" entry in the MIME::Words manpage. Added tolerance for unquoted =?...?= in param values. This is in violation of the RFCs, but then, so are some MUAs. *Thanks to desti for bringing this to my attention.* Fixed supposedly-bad B-encoding. *Thanks to Otto Frost for bringing this to my attention.* Version 5.316 (2000/09/21) Increased tolerance in MIME::Parser. Now will ignore bogus POP3 "+OK" line before header, as well as bogus mailbox "From " line (both with warnings). *Thanks to Antony OSullivan (ajos1) for suggesting this feature.* Fixed small epilogue-related bug in MIME::Entity::print_body(). Now it only outputs a final newline if the epilogue does not end in one already. Support for checking the preamble/epilogue in regression tests was also added. *Thanks to Lars Hecking for bringing this issue up.* Updated documentation. All module manual pages should now direct readers to the main MIME-tools manual page. Version 5.314 (2000/09/06) Fixed Makefile.PL to have less-restrictive requirement for File::Spec (0.6). Version 5.313 (2000/09/05) Fixed nasty bug with evil filenames. Certain evil filenames were getting replaced by internally-generated filenames which were just as evil... ouch! If your parser occasionally throws a fatal exception with a "write-open" error message, then you have this bug. *Thanks to Julian Field and Antony OSullivan (ajos1) for delivering the evidence!* Beware the doctor who cures seasonal head cold by killing patient Improved naming of extracted files. If a filename is regarded as evil, we guess that it might just be because of part information, and attempt to find and use the final path element. Simplified message logging and made it more consistent. For details, see the section on "Message-logging". Version 5.312 (2000/09/03) Fixed a Perl 5.7 select() incompatibility which caused "make test" to fail. *Thanks to Nick Ing-Simmons for the patch.* Version 5.311 (2000/08/16) Blind fix for Win32 uudecoding bug. A missing binmode seems to be the culprit here; let's see if this fixes it. *Thanks to ajos1 for finding the culprit!* The carriage return thumbs its nose at me, laughing: DOS I/O *still* sucks Version 5.310 (2000/08/15) Fixed a bug in the back-compat output_prefix() method of MIME::Parser. Basically, output prefixes were not being set through this mechanism. *Thanks to ajos1 for the alert.* shift @_, ### "shift at-underscore" or @_ will have bogus "self" object Added some backcompat methods, like parse_FH(). *Thanks (and apologies) to Alain Kotoujansky.* Added filenames-with-spaces support to MIME::Decoder::UU. *Thanks to Richard Pun for the suggestion.* Version 5.305 (2000/07/20) Added MIME::Entity::parts_DFS as convenient way to "get all parts". *Thanks to Xavier Armengou for suggesting this method.* Removed the Alpha notice. Still a few features to tweak, but those will be minor. Version 5.303 (2000/07/07) Fixed output bugs in new Filers. Scads of them: bad handling of filename collisions, bad implementation of output_under(), bad linking to results, POD errors, you name it. If this had gone to CPAN, I'd have issued a factory recall. `:-(' Errors, like beetles, Multiply ferociously In the small hours Version 5.301 (2000/07/06) READ ME BEFORE UPGRADING PAST THIS POINT! New MIME::Parser::Filer class -- not fully backwards-compatible. In response to demand for more-comprehensive file-output strategies, I have decided that the best thing to do is to split all the file-output logic (output_path(), evil_filename(), etc.) into its own separate class, inheriting from the new MIME::Parser::Filer class. If you *override* any of the following in a MIME::Parser subclass, you will need to change your code accordingly: evil_filename output_dir output_filename output_path output_prefix output_under My sincere apologies for any inconvenience this will cause, but it's ultimately for the best, and is quite likely the last structural change to 5.x. *Thanks to Tyson Ackland for all the ideas.* Incidentally, the new code also fixes a bug where identically-named files in the same message could clobber each other. A message arrives: "Here are three files, all named 'Foo'" Only one survives. :-( Fixed bug in MIME::Words header decoding. Underscores were not being handled properly. *Thanks to Dominique Unruh and Doru Petrescu,* who independently submitted the same fix within 2 hours of each other, after this bug has lain dormant for months: Two users, same bug, same patch -- mere hours apart: Truly, life is odd. Removed escaping of underscore in regexps. Escaping the underscore (\_) in regexps was sloppy and wrong (escaped metacharacters may include anything in \w), and the newest Perls warn about it. *Thanks to David Dyck for bringing this to my attention.* What, then, is a word? Some letters, digits, and, yes: Underscores as well Added Force option to MIME::Entity's make_multipart. *Thanks to Bob Glickstein for suggesting this.* Numerous fixlets to example code. *Thanks to Doru Petrescu for these.* Added REQUIREMENTS section in docs. Long-overdue. *Thanks to Ingo Schmiegel for motivating this.* Version 5.211 (2000/06/24) Fixed auto-uudecode bug. Parser was failing with "part did not end with expected boundary" error when uuencoded entity was a *singlepart* message (ironically, uuencoded parts of multiparts worked fine). *Thanks to Michael Mohlere for testing uudecode and finding this.* The hurrying bee Flies far for nectar, missing The nearest flowers Say ten thousand times: Complex cases may succeed Where simple ones fail Parse errors now generate warnings. Parser errors now cause warn()s to be generated if they are not turned into fatal exceptions. This might be a little redundant, seeing as they are available in the "results", but parser-warnings already cause warn()s. I can always put in a "quiet" switch if people complain. Miscellaneous cleanup. Documentation of MIME::Parser improved slightly, and a redundant warning was removed. Version 5.210 (2000/06/20) Change in "evil" filename. Made MIME::Parser's evil_filename stricter by having it reject "path" characters: any of '/' '\' ':' '[' ']'. Just as with beauty The eye of the beholder Is where "evil" lives. Documentation fixes. Corrected a number of docs in MIME::Entity which were obsoleted in the transition from 4.x to 5.x. *Thanks to Michael Fischer for pointing these out.* For this one, a special 5- 5-5-5 Haiku of anagrams: Documentation in mutant code, O! Edit -- no, CUT! [moan] I meant to un-doc... IO::Lines usage bug fixed. MIME::Entity was missing a "use IO::Lines", which caused an exception when you tried to use the body() method of MIME::Entity. *Thanks to Hideyo Imazu and Michael Fischer for pointing this out.* Bareword looks fine, but Perl cries: "Whoa there... IO::Lines? Never heard of it." Version 5.209 (2000/06/10) Autodetection of uuencode. You can now tell the parser to hunt for uuencode inside what should be text parts. See extract_uuencode() for full details. Beware: this is largely untested at the moment. *Special thanks to Michael Mohlere at ADJE Webmail, who was the first -- and most-insistent -- user to request this feature.* Faster parsing. Sped up the MIME::Decoder::NBit decoder quite a bit by using a variant of the chunking trick I used for MIME::Decoder::Base64. I suspect that the same trick (reading a big chunk plus the next line to get a big block of lines) would work with MIME::Decoder::QuotedPrint, but I don't have the time or resources to check that right now (tested contributions would be welcome). NBit encoding is more-conveniently done line-by-line for now, because individual line lengths must be checked. Better use of core. MIME::Body::InCore is now used when you build() an entity with the Data parameter, instead of MIME::Body::Scalar. More documentation on toolkit configuration. Version 5.207 (2000/06/09) Fixed whine() bug in MIME::Parser where the "warning" method whine() was called as a static function instead of invoked as an instance method. *Thanks to Todd A. Bradfute for reporting this.* A simple warning Invokes method as function: "Warning" makes us die Version 5.206 (2000/06/08) Ahem. Cough cough: Way too many bugs Thus, a self-imposed penance: Write haiku for each Fixed bug in MIME::Parser: the reader was not handling the odd (but legal) case where a multipart boundary is followed by linear whitespace. *Thanks to Jon Agnew for reporting this with the RFC citation.* Legal message fails And 'round the globe, thousands cry: READ THE RFC Empty preambles are now handled properly by MIME::Entity when printing: there is now no space between the header-terminator and the initial boundary. *Thanks to "sen_ml" for suggesting this.* Nature hates vacuum But please refrain from tossing Newlines in the void Started using Benchmark for benchmarking. Version 5.205 (2000/06/06) Added terminating newline to all parser messages, and fixed small parser bug that was dropping parts when errors occurred in certain places. Version 5.203 (2000/06/05) Brand new parser based on new (private) MIME::Parser::Reader and (public) MIME::Parser::Results. Fast and yet simple and very tolerant of bad MIME when desired. Message reporting needs some muzzling. MIME::Parser now has ignore_errors() set true by default. Version 5.116 (2000/05/26) Removed Tmpfile.t test, which was causing a bogus failure in "make test". Now we require 5.004 for MIME::Parser anyway, so we don't need it. *Thanks to Jonathan Cohn for reporting this.* Version 5.115 (2000/05/24) Fixed Ref.t bug, and documented how to remove parts from a MIME::Entity. Version 5.114 (2000/05/23) Entity now uses MIME::Lite-style default suggested encoding. More regression test have been added, and the "Size" tests in Ref.t are skipped for text document (due to CRLF differences between platforms). Version 5.113 (2000/05/21) Major speed and structural improvements to the parser. *Major, MAJOR thanks to Noel Burton-Krahn, Jeremy Gilbert, and Doru Petrescu for all the patches, benchmarking, and Beta-testing!* Convenient new one-directory-per-message parsing mechanism. Now through `MIME::Parser' method `output_under()', you can tell the parser that you want it to create a unique directory for each message parsed, to hold the resulting parts. Elimination of $', $` and $&. Wow... I still can't believe I missed this. D'OH! *Thanks to Noel Burton-Krahn for all his patches.* Parser is more tolerant of weird EOL termination. Some mailagents are can terminate lines with "\r\r\n". We're okay with that now when we extract the header. *Thanks to Joao Fonseca for pointing this out.* Parser is tolerant of "From " lines in headers. *Thanks to Joachim Wieland, Anthony Hinsinger, Marius Stan, and numerous others.* Parser catches syntax errors in headers. *Thanks to Russell P. Sutherland for catching this.* Parser no longer warns when subtype is undefined. *Thanks to Eric- Olivier Le Bigot for his fix.* Better integration with Mail::Internet. For example, smtpsend() should work fine. *Thanks to Michael Fischer and others for the patch.* Miscellaneous cleanup. *Thanks to Marcus Brinkmann for additional helpful input.* *Thanks to Klaus Seidenfaden for good feedback on 5.x Alpha!* Version 4.123 (1999/05/12) Cleaned up some of the tests for non-Unix OS'es. Will require a few iterations, no doubt. Version 4.122 (1999/02/09) Resolved CORE::open warnings for 5.005. *Thanks to several folks for this bug report.* Version 4.121 (1998/06/03) Fixed MIME::Words infinite recursion. *Thanks to several folks for this bug report.* Version 4.117 (1998/05/01) Nicer MIME::Entity::build. No longer outputs warnings with undefined Filename, and now accepts Charset as well. *Thanks to Jason Tibbits III for the inspirational patch.* Documentation fixes. Hopefully we've seen the last of the pod2man warnings... Better test logging. Now uses ExtUtils::TBone. Version 4.116 (1998/02/14) Bug fix: MIME::Head and MIME::Entity were not downcasing the content-type as they claimed. This has now been fixed. *Thanks to Rodrigo de Almeida Siqueira for finding this.* Version 4.114 (1998/02/12) Gzip64-encoding has been improved, and turned off as a default, since it depends on having gzip installed. See MIME::Decoder::Gzip64 if you want to activate it in your app. You can now set up the gzip/gunzip commands to use, as well. *Thanks to Paul J. Schinder for finding this bug.* Version 4.113 (1998/01/20) Bug fix: MIME::ParserBase was accidentally folding newlines in header fields. *Thanks to Jason L. Tibbitts III for spotting this.* Version 4.112 (1998/01/17) MIME::Entity::print_body now recurses when printing multipart entities, and prints "everything following the header." This is more likely what people expect to happen. PLEASE read the "two body problem" section of MIME::Entity's docs. Version 4.111 (1998/01/14) Clean build/test on Win95 using 5.004. Whew. Version 4.110 (1998/01/11) Added make_multipart() and make_singlepart() in MIME::Entity. Improved handling/saving of preamble/epilogue. Version 4.109 (1998/01/10) Overall Major version shift to 4.x accompanies numerous structural changes, and the deletion of some long-deprecated code. Many apologies to those who are inconvenienced by the upgrade. MIME::IO deprecated. You'll see IO::Scalar, IO::ScalarArray, and IO::Wrap to make this toolkit work. MIME::Entity deep code. You can now deep-copy MIME entities (except for on-disk data files). Encoding/decoding MIME::Latin1 deprecated, and 8-to-7 mapping removed. Really, MIME::Latin1 was one of my more dumber ideas. It's still there, but if you want to map 8-bit characters to Latin1 ASCII approximations when 7bit encoding, you'll have to request it explicitly. *But use quoted-printable for your 8-bit documents; that's what it's there for!* 7bit and 8bit "encoders" no longer encode. As per RFC-2045, these just do a pass-through of the data, but they'll warn you if you send bad data through. MIME::Entity suggests encoding. Now you can ask MIME::Entity's build() method to "suggest" a legal encoding based on the body and the content-type. No more guesswork! See the "mimesend" example. New module structure for MIME::Decoder classes. It should be easier for you to see what's happening. New MIME decoders! Support added for decoding `x-uuencode', and for decoding/encoding `x-gzip64'. You'll need "gzip" to make the latter work. Quoted-printable back on track... and then some. The 'quoted- printable' decoder now uses the newest MIME::QuotedPrint, and amends its output with guideline #8 from RFC2049 (From/.). *Thanks to Denis N. Antonioli for suggesting this.* Parsing Preamble and epilogue are now saved. These are saved in the parsed entities as simple string-arrays, and are output by print() if there. *Thanks to Jason L. Tibbitts for suggesting this.* The "multipart/digest" semantics are now preserved. Parts of digest messages have their mime_type() defaulted to "message/rfc822" instead of "text/plain", as per the RFC. *Thanks to Carsten Heyl for suggesting this.* Output Well-defined, more-complete print() output. When printing an entity, the output is now well-defined if the entity came from a MIME::Parser, even if using parse_nested_messages. See MIME::Entity for details. You can prevent recommended filenames from being output. This possible security hole has been plugged; when building MIME entities, you can specify a body path but suppress the filename in the header. *Thanks to Jason L. Tibbitts for suggesting this.* Bug fixes Win32 installations should work. The binmode() calls should work fine on Win32 now. *Thanks to numerous folks for their patches.* MIME::Head::add() now no longer downcases its argument. *Thanks to Brandon Browning & Jason L. Tibbitts for finding this bug.* Version 3.204 Bug in MIME::Head::original_text fixed. Well, it took a while, but another bug surfaced from my transition from 1.x to 2.x. This method was, quite idiotically, sorting the header fields. *Thanks, as usual, to Andreas Koenig for spotting this one.* MIME::ParserBase no longer defaults to RFC-1522-decoding headers. The documentation correctly stated that the default setting was to *not* RFC-1522-decode the headers. The code, on the other hand, was init'ing this parser option in the "on" position. This has been fixed. MIME::ParserBase::parse_nested_messages reexamined. If you use this feature, please re-read the documentation. It explains a little more precisely what the ramifications are. MIME::Entity tries harder to ensure MIME compliance. It is now a fatal error to use certain bad combinations of content type and encoding when "building", or to attempt to "attach" to anything that is not a multipart document. My apologies if this inconveniences anyone, but it was just too darn easy before for folks to create bad MIME, and gosh darn it, good libraries should at least *try* to protect you from mistakes. The "make" now halts if you don't have the right stuff, provided your MakeMaker supports PREREQ_PM. See the section on "REQUIREMENTS" for what you need to install this package. I still provide old courtesy copies of the MIME:: decoding modules. *Thanks to Hugo van der Sanden for suggesting this.* The "make test" is far less chatty. Okay, okay, STDERR is evil. Now a `"make test"' will just give you the important stuff: do a `"make test TEST_VERBOSE=1"' if you want the gory details (advisable if sending me a bug report). *Thanks to Andreas Koenig for suggesting this.* Version 3.203 No, there haven't been any major changes between 2.x and 3.x. The major-version increase was from a few more tweaks to get $VERSION to be calculated better and more efficiently (I had been using RCS version numbers in a way which created problems for users of CPAN::). After a couple of false starts, all modules have been upgraded to RCS 3.201 or higher. You can now parse a MIME message from a scalar, an array-of-scalars, or any MIME::IO-compliant object (including IO:: objects.) Take a look at parse_data() in MIME::ParserBase. The parser code has been modified to support the MIME::IO interface. *Thanks to fellow Chicagoan Tim Pierce (and countless others) for asking.* More sensible toolkit configuration. A new config() method in MIME::ToolUtils makes a lot of toolkit-wide configuration cleaner. Your old calls will still work, but with deprecation warnings. You can now sign messages just like in Mail::Internet. See MIME::Entity for the interface. You can now remove signatures from messages just like in Mail::Internet. See MIME::Entity for the interface. You can now compute/strip content lengths and other non-standard MIME fields. See sync_headers() in MIME::Entity. *Thanks to Tim Pierce for bringing the basic problem to my attention.* Many warnings are now silent unless $^W is true. That means unless you run your Perl with `-w', you won't see deprecation warnings, non-fatal-error messages, etc. But of course you run with `-w', so this doesn't affect you. `:-)' Completed the 7-bit encodings in MIME::Latin1. We hadn't had complete coverage in the conversion from 8- to 7-bit; now we do. *Thanks to Rolf Nelson for bringing this to my attention.* Fixed broken parse_two() in MIME::ParserBase. BTW, if your code worked with the "broken" code, it should *still* work. *Thanks again to Tim Pierce for bringing this to my attention.* Version 2.14 Just a few bug fixes to improve compatibility with Mail-Tools 1.08, and with the upcoming Perl 5.004 release. *Thanks to Jason L. Tibbitts III for reporting the problems so quickly.* Version 2.13 New features Added RFC-1522-style decoding of encoded header fields. Header decoding can now be done automatically during parsing via the new `decode()' method in MIME::Head... just tell your parser object that you want to `decode_headers()'. *Thanks to Kent Boortz for providing the idea, and the baseline RFC-1522- decoding code!* Building MIME messages is even easier. Now, when you use MIME::Entity's `build()' or `attach()', you can also supply individual mail headers to set (e.g., `-Subject', `-From', `- To'). Added `Disposition' to MIME::Entity's `build()' method. *Thanks to Kurt Freytag for suggesting this feature.* An `X-Mailer' header is now output by default in all MIME- Entity-prepared messages, so any bad MIME we generate can be traced back to this toolkit. Added `purge()' method to MIME::Entity for deleteing leftover files. *Thanks to Jason L. Tibbitts III for suggesting this feature.* Added `seek()' and `tell()' methods to built-in MIME::IO classes. Only guaranteed to work when reading! *Thanks to Jason L. Tibbitts III for suggesting this feature.* When parsing a multipart message with apparently no boundaries, the error message you get has been improved. *Thanks to Andreas Koenig for suggesting this.* Bug fixes Patched over a Perl 5.002 (and maybe earlier and later) bug involving FileHandle::new_tmpfile. It seems that the underlying filehandles were not being closed when the FileHandle objects went out of scope! There is now an internal routine that creates true FileHandle objects for anonymous temp files. *Thanks to Dragomir R. Radev and Zyx for reporting the weird behavior that led to the discovery of this bug.* MIME::Entity's `build()' method now warns you if you give it an illegal boundary string, and substitutes one of its own. MIME::Entity's `build()' method now generates safer, fully-RFC- 1521-compliant boundary strings. Bug in MIME::Decoder's `install()' method was fixed. *Thanks to Rolf Nelson and Nickolay Saukh for finding this.* Changed FileHandle::new_tmpfile to FileHandle->new_tmpfile, so some Perl installations will be happier. *Thanks to Larry W. Virden for finding this bug.* Gave `=over' an arg of 4 in all PODs. *Thanks to Larry W. Virden for pointing out the problems of bare =over's* Version 2.04 A bug in MIME::Entity's output method was corrected. MIME::Entity::print now outputs everything to the desired filehandle explicitly. *Thanks to Jake Morrison for pointing out the incompatibility with Mail::Header.* Version 2.03 Fixed bug in autogenerated filenames resulting from transposed "if" statement in MIME::Parser, removing spurious printing of header as well. (Annoyingly, this bug is invisible if debugging is turned on!) *Thanks to Andreas Koenig for bringing this to my attention.* Fixed bug in MIME::Entity::body() where it was using the bodyhandle completely incorrectly. *Thanks to Joel Noble for bringing this to my attention.* Fixed MIME::Head::VERSION so CPAN:: is happier. *Thanks to Larry Virden for bringing this to my attention.* Fixed undefined-variable warnings when dumping skeleton (happened when there was no Subject: line) *Thanks to Joel Noble for bringing this to my attention.* Version 2.02 Stupid, stupid bugs in both BASE64 encoding and decoding were fixed. *Thanks to Phil Abercrombie for locating them.* Version 2.01 Modules now inherit from the new Mail:: modules! This means big changes in behavior. MIME::Parser can now store message data in-core. There were a *lot* of requests for this feature. MIME::Entity can now compose messages. There were a *lot* of requests for this feature. Added option to parse `"message/rfc822"' as a pseduo-multipart document. *Thanks to Andreas Koenig for suggesting this.* Version 1.13 MIME::Head now no longer requires space after ":", although either a space or a tab after the ":" will be swallowed if there. *Thanks to Igor Starovoitov for pointing out this shortcoming.* Version 1.12 Fixed bugs in parser where CRLF-terminated lines were blowing out the handling of preambles/epilogues. *Thanks to Russell Sutherland for reporting this bug.* Fixed idiotic is_multipart() bug. *Thanks to Andreas Koenig for noticing it.* Added untested binmode() calls to parser for DOS, etc. systems. No idea if this will work... Reorganized the output_path() methods to allow easy use of inheritance, as per Achim Bohnet's suggestion. Changed MIME::Head to report mime_type more accurately. POSIX module no longer loaded by Parser if perl >= 5.002. Hey, 5.001'ers: let me know if this breaks stuff, okay? Added unsupported ./examples directory. Version 1.11 Converted over to using Makefile.PL. *Thanks to Andreas Koenig for the much-needed kick in the pants...* Added t/*.t files for testing. Eeeeeeeeeeeh...it's a start. Fixed bug in default parsing routine for generating output paths; it was warning about evil filenames if there simply *were* no recommended filenames. D'oh! Fixed redefined parts() method in Entity. Fixed bugs in Head where field name wasn't being case folded. Version 1.10 A typo was causing the epilogue of an inner multipart message to be swallowed to the end of the OUTER multipart message; this has now been fixed. *Thanks to Igor Starovoitov for reporting this bug.* A bad regexp for parameter names was causing some parameters to be parsed incorrectly; this has also been fixed. *Thanks again to Igor Starovoitov for reporting this bug.* It is now possible to get full control of the filenaming algorithm before output files are generated, and the default algorithm is safer. *Thanks to Laurent Amon for pointing out the problems, and suggesting some solutions.* Fixed illegal "simple" multipart test file. D'OH! Version 1.9 No changes: 1.8 failed CPAN registration Version 1.8 Fixed incompatibility with 5.001 and FileHandle::new_tmpfile Added COPYING file, and improved README. MIME-tools-5.515/COPYING0000644000175000017500000000360110677325674012604 0ustar dfsdfsThe "MIME-tools" Perl5 kit. Copyright (c) 1996 by Eryq. All rights reserved. Copyright (c) 1999 by ZeeGee Software Inc. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. You should have received a copy of the Perl license along with Perl; see the file README in Perl distribution. You should have received a copy of the GNU General Public License along with Perl; see the file Copying. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You should have received a copy of the Artistic License along with Perl; see the file Artistic. NO WARRANTY BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS MIME-tools-5.515/Makefile.PL0000644000175000017500000000231014261313354013500 0ustar dfsdfsuse strict; use warnings; use lib '.'; use inc::Module::Install; name 'MIME-tools'; module_name 'MIME::Tools'; version_from 'lib/MIME/Tools.pm'; author q{Eryq , Dianne Skoll , Dave O'Neill }; abstract 'Tools to manipulate MIME messages'; license 'perl'; # We require 5.8.x, for PerlIO support of "in memory" filehandles opened on scalars perl_version '5.008'; # Runtime deps requires 'Mail::Header' => 1.01; requires 'Mail::Internet' => 1.0203; requires 'Mail::Field' => 1.05; # We prefer 3.03, but can work with 2.20 requires 'MIME::Base64' => 2.20; recommends 'MIME::Base64' => 3.03; # Convert::BinHex is needed if you want to process # BinHex-encoded mail. These aren't really specified # by the MIME standards-track RFCs, so it's a # recommends rather than a requires recommends 'Convert::BinHex'; requires 'IO::File' => 1.13; requires 'IO::Handle'; requires 'File::Spec' => 0.6; requires 'File::Path' => 1; requires 'File::Temp' => 0.18; # Build deps build_requires 'Test::More'; build_requires 'Test::Deep'; WriteAll; MIME-tools-5.515/inc/0000755000175000017500000000000014612223175012304 5ustar dfsdfsMIME-tools-5.515/inc/Module/0000755000175000017500000000000014612223175013531 5ustar dfsdfsMIME-tools-5.515/inc/Module/Install.pm0000644000175000017500000003021712707736012015502 0ustar dfsdfs#line 1 package Module::Install; # For any maintainers: # The load order for Module::Install is a bit magic. # It goes something like this... # # IF ( host has Module::Install installed, creating author mode ) { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install # 3. The installed version of inc::Module::Install loads # 4. inc::Module::Install calls "require Module::Install" # 5. The ./inc/ version of Module::Install loads # } ELSE { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install # 3. The ./inc/ version of Module::Install loads # } use 5.006; use strict 'vars'; use Cwd (); use File::Find (); use File::Path (); use vars qw{$VERSION $MAIN}; BEGIN { # All Module::Install core packages now require synchronised versions. # This will be used to ensure we don't accidentally load old or # different versions of modules. # This is not enforced yet, but will be some time in the next few # releases once we can make sure it won't clash with custom # Module::Install extensions. $VERSION = '1.14'; # Storage for the pseudo-singleton $MAIN = undef; *inc::Module::Install::VERSION = *VERSION; @inc::Module::Install::ISA = __PACKAGE__; } sub import { my $class = shift; my $self = $class->new(@_); my $who = $self->_caller; #------------------------------------------------------------- # all of the following checks should be included in import(), # to allow "eval 'require Module::Install; 1' to test # installation of Module::Install. (RT #51267) #------------------------------------------------------------- # Whether or not inc::Module::Install is actually loaded, the # $INC{inc/Module/Install.pm} is what will still get set as long as # the caller loaded module this in the documented manner. # If not set, the caller may NOT have loaded the bundled version, and thus # they may not have a MI version that works with the Makefile.PL. This would # result in false errors or unexpected behaviour. And we don't want that. my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; unless ( $INC{$file} ) { die <<"END_DIE" } Please invoke ${\__PACKAGE__} with: use inc::${\__PACKAGE__}; not: use ${\__PACKAGE__}; END_DIE # This reportedly fixes a rare Win32 UTC file time issue, but # as this is a non-cross-platform XS module not in the core, # we shouldn't really depend on it. See RT #24194 for detail. # (Also, this module only supports Perl 5.6 and above). eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006; # If the script that is loading Module::Install is from the future, # then make will detect this and cause it to re-run over and over # again. This is bad. Rather than taking action to touch it (which # is unreliable on some platforms and requires write permissions) # for now we should catch this and refuse to run. if ( -f $0 ) { my $s = (stat($0))[9]; # If the modification time is only slightly in the future, # sleep briefly to remove the problem. my $a = $s - time; if ( $a > 0 and $a < 5 ) { sleep 5 } # Too far in the future, throw an error. my $t = time; if ( $s > $t ) { die <<"END_DIE" } Your installer $0 has a modification time in the future ($s > $t). This is known to create infinite loops in make. Please correct this, then run $0 again. END_DIE } # Build.PL was formerly supported, but no longer is due to excessive # difficulty in implementing every single feature twice. if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" } Module::Install no longer supports Build.PL. It was impossible to maintain duel backends, and has been deprecated. Please remove all Build.PL files and only use the Makefile.PL installer. END_DIE #------------------------------------------------------------- # To save some more typing in Module::Install installers, every... # use inc::Module::Install # ...also acts as an implicit use strict. $^H |= strict::bits(qw(refs subs vars)); #------------------------------------------------------------- unless ( -f $self->{file} ) { foreach my $key (keys %INC) { delete $INC{$key} if $key =~ /Module\/Install/; } local $^W; require "$self->{path}/$self->{dispatch}.pm"; File::Path::mkpath("$self->{prefix}/$self->{author}"); $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); $self->{admin}->init; @_ = ($class, _self => $self); goto &{"$self->{name}::import"}; } local $^W; *{"${who}::AUTOLOAD"} = $self->autoload; $self->preload; # Unregister loader and worker packages so subdirs can use them again delete $INC{'inc/Module/Install.pm'}; delete $INC{'Module/Install.pm'}; # Save to the singleton $MAIN = $self; return 1; } sub autoload { my $self = shift; my $who = $self->_caller; my $cwd = Cwd::getcwd(); my $sym = "${who}::AUTOLOAD"; $sym->{$cwd} = sub { my $pwd = Cwd::getcwd(); if ( my $code = $sym->{$pwd} ) { # Delegate back to parent dirs goto &$code unless $cwd eq $pwd; } unless ($$sym =~ s/([^:]+)$//) { # XXX: it looks like we can't retrieve the missing function # via $$sym (usually $main::AUTOLOAD) in this case. # I'm still wondering if we should slurp Makefile.PL to # get some context or not ... my ($package, $file, $line) = caller; die <<"EOT"; Unknown function is found at $file line $line. Execution of $file aborted due to runtime errors. If you're a contributor to a project, you may need to install some Module::Install extensions from CPAN (or other repository). If you're a user of a module, please contact the author. EOT } my $method = $1; if ( uc($method) eq $method ) { # Do nothing return; } elsif ( $method =~ /^_/ and $self->can($method) ) { # Dispatch to the root M:I class return $self->$method(@_); } # Dispatch to the appropriate plugin unshift @_, ( $self, $1 ); goto &{$self->can('call')}; }; } sub preload { my $self = shift; unless ( $self->{extensions} ) { $self->load_extensions( "$self->{prefix}/$self->{path}", $self ); } my @exts = @{$self->{extensions}}; unless ( @exts ) { @exts = $self->{admin}->load_all_extensions; } my %seen; foreach my $obj ( @exts ) { while (my ($method, $glob) = each %{ref($obj) . '::'}) { next unless $obj->can($method); next if $method =~ /^_/; next if $method eq uc($method); $seen{$method}++; } } my $who = $self->_caller; foreach my $name ( sort keys %seen ) { local $^W; *{"${who}::$name"} = sub { ${"${who}::AUTOLOAD"} = "${who}::$name"; goto &{"${who}::AUTOLOAD"}; }; } } sub new { my ($class, %args) = @_; delete $INC{'FindBin.pm'}; { # to suppress the redefine warning local $SIG{__WARN__} = sub {}; require FindBin; } # ignore the prefix on extension modules built from top level. my $base_path = Cwd::abs_path($FindBin::Bin); unless ( Cwd::abs_path(Cwd::getcwd()) eq $base_path ) { delete $args{prefix}; } return $args{_self} if $args{_self}; $args{dispatch} ||= 'Admin'; $args{prefix} ||= 'inc'; $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); $args{bundle} ||= 'inc/BUNDLES'; $args{base} ||= $base_path; $class =~ s/^\Q$args{prefix}\E:://; $args{name} ||= $class; $args{version} ||= $class->VERSION; unless ( $args{path} ) { $args{path} = $args{name}; $args{path} =~ s!::!/!g; } $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; $args{wrote} = 0; bless( \%args, $class ); } sub call { my ($self, $method) = @_; my $obj = $self->load($method) or return; splice(@_, 0, 2, $obj); goto &{$obj->can($method)}; } sub load { my ($self, $method) = @_; $self->load_extensions( "$self->{prefix}/$self->{path}", $self ) unless $self->{extensions}; foreach my $obj (@{$self->{extensions}}) { return $obj if $obj->can($method); } my $admin = $self->{admin} or die <<"END_DIE"; The '$method' method does not exist in the '$self->{prefix}' path! Please remove the '$self->{prefix}' directory and run $0 again to load it. END_DIE my $obj = $admin->load($method, 1); push @{$self->{extensions}}, $obj; $obj; } sub load_extensions { my ($self, $path, $top) = @_; my $should_reload = 0; unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) { unshift @INC, $self->{prefix}; $should_reload = 1; } foreach my $rv ( $self->find_extensions($path) ) { my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; local $@; my $new = eval { local $^W; require $file; $pkg->can('new') }; unless ( $new ) { warn $@ if $@; next; } $self->{pathnames}{$pkg} = $should_reload ? delete $INC{$file} : $INC{$file}; push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); } $self->{extensions} ||= []; } sub find_extensions { my ($self, $path) = @_; my @found; File::Find::find( sub { my $file = $File::Find::name; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; my $subpath = $1; return if lc($subpath) eq lc($self->{dispatch}); $file = "$self->{path}/$subpath.pm"; my $pkg = "$self->{name}::$subpath"; $pkg =~ s!/!::!g; # If we have a mixed-case package name, assume case has been preserved # correctly. Otherwise, root through the file to locate the case-preserved # version of the package name. if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { my $content = Module::Install::_read($subpath . '.pm'); my $in_pod = 0; foreach ( split /\n/, $content ) { $in_pod = 1 if /^=\w/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); # skip pod text next if /^\s*#/; # and comments if ( m/^\s*package\s+($pkg)\s*;/i ) { $pkg = $1; last; } } } push @found, [ $file, $pkg ]; }, $path ) if -d $path; @found; } ##################################################################### # Common Utility Functions sub _caller { my $depth = 0; my $call = caller($depth); while ( $call eq __PACKAGE__ ) { $depth++; $call = caller($depth); } return $call; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _read { local *FH; open( FH, '<', $_[0] ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_NEW sub _read { local *FH; open( FH, "< $_[0]" ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_OLD sub _readperl { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s; $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg; return $string; } sub _readpod { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; return $string if $_[0] =~ /\.pod\z/; $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg; $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg; $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg; $string =~ s/^\n+//s; return $string; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _write { local *FH; open( FH, '>', $_[0] ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_NEW sub _write { local *FH; open( FH, "> $_[0]" ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_OLD # _version is for processing module versions (eg, 1.03_05) not # Perl versions (eg, 5.8.1). sub _version { my $s = shift || 0; my $d =()= $s =~ /(\.)/g; if ( $d >= 2 ) { # Normalise multipart versions $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg; } $s =~ s/^(\d+)\.?//; my $l = $1 || 0; my @v = map { $_ . '0' x (3 - length $_) } $s =~ /(\d{1,3})\D?/g; $l = $l . '.' . join '', @v if @v; return $l + 0; } sub _cmp { _version($_[1]) <=> _version($_[2]); } # Cloned from Params::Util::_CLASS sub _CLASS { ( defined $_[0] and ! ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s ) ? $_[0] : undef; } 1; # Copyright 2008 - 2012 Adam Kennedy. MIME-tools-5.515/inc/Module/Install/0000755000175000017500000000000014612223175015137 5ustar dfsdfsMIME-tools-5.515/inc/Module/Install/Fetch.pm0000644000175000017500000000462712707736012016541 0ustar dfsdfs#line 1 package Module::Install::Fetch; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub get_file { my ($self, %args) = @_; my ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { $args{url} = $args{ftp_url} or (warn("LWP support unavailable!\n"), return); ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; } $|++; print "Fetching '$file' from $host... "; unless (eval { require Socket; Socket::inet_aton($host) }) { warn "'$host' resolve failed!\n"; return; } return unless $scheme eq 'ftp' or $scheme eq 'http'; require Cwd; my $dir = Cwd::getcwd(); chdir $args{local_dir} or return if exists $args{local_dir}; if (eval { require LWP::Simple; 1 }) { LWP::Simple::mirror($args{url}, $file); } elsif (eval { require Net::FTP; 1 }) { eval { # use Net::FTP to get past firewall my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); $ftp->login("anonymous", 'anonymous@example.com'); $ftp->cwd($path); $ftp->binary; $ftp->get($file) or (warn("$!\n"), return); $ftp->quit; } } elsif (my $ftp = $self->can_run('ftp')) { eval { # no Net::FTP, fallback to ftp.exe require FileHandle; my $fh = FileHandle->new; local $SIG{CHLD} = 'IGNORE'; unless ($fh->open("|$ftp -n")) { warn "Couldn't open ftp: $!\n"; chdir $dir; return; } my @dialog = split(/\n/, <<"END_FTP"); open $host user anonymous anonymous\@example.com cd $path binary get $file $file quit END_FTP foreach (@dialog) { $fh->print("$_\n") } $fh->close; } } else { warn "No working 'ftp' program available!\n"; chdir $dir; return; } unless (-f $file) { warn "Fetching failed: $@\n"; chdir $dir; return; } return if exists $args{size} and -s $file != $args{size}; system($args{run}) if exists $args{run}; unlink($file) if $args{remove}; print(((!exists $args{check_for} or -e $args{check_for}) ? "done!" : "failed! ($!)"), "\n"); chdir $dir; return !$?; } 1; MIME-tools-5.515/inc/Module/Install/WriteAll.pm0000644000175000017500000000237612707736012017232 0ustar dfsdfs#line 1 package Module::Install::WriteAll; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = qw{Module::Install::Base}; $ISCORE = 1; } sub WriteAll { my $self = shift; my %args = ( meta => 1, sign => 0, inline => 0, check_nmake => 1, @_, ); $self->sign(1) if $args{sign}; $self->admin->WriteAll(%args) if $self->is_admin; $self->check_nmake if $args{check_nmake}; unless ( $self->makemaker_args->{PL_FILES} ) { # XXX: This still may be a bit over-defensive... unless ($self->makemaker(6.25)) { $self->makemaker_args( PL_FILES => {} ) if -f 'Build.PL'; } } # Until ExtUtils::MakeMaker support MYMETA.yml, make sure # we clean it up properly ourself. $self->realclean_files('MYMETA.yml'); if ( $args{inline} ) { $self->Inline->write; } else { $self->Makefile->write; } # The Makefile write process adds a couple of dependencies, # so write the META.yml files after the Makefile. if ( $args{meta} ) { $self->Meta->write; } # Experimental support for MYMETA if ( $ENV{X_MYMETA} ) { if ( $ENV{X_MYMETA} eq 'JSON' ) { $self->Meta->write_mymeta_json; } else { $self->Meta->write_mymeta_yaml; } } return 1; } 1; MIME-tools-5.515/inc/Module/Install/Win32.pm0000644000175000017500000000340312707736012016401 0ustar dfsdfs#line 1 package Module::Install::Win32; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # determine if the user needs nmake, and download it if needed sub check_nmake { my $self = shift; $self->load('can_run'); $self->load('get_file'); require Config; return unless ( $^O eq 'MSWin32' and $Config::Config{make} and $Config::Config{make} =~ /^nmake\b/i and ! $self->can_run('nmake') ); print "The required 'nmake' executable not found, fetching it...\n"; require File::Basename; my $rv = $self->get_file( url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', local_dir => File::Basename::dirname($^X), size => 51928, run => 'Nmake15.exe /o > nul', check_for => 'Nmake.exe', remove => 1, ); die <<'END_MESSAGE' unless $rv; ------------------------------------------------------------------------------- Since you are using Microsoft Windows, you will need the 'nmake' utility before installation. It's available at: http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe or ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- END_MESSAGE } 1; MIME-tools-5.515/inc/Module/Install/Can.pm0000644000175000017500000000615712707736012016211 0ustar dfsdfs#line 1 package Module::Install::Can; use strict; use Config (); use ExtUtils::MakeMaker (); use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # check if we can load some module ### Upgrade this to not have to load the module if possible sub can_use { my ($self, $mod, $ver) = @_; $mod =~ s{::|\\}{/}g; $mod .= '.pm' unless $mod =~ /\.pm$/i; my $pkg = $mod; $pkg =~ s{/}{::}g; $pkg =~ s{\.pm$}{}i; local $@; eval { require $mod; $pkg->VERSION($ver || 0); 1 }; } # Check if we can run some command sub can_run { my ($self, $cmd) = @_; my $_cmd = $cmd; return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { next if $dir eq ''; require File::Spec; my $abs = File::Spec->catfile($dir, $cmd); return $abs if (-x $abs or $abs = MM->maybe_command($abs)); } return; } # Can our C compiler environment build XS files sub can_xs { my $self = shift; # Ensure we have the CBuilder module $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 ); # Do we have the configure_requires checker? local $@; eval "require ExtUtils::CBuilder;"; if ( $@ ) { # They don't obey configure_requires, so it is # someone old and delicate. Try to avoid hurting # them by falling back to an older simpler test. return $self->can_cc(); } # Do we have a working C compiler my $builder = ExtUtils::CBuilder->new( quiet => 1, ); unless ( $builder->have_compiler ) { # No working C compiler return 0; } # Write a C file representative of what XS becomes require File::Temp; my ( $FH, $tmpfile ) = File::Temp::tempfile( "compilexs-XXXXX", SUFFIX => '.c', ); binmode $FH; print $FH <<'END_C'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" int main(int argc, char **argv) { return 0; } int boot_sanexs() { return 1; } END_C close $FH; # Can the C compiler access the same headers XS does my @libs = (); my $object = undef; eval { local $^W = 0; $object = $builder->compile( source => $tmpfile, ); @libs = $builder->link( objects => $object, module_name => 'sanexs', ); }; my $result = $@ ? 0 : 1; # Clean up all the build files foreach ( $tmpfile, $object, @libs ) { next unless defined $_; 1 while unlink; } return $result; } # Can we locate a (the) C compiler sub can_cc { my $self = shift; my @chunks = split(/ /, $Config::Config{cc}) or return; # $Config{cc} may contain args; try to find out the program part while (@chunks) { return $self->can_run("@chunks") || (pop(@chunks), next); } return; } # Fix Cygwin bug on maybe_command(); if ( $^O eq 'cygwin' ) { require ExtUtils::MM_Cygwin; require ExtUtils::MM_Win32; if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { *ExtUtils::MM_Cygwin::maybe_command = sub { my ($self, $file) = @_; if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { ExtUtils::MM_Win32->maybe_command($file); } else { ExtUtils::MM_Unix->maybe_command($file); } } } } 1; __END__ #line 236 MIME-tools-5.515/inc/Module/Install/Metadata.pm0000644000175000017500000004330212707736012017221 0ustar dfsdfs#line 1 package Module::Install::Metadata; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } my @boolean_keys = qw{ sign }; my @scalar_keys = qw{ name module_name abstract version distribution_type tests installdirs }; my @tuple_keys = qw{ configure_requires build_requires requires recommends bundles resources }; my @resource_keys = qw{ homepage bugtracker repository }; my @array_keys = qw{ keywords author }; *authors = \&author; sub Meta { shift } sub Meta_BooleanKeys { @boolean_keys } sub Meta_ScalarKeys { @scalar_keys } sub Meta_TupleKeys { @tuple_keys } sub Meta_ResourceKeys { @resource_keys } sub Meta_ArrayKeys { @array_keys } foreach my $key ( @boolean_keys ) { *$key = sub { my $self = shift; if ( defined wantarray and not @_ ) { return $self->{values}->{$key}; } $self->{values}->{$key} = ( @_ ? $_[0] : 1 ); return $self; }; } foreach my $key ( @scalar_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} = shift; return $self; }; } foreach my $key ( @array_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} ||= []; push @{$self->{values}->{$key}}, @_; return $self; }; } foreach my $key ( @resource_keys ) { *$key = sub { my $self = shift; unless ( @_ ) { return () unless $self->{values}->{resources}; return map { $_->[1] } grep { $_->[0] eq $key } @{ $self->{values}->{resources} }; } return $self->{values}->{resources}->{$key} unless @_; my $uri = shift or die( "Did not provide a value to $key()" ); $self->resources( $key => $uri ); return 1; }; } foreach my $key ( grep { $_ ne "resources" } @tuple_keys) { *$key = sub { my $self = shift; return $self->{values}->{$key} unless @_; my @added; while ( @_ ) { my $module = shift or last; my $version = shift || 0; push @added, [ $module, $version ]; } push @{ $self->{values}->{$key} }, @added; return map {@$_} @added; }; } # Resource handling my %lc_resource = map { $_ => 1 } qw{ homepage license bugtracker repository }; sub resources { my $self = shift; while ( @_ ) { my $name = shift or last; my $value = shift or next; if ( $name eq lc $name and ! $lc_resource{$name} ) { die("Unsupported reserved lowercase resource '$name'"); } $self->{values}->{resources} ||= []; push @{ $self->{values}->{resources} }, [ $name, $value ]; } $self->{values}->{resources}; } # Aliases for build_requires that will have alternative # meanings in some future version of META.yml. sub test_requires { shift->build_requires(@_) } sub install_requires { shift->build_requires(@_) } # Aliases for installdirs options sub install_as_core { $_[0]->installdirs('perl') } sub install_as_cpan { $_[0]->installdirs('site') } sub install_as_site { $_[0]->installdirs('site') } sub install_as_vendor { $_[0]->installdirs('vendor') } sub dynamic_config { my $self = shift; my $value = @_ ? shift : 1; if ( $self->{values}->{dynamic_config} ) { # Once dynamic we never change to static, for safety return 0; } $self->{values}->{dynamic_config} = $value ? 1 : 0; return 1; } # Convenience command sub static_config { shift->dynamic_config(0); } sub perl_version { my $self = shift; return $self->{values}->{perl_version} unless @_; my $version = shift or die( "Did not provide a value to perl_version()" ); # Normalize the version $version = $self->_perl_version($version); # We don't support the really old versions unless ( $version >= 5.005 ) { die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n"; } $self->{values}->{perl_version} = $version; } sub all_from { my ( $self, $file ) = @_; unless ( defined($file) ) { my $name = $self->name or die( "all_from called with no args without setting name() first" ); $file = join('/', 'lib', split(/-/, $name)) . '.pm'; $file =~ s{.*/}{} unless -e $file; unless ( -e $file ) { die("all_from cannot find $file from $name"); } } unless ( -f $file ) { die("The path '$file' does not exist, or is not a file"); } $self->{values}{all_from} = $file; # Some methods pull from POD instead of code. # If there is a matching .pod, use that instead my $pod = $file; $pod =~ s/\.pm$/.pod/i; $pod = $file unless -e $pod; # Pull the different values $self->name_from($file) unless $self->name; $self->version_from($file) unless $self->version; $self->perl_version_from($file) unless $self->perl_version; $self->author_from($pod) unless @{$self->author || []}; $self->license_from($pod) unless $self->license; $self->abstract_from($pod) unless $self->abstract; return 1; } sub provides { my $self = shift; my $provides = ( $self->{values}->{provides} ||= {} ); %$provides = (%$provides, @_) if @_; return $provides; } sub auto_provides { my $self = shift; return $self unless $self->is_admin; unless (-e 'MANIFEST') { warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; return $self; } # Avoid spurious warnings as we are not checking manifest here. local $SIG{__WARN__} = sub {1}; require ExtUtils::Manifest; local *ExtUtils::Manifest::manicheck = sub { return }; require Module::Build; my $build = Module::Build->new( dist_name => $self->name, dist_version => $self->version, license => $self->license, ); $self->provides( %{ $build->find_dist_packages || {} } ); } sub feature { my $self = shift; my $name = shift; my $features = ( $self->{values}->{features} ||= [] ); my $mods; if ( @_ == 1 and ref( $_[0] ) ) { # The user used ->feature like ->features by passing in the second # argument as a reference. Accomodate for that. $mods = $_[0]; } else { $mods = \@_; } my $count = 0; push @$features, ( $name => [ map { ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_ } @$mods ] ); return @$features; } sub features { my $self = shift; while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { $self->feature( $name, @$mods ); } return $self->{values}->{features} ? @{ $self->{values}->{features} } : (); } sub no_index { my $self = shift; my $type = shift; push @{ $self->{values}->{no_index}->{$type} }, @_ if $type; return $self->{values}->{no_index}; } sub read { my $self = shift; $self->include_deps( 'YAML::Tiny', 0 ); require YAML::Tiny; my $data = YAML::Tiny::LoadFile('META.yml'); # Call methods explicitly in case user has already set some values. while ( my ( $key, $value ) = each %$data ) { next unless $self->can($key); if ( ref $value eq 'HASH' ) { while ( my ( $module, $version ) = each %$value ) { $self->can($key)->($self, $module => $version ); } } else { $self->can($key)->($self, $value); } } return $self; } sub write { my $self = shift; return $self unless $self->is_admin; $self->admin->write_meta; return $self; } sub version_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->version( ExtUtils::MM_Unix->parse_version($file) ); # for version integrity check $self->makemaker_args( VERSION_FROM => $file ); } sub abstract_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->abstract( bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix' )->parse_abstract($file) ); } # Add both distribution and module name sub name_from { my ($self, $file) = @_; if ( Module::Install::_read($file) =~ m/ ^ \s* package \s* ([\w:]+) [\s|;]* /ixms ) { my ($name, $module_name) = ($1, $1); $name =~ s{::}{-}g; $self->name($name); unless ( $self->module_name ) { $self->module_name($module_name); } } else { die("Cannot determine name from $file\n"); } } sub _extract_perl_version { if ( $_[0] =~ m/ ^\s* (?:use|require) \s* v? ([\d_\.]+) \s* ; /ixms ) { my $perl_version = $1; $perl_version =~ s{_}{}g; return $perl_version; } else { return; } } sub perl_version_from { my $self = shift; my $perl_version=_extract_perl_version(Module::Install::_read($_[0])); if ($perl_version) { $self->perl_version($perl_version); } else { warn "Cannot determine perl version info from $_[0]\n"; return; } } sub author_from { my $self = shift; my $content = Module::Install::_read($_[0]); if ($content =~ m/ =head \d \s+ (?:authors?)\b \s* ([^\n]*) | =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* ([^\n]*) /ixms) { my $author = $1 || $2; # XXX: ugly but should work anyway... if (eval "require Pod::Escapes; 1") { # Pod::Escapes has a mapping table. # It's in core of perl >= 5.9.3, and should be installed # as one of the Pod::Simple's prereqs, which is a prereq # of Pod::Text 3.x (see also below). $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $Pod::Escapes::Name2character_number{$1} ? chr($Pod::Escapes::Name2character_number{$1}) : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) { # Pod::Text < 3.0 has yet another mapping table, # though the table name of 2.x and 1.x are different. # (1.x is in core of Perl < 5.6, 2.x is in core of # Perl < 5.9.3) my $mapping = ($Pod::Text::VERSION < 2) ? \%Pod::Text::HTML_Escapes : \%Pod::Text::ESCAPES; $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $mapping->{$1} ? $mapping->{$1} : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } else { $author =~ s{E}{<}g; $author =~ s{E}{>}g; } $self->author($author); } else { warn "Cannot determine author info from $_[0]\n"; } } #Stolen from M::B my %license_urls = ( perl => 'http://dev.perl.org/licenses/', apache => 'http://apache.org/licenses/LICENSE-2.0', apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1', artistic => 'http://opensource.org/licenses/artistic-license.php', artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', lgpl => 'http://opensource.org/licenses/lgpl-license.php', lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', bsd => 'http://opensource.org/licenses/bsd-license.php', gpl => 'http://opensource.org/licenses/gpl-license.php', gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', mit => 'http://opensource.org/licenses/mit-license.php', mozilla => 'http://opensource.org/licenses/mozilla1.1.php', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); sub license { my $self = shift; return $self->{values}->{license} unless @_; my $license = shift or die( 'Did not provide a value to license()' ); $license = __extract_license($license) || lc $license; $self->{values}->{license} = $license; # Automatically fill in license URLs if ( $license_urls{$license} ) { $self->resources( license => $license_urls{$license} ); } return 1; } sub _extract_license { my $pod = shift; my $matched; return __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ L(?i:ICEN[CS]E|ICENSING)\b.*?) (=head \d.*|=cut.*|)\z /xms ) || __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ (?:C(?i:OPYRIGHTS?)|L(?i:EGAL))\b.*?) (=head \d.*|=cut.*|)\z /xms ); } sub __extract_license { my $license_text = shift or return; my @phrases = ( '(?:under )?the same (?:terms|license) as (?:perl|the perl (?:\d )?programming language)' => 'perl', 1, '(?:under )?the terms of (?:perl|the perl programming language) itself' => 'perl', 1, 'Artistic and GPL' => 'perl', 1, 'GNU general public license' => 'gpl', 1, 'GNU public license' => 'gpl', 1, 'GNU lesser general public license' => 'lgpl', 1, 'GNU lesser public license' => 'lgpl', 1, 'GNU library general public license' => 'lgpl', 1, 'GNU library public license' => 'lgpl', 1, 'GNU Free Documentation license' => 'unrestricted', 1, 'GNU Affero General Public License' => 'open_source', 1, '(?:Free)?BSD license' => 'bsd', 1, 'Artistic license 2\.0' => 'artistic_2', 1, 'Artistic license' => 'artistic', 1, 'Apache (?:Software )?license' => 'apache', 1, 'GPL' => 'gpl', 1, 'LGPL' => 'lgpl', 1, 'BSD' => 'bsd', 1, 'Artistic' => 'artistic', 1, 'MIT' => 'mit', 1, 'Mozilla Public License' => 'mozilla', 1, 'Q Public License' => 'open_source', 1, 'OpenSSL License' => 'unrestricted', 1, 'SSLeay License' => 'unrestricted', 1, 'zlib License' => 'open_source', 1, 'proprietary' => 'proprietary', 0, ); while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) { $pattern =~ s#\s+#\\s+#gs; if ( $license_text =~ /\b$pattern\b/i ) { return $license; } } return ''; } sub license_from { my $self = shift; if (my $license=_extract_license(Module::Install::_read($_[0]))) { $self->license($license); } else { warn "Cannot determine license info from $_[0]\n"; return 'unknown'; } } sub _extract_bugtracker { my @links = $_[0] =~ m#L<( https?\Q://rt.cpan.org/\E[^>]+| https?\Q://github.com/\E[\w_]+/[\w_]+/issues| https?\Q://code.google.com/p/\E[\w_\-]+/issues/list )>#gx; my %links; @links{@links}=(); @links=keys %links; return @links; } sub bugtracker_from { my $self = shift; my $content = Module::Install::_read($_[0]); my @links = _extract_bugtracker($content); unless ( @links ) { warn "Cannot determine bugtracker info from $_[0]\n"; return 0; } if ( @links > 1 ) { warn "Found more than one bugtracker link in $_[0]\n"; return 0; } # Set the bugtracker bugtracker( $links[0] ); return 1; } sub requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->requires( $module => $version ); } } sub test_requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->test_requires( $module => $version ); } } # Convert triple-part versions (eg, 5.6.1 or 5.8.9) to # numbers (eg, 5.006001 or 5.008009). # Also, convert double-part versions (eg, 5.8) sub _perl_version { my $v = $_[-1]; $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e; $v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e; $v =~ s/(\.\d\d\d)000$/$1/; $v =~ s/_.+$//; if ( ref($v) ) { # Numify $v = $v + 0; } return $v; } sub add_metadata { my $self = shift; my %hash = @_; for my $key (keys %hash) { warn "add_metadata: $key is not prefixed with 'x_'.\n" . "Use appopriate function to add non-private metadata.\n" unless $key =~ /^x_/; $self->{values}->{$key} = $hash{$key}; } } ###################################################################### # MYMETA Support sub WriteMyMeta { die "WriteMyMeta has been deprecated"; } sub write_mymeta_yaml { my $self = shift; # We need YAML::Tiny to write the MYMETA.yml file unless ( eval { require YAML::Tiny; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.yml\n"; YAML::Tiny::DumpFile('MYMETA.yml', $meta); } sub write_mymeta_json { my $self = shift; # We need JSON to write the MYMETA.json file unless ( eval { require JSON; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.json\n"; Module::Install::_write( 'MYMETA.json', JSON->new->pretty(1)->canonical->encode($meta), ); } sub _write_mymeta_data { my $self = shift; # If there's no existing META.yml there is nothing we can do return undef unless -f 'META.yml'; # We need Parse::CPAN::Meta to load the file unless ( eval { require Parse::CPAN::Meta; 1; } ) { return undef; } # Merge the perl version into the dependencies my $val = $self->Meta->{values}; my $perl = delete $val->{perl_version}; if ( $perl ) { $val->{requires} ||= []; my $requires = $val->{requires}; # Canonize to three-dot version after Perl 5.6 if ( $perl >= 5.006 ) { $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e } unshift @$requires, [ perl => $perl ]; } # Load the advisory META.yml file my @yaml = Parse::CPAN::Meta::LoadFile('META.yml'); my $meta = $yaml[0]; # Overwrite the non-configure dependency hashes delete $meta->{requires}; delete $meta->{build_requires}; delete $meta->{recommends}; if ( exists $val->{requires} ) { $meta->{requires} = { map { @$_ } @{ $val->{requires} } }; } if ( exists $val->{build_requires} ) { $meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } }; } return $meta; } 1; MIME-tools-5.515/inc/Module/Install/Makefile.pm0000644000175000017500000002743712761045671017235 0ustar dfsdfs#line 1 package Module::Install::Makefile; use strict 'vars'; use ExtUtils::MakeMaker (); use Module::Install::Base (); use Fcntl qw/:flock :seek/; use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.14'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub Makefile { $_[0] } my %seen = (); sub prompt { shift; # Infinite loop protection my @c = caller(); if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; } # In automated testing or non-interactive session, always use defaults if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) { local $ENV{PERL_MM_USE_DEFAULT} = 1; goto &ExtUtils::MakeMaker::prompt; } else { goto &ExtUtils::MakeMaker::prompt; } } # Store a cleaned up version of the MakeMaker version, # since we need to behave differently in a variety of # ways based on the MM version. my $makemaker = eval $ExtUtils::MakeMaker::VERSION; # If we are passed a param, do a "newer than" comparison. # Otherwise, just return the MakeMaker version. sub makemaker { ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0 } # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified # as we only need to know here whether the attribute is an array # or a hash or something else (which may or may not be appendable). my %makemaker_argtype = ( C => 'ARRAY', CONFIG => 'ARRAY', # CONFIGURE => 'CODE', # ignore DIR => 'ARRAY', DL_FUNCS => 'HASH', DL_VARS => 'ARRAY', EXCLUDE_EXT => 'ARRAY', EXE_FILES => 'ARRAY', FUNCLIST => 'ARRAY', H => 'ARRAY', IMPORTS => 'HASH', INCLUDE_EXT => 'ARRAY', LIBS => 'ARRAY', # ignore '' MAN1PODS => 'HASH', MAN3PODS => 'HASH', META_ADD => 'HASH', META_MERGE => 'HASH', PL_FILES => 'HASH', PM => 'HASH', PMLIBDIRS => 'ARRAY', PMLIBPARENTDIRS => 'ARRAY', PREREQ_PM => 'HASH', CONFIGURE_REQUIRES => 'HASH', SKIP => 'ARRAY', TYPEMAPS => 'ARRAY', XS => 'HASH', # VERSION => ['version',''], # ignore # _KEEP_AFTER_FLUSH => '', clean => 'HASH', depend => 'HASH', dist => 'HASH', dynamic_lib=> 'HASH', linkext => 'HASH', macro => 'HASH', postamble => 'HASH', realclean => 'HASH', test => 'HASH', tool_autosplit => 'HASH', # special cases where you can use makemaker_append CCFLAGS => 'APPENDABLE', DEFINE => 'APPENDABLE', INC => 'APPENDABLE', LDDLFLAGS => 'APPENDABLE', LDFROM => 'APPENDABLE', ); sub makemaker_args { my ($self, %new_args) = @_; my $args = ( $self->{makemaker_args} ||= {} ); foreach my $key (keys %new_args) { if ($makemaker_argtype{$key}) { if ($makemaker_argtype{$key} eq 'ARRAY') { $args->{$key} = [] unless defined $args->{$key}; unless (ref $args->{$key} eq 'ARRAY') { $args->{$key} = [$args->{$key}] } push @{$args->{$key}}, ref $new_args{$key} eq 'ARRAY' ? @{$new_args{$key}} : $new_args{$key}; } elsif ($makemaker_argtype{$key} eq 'HASH') { $args->{$key} = {} unless defined $args->{$key}; foreach my $skey (keys %{ $new_args{$key} }) { $args->{$key}{$skey} = $new_args{$key}{$skey}; } } elsif ($makemaker_argtype{$key} eq 'APPENDABLE') { $self->makemaker_append($key => $new_args{$key}); } } else { if (defined $args->{$key}) { warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n}; } $args->{$key} = $new_args{$key}; } } return $args; } # For mm args that take multiple space-separated args, # append an argument to the current list. sub makemaker_append { my $self = shift; my $name = shift; my $args = $self->makemaker_args; $args->{$name} = defined $args->{$name} ? join( ' ', $args->{$name}, @_ ) : join( ' ', @_ ); } sub build_subdirs { my $self = shift; my $subdirs = $self->makemaker_args->{DIR} ||= []; for my $subdir (@_) { push @$subdirs, $subdir; } } sub clean_files { my $self = shift; my $clean = $self->makemaker_args->{clean} ||= {}; %$clean = ( %$clean, FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_), ); } sub realclean_files { my $self = shift; my $realclean = $self->makemaker_args->{realclean} ||= {}; %$realclean = ( %$realclean, FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_), ); } sub libs { my $self = shift; my $libs = ref $_[0] ? shift : [ shift ]; $self->makemaker_args( LIBS => $libs ); } sub inc { my $self = shift; $self->makemaker_args( INC => shift ); } sub _wanted_t { } sub tests_recursive { my $self = shift; my $dir = shift || 't'; unless ( -d $dir ) { die "tests_recursive dir '$dir' does not exist"; } my %tests = map { $_ => 1 } split / /, ($self->tests || ''); require File::Find; File::Find::find( sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 }, $dir ); $self->tests( join ' ', sort keys %tests ); } sub write { my $self = shift; die "&Makefile->write() takes no arguments\n" if @_; # Check the current Perl version my $perl_version = $self->perl_version; if ( $perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; } # Make sure we have a new enough MakeMaker require ExtUtils::MakeMaker; if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) { # This previous attempted to inherit the version of # ExtUtils::MakeMaker in use by the module author, but this # was found to be untenable as some authors build releases # using future dev versions of EU:MM that nobody else has. # Instead, #toolchain suggests we use 6.59 which is the most # stable version on CPAN at time of writing and is, to quote # ribasushi, "not terminally fucked, > and tested enough". # TODO: We will now need to maintain this over time to push # the version up as new versions are released. $self->build_requires( 'ExtUtils::MakeMaker' => 6.59 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 ); } else { # Allow legacy-compatibility with 5.005 by depending on the # most recent EU:MM that supported 5.005. $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 ); } # Generate the MakeMaker params my $args = $self->makemaker_args; $args->{DISTNAME} = $self->name; $args->{NAME} = $self->module_name || $self->name; $args->{NAME} =~ s/-/::/g; $args->{VERSION} = $self->version or die <<'EOT'; ERROR: Can't determine distribution version. Please specify it explicitly via 'version' in Makefile.PL, or set a valid $VERSION in a module, and provide its file path via 'version_from' (or 'all_from' if you prefer) in Makefile.PL. EOT if ( $self->tests ) { my @tests = split ' ', $self->tests; my %seen; $args->{test} = { TESTS => (join ' ', grep {!$seen{$_}++} @tests), }; } elsif ( $Module::Install::ExtraTests::use_extratests ) { # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness. # So, just ignore our xt tests here. } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { $args->{test} = { TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ), }; } if ( $] >= 5.005 ) { $args->{ABSTRACT} = $self->abstract; $args->{AUTHOR} = join ', ', @{$self->author || []}; } if ( $self->makemaker(6.10) ) { $args->{NO_META} = 1; #$args->{NO_MYMETA} = 1; } if ( $self->makemaker(6.17) and $self->sign ) { $args->{SIGN} = 1; } unless ( $self->is_admin ) { delete $args->{SIGN}; } if ( $self->makemaker(6.31) and $self->license ) { $args->{LICENSE} = $self->license; } my $prereq = ($args->{PREREQ_PM} ||= {}); %$prereq = ( %$prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->requires) ); # Remove any reference to perl, PREREQ_PM doesn't support it delete $args->{PREREQ_PM}->{perl}; # Merge both kinds of requires into BUILD_REQUIRES my $build_prereq = ($args->{BUILD_REQUIRES} ||= {}); %$build_prereq = ( %$build_prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->configure_requires, $self->build_requires) ); # Remove any reference to perl, BUILD_REQUIRES doesn't support it delete $args->{BUILD_REQUIRES}->{perl}; # Delete bundled dists from prereq_pm, add it to Makefile DIR my $subdirs = ($args->{DIR} || []); if ($self->bundles) { my %processed; foreach my $bundle (@{ $self->bundles }) { my ($mod_name, $dist_dir) = @$bundle; delete $prereq->{$mod_name}; $dist_dir = File::Basename::basename($dist_dir); # dir for building this module if (not exists $processed{$dist_dir}) { if (-d $dist_dir) { # List as sub-directory to be processed by make push @$subdirs, $dist_dir; } # Else do nothing: the module is already present on the system $processed{$dist_dir} = undef; } } } unless ( $self->makemaker('6.55_03') ) { %$prereq = (%$prereq,%$build_prereq); delete $args->{BUILD_REQUIRES}; } if ( my $perl_version = $self->perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; if ( $self->makemaker(6.48) ) { $args->{MIN_PERL_VERSION} = $perl_version; } } if ($self->installdirs) { warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS}; $args->{INSTALLDIRS} = $self->installdirs; } my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_} ) } keys %$args; my $user_preop = delete $args{dist}->{PREOP}; if ( my $preop = $self->admin->preop($user_preop) ) { foreach my $key ( keys %$preop ) { $args{dist}->{$key} = $preop->{$key}; } } my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); } sub fix_up_makefile { my $self = shift; my $makefile_name = shift; my $top_class = ref($self->_top) || ''; my $top_version = $self->_top->VERSION || ''; my $preamble = $self->preamble ? "# Preamble by $top_class $top_version\n" . $self->preamble : ''; my $postamble = "# Postamble by $top_class $top_version\n" . ($self->postamble || ''); local *MAKEFILE; open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; eval { flock MAKEFILE, LOCK_EX }; my $makefile = do { local $/; }; $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; # Module::Install will never be used to build the Core Perl # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g; # XXX - This is currently unused; not sure if it breaks other MM-users # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; seek MAKEFILE, 0, SEEK_SET; truncate MAKEFILE, 0; print MAKEFILE "$preamble$makefile$postamble" or die $!; close MAKEFILE or die $!; 1; } sub preamble { my ($self, $text) = @_; $self->{preamble} = $text . $self->{preamble} if defined $text; $self->{preamble}; } sub postamble { my ($self, $text) = @_; $self->{postamble} ||= $self->admin->postamble; $self->{postamble} .= $text if defined $text; $self->{postamble} } 1; __END__ #line 544 MIME-tools-5.515/inc/Module/Install/Base.pm0000644000175000017500000000214712707736012016355 0ustar dfsdfs#line 1 package Module::Install::Base; use strict 'vars'; use vars qw{$VERSION}; BEGIN { $VERSION = '1.14'; } # Suspend handler for "redefined" warnings BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w }; } #line 42 sub new { my $class = shift; unless ( defined &{"${class}::call"} ) { *{"${class}::call"} = sub { shift->_top->call(@_) }; } unless ( defined &{"${class}::load"} ) { *{"${class}::load"} = sub { shift->_top->load(@_) }; } bless { @_ }, $class; } #line 61 sub AUTOLOAD { local $@; my $func = eval { shift->_top->autoload } or return; goto &$func; } #line 75 sub _top { $_[0]->{_top}; } #line 90 sub admin { $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new; } #line 106 sub is_admin { ! $_[0]->admin->isa('Module::Install::Base::FakeAdmin'); } sub DESTROY {} package Module::Install::Base::FakeAdmin; use vars qw{$VERSION}; BEGIN { $VERSION = $Module::Install::Base::VERSION; } my $fake; sub new { $fake ||= bless(\@_, $_[0]); } sub AUTOLOAD {} sub DESTROY {} # Restore warning handler BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->(); } 1; #line 159 MIME-tools-5.515/lib/0000755000175000017500000000000014612223175012301 5ustar dfsdfsMIME-tools-5.515/lib/MIME/0000755000175000017500000000000014612223175013030 5ustar dfsdfsMIME-tools-5.515/lib/MIME/Decoder.pm0000644000175000017500000003766714612222720014751 0ustar dfsdfspackage MIME::Decoder; =head1 NAME MIME::Decoder - an object for decoding the body part of a MIME stream =head1 SYNOPSIS Before reading further, you should see L to make sure that you understand where this module fits into the grand scheme of things. Go on, do it now. I'll wait. Ready? Ok... =head2 Decoding a data stream Here's a simple filter program to read quoted-printable data from STDIN (until EOF) and write the decoded data to STDOUT: use MIME::Decoder; $decoder = new MIME::Decoder 'quoted-printable' or die "unsupported"; $decoder->decode(\*STDIN, \*STDOUT); =head2 Encoding a data stream Here's a simple filter program to read binary data from STDIN (until EOF) and write base64-encoded data to STDOUT: use MIME::Decoder; $decoder = new MIME::Decoder 'base64' or die "unsupported"; $decoder->encode(\*STDIN, \*STDOUT); =head2 Non-standard encodings You can B your own decoders so that MIME::Decoder will know about them: use MyBase64Decoder; install MyBase64Decoder 'base64'; You can also B if a given encoding is supported: if (supported MIME::Decoder 'x-uuencode') { ### we can uuencode! } =head1 DESCRIPTION This abstract class, and its private concrete subclasses (see below) provide an OO front end to the actions of... =over 4 =item * Decoding a MIME-encoded stream =item * Encoding a raw data stream into a MIME-encoded stream. =back The constructor for MIME::Decoder takes the name of an encoding (C, C<7bit>, etc.), and returns an instance of a I of MIME::Decoder whose C method will perform the appropriate decoding action, and whose C method will perform the appropriate encoding action. =cut ### Pragmas: use strict; use vars qw($VERSION %DecoderFor); ### System modules: use IPC::Open2; use IO::Select; use FileHandle; ### Kit modules: use MIME::Tools qw(:config :msgs); use Carp; #------------------------------ # # Globals # #------------------------------ ### The stream decoders: %DecoderFor = ( ### Standard... '7bit' => 'MIME::Decoder::NBit', '8bit' => 'MIME::Decoder::NBit', 'base64' => 'MIME::Decoder::Base64', 'binary' => 'MIME::Decoder::Binary', 'none' => 'MIME::Decoder::Binary', 'quoted-printable' => 'MIME::Decoder::QuotedPrint', ### Non-standard... 'binhex' => 'MIME::Decoder::BinHex', 'binhex40' => 'MIME::Decoder::BinHex', 'mac-binhex40' => 'MIME::Decoder::BinHex', 'mac-binhex' => 'MIME::Decoder::BinHex', 'x-uu' => 'MIME::Decoder::UU', 'x-uuencode' => 'MIME::Decoder::UU', ### This was removed, since I fear that x-gzip != x-gzip64... ### 'x-gzip' => 'MIME::Decoder::Gzip64', ### This is no longer installed by default, since not all folks have gzip: ### 'x-gzip64' => 'MIME::Decoder::Gzip64', ); ### The package version, both in 1.23 style *and* usable by MakeMaker: $VERSION = "5.515"; ### Me: my $ME = 'MIME::Decoder'; #------------------------------ =head1 PUBLIC INTERFACE =head2 Standard interface If all you are doing is I this class, here's all you'll need... =over 4 =cut #------------------------------ =item new ENCODING I Create and return a new decoder object which can handle the given ENCODING. my $decoder = new MIME::Decoder "7bit"; Returns the undefined value if no known decoders are appropriate. =cut sub new { my ($class, @args) = @_; my ($encoding) = @args; ### Coerce the type to be legit: $encoding = lc($encoding || ''); ### Get the class: my $concrete_name = $DecoderFor{$encoding}; if( ! $concrete_name ) { carp "no decoder for $encoding"; return undef; } ### Create the new object (if we can): my $self = { MD_Encoding => lc($encoding) }; unless (eval "require $concrete_name;") { carp $@; return undef; } bless $self, $concrete_name; $self->init(@args); } #------------------------------ =item best ENCODING I Exactly like new(), except that this defaults any unsupported encoding to "binary", after raising a suitable warning (it's a fatal error if there's no binary decoder). my $decoder = best MIME::Decoder "x-gzip64"; Will either return a decoder, or a raise a fatal exception. =cut sub best { my ($class, $enc, @args) = @_; my $self = $class->new($enc, @args); if (!$self) { usage "unsupported encoding '$enc': using 'binary'"; $self = $class->new('binary') || croak "ack! no binary decoder!"; } $self; } #------------------------------ =item decode INSTREAM,OUTSTREAM I Decode the document waiting in the input handle INSTREAM, writing the decoded information to the output handle OUTSTREAM. Read the section in this document on I/O handles for more information about the arguments. Note that you can still supply old-style unblessed filehandles for INSTREAM and OUTSTREAM. Returns true on success, throws exception on failure. =cut sub decode { my ($self, $in, $out) = @_; ### Set up the default input record separator to be CRLF: ### $in->input_record_separator("\012\015"); ### Invoke back-end method to do the work: $self->decode_it($in, $out) || die "$ME: ".$self->encoding." decoding failed\n"; 1; } #------------------------------ =item encode INSTREAM,OUTSTREAM I Encode the document waiting in the input filehandle INSTREAM, writing the encoded information to the output stream OUTSTREAM. Read the section in this document on I/O handles for more information about the arguments. Note that you can still supply old-style unblessed filehandles for INSTREAM and OUTSTREAM. Returns true on success, throws exception on failure. =cut sub encode { my ($self, $in, $out, $textual_type) = @_; ### Invoke back-end method to do the work: $self->encode_it($in, $out, $self->encoding eq 'quoted-printable' ? ($textual_type) : ()) || die "$ME: ".$self->encoding." encoding failed\n"; } #------------------------------ =item encoding I Return the encoding that this object was created to handle, coerced to all lowercase (e.g., C<"base64">). =cut sub encoding { shift->{MD_Encoding}; } #------------------------------ =item head [HEAD] I Completely optional: some decoders need to know a little about the file they are encoding/decoding; e.g., x-uu likes to have the filename. The HEAD is any object which responds to messages like: $head->mime_attr('content-disposition.filename'); =cut sub head { my ($self, $head) = @_; $self->{MD_Head} = $head if @_ > 1; $self->{MD_Head}; } #------------------------------ =item supported [ENCODING] I With one arg (an ENCODING name), returns truth if that encoding is currently handled, and falsity otherwise. The ENCODING will be automatically coerced to lowercase: if (supported MIME::Decoder '7BIT') { ### yes, we can handle it... } else { ### drop back six and punt... } With no args, returns a reference to a hash of all available decoders, where the key is the encoding name (all lowercase, like '7bit'), and the value is true (it happens to be the name of the class that handles the decoding, but you probably shouldn't rely on that). You may safely modify this hash; it will I change the way the module performs its lookups. Only C can do that. I =cut sub supported { my ($class, $decoder) = @_; defined($decoder) ? $DecoderFor{lc($decoder)}: { %DecoderFor }; } #------------------------------ =back =head2 Subclass interface If you are writing (or installing) a new decoder subclass, there are some other methods you'll need to know about: =over 4 =item decode_it INSTREAM,OUTSTREAM I The back-end of the B method. It takes an input handle opened for reading (INSTREAM), and an output handle opened for writing (OUTSTREAM). If you are writing your own decoder subclass, you must override this method in your class. Your method should read from the input handle via C or C, decode this input, and print the decoded data to the output handle via C. You may do this however you see fit, so long as the end result is the same. Note that unblessed references and globrefs are automatically turned into I/O handles for you by C, so you don't need to worry about it. Your method must return either C (to indicate failure), or C<1> (to indicate success). It may also throw an exception to indicate failure. =cut sub decode_it { die "attempted to use abstract 'decode_it' method!"; } =item encode_it INSTREAM,OUTSTREAM I The back-end of the B method. It takes an input handle opened for reading (INSTREAM), and an output handle opened for writing (OUTSTREAM). If you are writing your own decoder subclass, you must override this method in your class. Your method should read from the input handle via C or C, encode this input, and print the encoded data to the output handle via C. You may do this however you see fit, so long as the end result is the same. Note that unblessed references and globrefs are automatically turned into I/O handles for you by C, so you don't need to worry about it. Your method must return either C (to indicate failure), or C<1> (to indicate success). It may also throw an exception to indicate failure. =cut sub encode_it { die "attempted to use abstract 'encode_it' method!"; } =item filter IN, OUT, COMMAND... I If your decoder involves an external program, you can invoke them easily through this method. The command must be a "filter": a command that reads input from its STDIN (which will come from the IN argument) and writes output to its STDOUT (which will go to the OUT argument). For example, here's a decoder that un-gzips its data: sub decode_it { my ($self, $in, $out) = @_; $self->filter($in, $out, "gzip -d -"); } The usage is similar to IPC::Open2::open2 (which it uses internally), so you can specify COMMAND as a single argument or as an array. =cut sub filter { my ($self, $in, $out, @cmd) = @_; my $buf = ''; ### Open pipe: STDOUT->flush; ### very important, or else we get duplicate output! my $kidpid = open2(my $child_out, my $child_in, @cmd) || die "@cmd: open2 failed: $!"; ### We have to use select() for doing both reading and writing. my $rsel = IO::Select->new( $child_out ); my $wsel = IO::Select->new( $child_in ); while (1) { ### Wait for one hour; if that fails, it's too bad. my ($read, $write) = IO::Select->select( $rsel, $wsel, undef, 3600); if( !defined $read && !defined $write ) { kill 1, $kidpid; waitpid $kidpid, 0; die "@cmd: select failed: $!"; } ### If can read from child: if( my $fh = shift @$read ) { if( $fh->sysread(my $buf, 1024) ) { $out->print($buf); } else { $rsel->remove($fh); $fh->close(); } } ### If can write to child: if( my $fh = shift @$write ) { if($in->read(my $buf, 1024)) { local $SIG{PIPE} = sub { warn "got SIGPIPE from @cmd"; $wsel->remove($fh); $fh->close(); }; $fh->syswrite( $buf ); } else { $wsel->remove($fh); $fh->close(); } } ### If both $child_out and $child_in are done: last unless ($rsel->count() || $wsel->count()); } ### Wait for it: waitpid($kidpid, 0) == $kidpid or die "@cmd: couldn't reap child $kidpid"; ### Check if it failed: $? == 0 or die "@cmd: bad exit status: \$? = $?"; 1; } #------------------------------ =item init ARGS... I Do any necessary initialization of the new instance, taking whatever arguments were given to C. Should return the self object on success, undef on failure. =cut sub init { $_[0]; } #------------------------------ =item install ENCODINGS... I. Install this class so that each encoding in ENCODINGS is handled by it: install MyBase64Decoder 'base64', 'x-base64super'; You should not override this method. =cut sub install { my $class = shift; $DecoderFor{lc(shift @_)} = $class while (@_); } #------------------------------ =item uninstall ENCODINGS... I. Uninstall support for encodings. This is a way to turn off the decoding of "experimental" encodings. For safety, always use MIME::Decoder directly: uninstall MIME::Decoder 'x-uu', 'x-uuencode'; You should not override this method. =cut sub uninstall { shift; $DecoderFor{lc(shift @_)} = undef while (@_); } 1; __END__ #------------------------------ =back =head1 DECODER SUBCLASSES You don't need to C<"use"> any other Perl modules; the following "standard" subclasses are included as part of MIME::Decoder: Class: Handles encodings: ------------------------------------------------------------ MIME::Decoder::Binary binary MIME::Decoder::NBit 7bit, 8bit MIME::Decoder::Base64 base64 MIME::Decoder::QuotedPrint quoted-printable The following "non-standard" subclasses are also included: Class: Handles encodings: ------------------------------------------------------------ MIME::Decoder::UU x-uu, x-uuencode MIME::Decoder::Gzip64 x-gzip64 ** requires gzip! =head1 NOTES =head2 Input/Output handles As of MIME-tools 2.0, this class has to play nice with the new MIME::Body class... which means that input and output routines cannot just assume that they are dealing with filehandles. Therefore, all that MIME::Decoder and its subclasses require (and, thus, all that they can assume) is that INSTREAMs and OUTSTREAMs are objects which respond to a subset of the messages defined in the IO::Handle interface; minimally: print getline read(BUF,NBYTES) I =head2 Writing a decoder If you're experimenting with your own encodings, you'll probably want to write a decoder. Here are the basics: =over 4 =item 1. Create a module, like "MyDecoder::", for your decoder. Declare it to be a subclass of MIME::Decoder. =item 2. Create the following instance methods in your class, as described above: decode_it encode_it init =item 3. In your application program, activate your decoder for one or more encodings like this: require MyDecoder; install MyDecoder "7bit"; ### use MyDecoder to decode "7bit" install MyDecoder "x-foo"; ### also use MyDecoder to decode "x-foo" =back To illustrate, here's a custom decoder class for the C encoding: package MyQPDecoder; @ISA = qw(MIME::Decoder); use MIME::Decoder; use MIME::QuotedPrint; ### decode_it - the private decoding method sub decode_it { my ($self, $in, $out) = @_; local $_; while (defined($_ = $in->getline)) { my $decoded = decode_qp($_); $out->print($decoded); } 1; } ### encode_it - the private encoding method sub encode_it { my ($self, $in, $out) = @_; my ($buf, $nread) = ('', 0); while ($in->read($buf, 60)) { my $encoded = encode_qp($buf); $out->print($encoded); } 1; } That's it. The task was pretty simple because the C<"quoted-printable"> encoding can easily be converted line-by-line... as can even C<"7bit"> and C<"8bit"> (since all these encodings guarantee short lines, with a max of 1000 characters). The good news is: it is very likely that it will be similarly-easy to write a MIME::Decoder for any future standard encodings. The C<"binary"> decoder, however, really required block reads and writes: see L<"MIME::Decoder::Binary"> for details. =head1 SEE ALSO L, other MIME::Decoder subclasses. =head1 AUTHOR Eryq (F), ZeeGee Software Inc (F). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. 1; MIME-tools-5.515/lib/MIME/Parser.pm0000644000175000017500000015530214612222720014623 0ustar dfsdfspackage MIME::Parser; =head1 NAME MIME::Parser - experimental class for parsing MIME streams =head1 SYNOPSIS Before reading further, you should see L to make sure that you understand where this module fits into the grand scheme of things. Go on, do it now. I'll wait. Ready? Ok... =head2 Basic usage examples ### Create a new parser object: my $parser = new MIME::Parser; ### Tell it where to put things: $parser->output_under("/tmp"); ### Parse an input filehandle: $entity = $parser->parse(\*STDIN); ### Congratulations: you now have a (possibly multipart) MIME entity! $entity->dump_skeleton; # for debugging =head2 Examples of input ### Parse from filehandles: $entity = $parser->parse(\*STDIN); $entity = $parser->parse(IO::File->new("some command|"); ### Parse from any object that supports getline() and read(): $entity = $parser->parse($myHandle); ### Parse an in-core MIME message: $entity = $parser->parse_data($message); ### Parse an MIME message in a file: $entity = $parser->parse_open("/some/file.msg"); ### Parse an MIME message out of a pipeline: $entity = $parser->parse_open("gunzip - < file.msg.gz |"); ### Parse already-split input (as "deliver" would give it to you): $entity = $parser->parse_two("msg.head", "msg.body"); =head2 Examples of output control ### Keep parsed message bodies in core (default outputs to disk): $parser->output_to_core(1); ### Output each message body to a one-per-message directory: $parser->output_under("/tmp"); ### Output each message body to the same directory: $parser->output_dir("/tmp"); ### Change how nameless message-component files are named: $parser->output_prefix("msg"); ### Put temporary files somewhere else $parser->tmp_dir("/var/tmp/mytmpdir"); =head2 Examples of error recovery ### Normal mechanism: eval { $entity = $parser->parse(\*STDIN) }; if ($@) { $results = $parser->results; $decapitated = $parser->last_head; ### get last top-level head } ### Ultra-tolerant mechanism: $parser->ignore_errors(1); $entity = eval { $parser->parse(\*STDIN) }; $error = ($@ || $parser->last_error); ### Cleanup all files created by the parse: eval { $entity = $parser->parse(\*STDIN) }; ... $parser->filer->purge; =head2 Examples of parser options ### Automatically attempt to RFC 2047-decode the MIME headers? $parser->decode_headers(1); ### default is false ### Parse contained "message/rfc822" objects as nested MIME streams? $parser->extract_nested_messages(0); ### default is true ### Look for uuencode in "text" messages, and extract it? $parser->extract_uuencode(1); ### default is false ### Should we forgive normally-fatal errors? $parser->ignore_errors(0); ### default is true =head2 Miscellaneous examples ### Convert a Mail::Internet object to a MIME::Entity: my $data = join('', (@{$mail->header}, "\n", @{$mail->body})); $entity = $parser->parse_data(\$data); =head1 DESCRIPTION You can inherit from this class to create your own subclasses that parse MIME streams into MIME::Entity objects. =head1 PUBLIC INTERFACE =cut #------------------------------ require 5.004; ### Pragmas: use strict; use vars (qw($VERSION $CAT $CRLF)); ### core Perl modules use IO::File; use File::Spec; use File::Path; use Config qw(%Config); use Carp; ### Kit modules: use MIME::Tools qw(:config :utils :msgtypes usage tmpopen ); use MIME::Head; use MIME::Body; use MIME::Entity; use MIME::Decoder; use MIME::Parser::Reader; use MIME::Parser::Filer; use MIME::Parser::Results; #------------------------------ # # Globals # #------------------------------ ### The package version, both in 1.23 style *and* usable by MakeMaker: $VERSION = "5.515"; ### How to catenate: $CAT = '/bin/cat'; ### The CRLF sequence: $CRLF = "\015\012"; ### Who am I? my $ME = 'MIME::Parser'; #------------------------------------------------------------ =head2 Construction =over 4 =cut #------------------------------ =item new ARGS... I Create a new parser object. Once you do this, you can then set up various parameters before doing the actual parsing. For example: my $parser = new MIME::Parser; $parser->output_dir("/tmp"); $parser->output_prefix("msg1"); my $entity = $parser->parse(\*STDIN); Any arguments are passed into C. Don't override this in your subclasses; override init() instead. =cut sub new { my $self = bless {}, shift; $self->init(@_); } #------------------------------ =item init ARGS... I Initiallize a new MIME::Parser object. This is automatically sent to a new object; you may want to override it. If you override this, be sure to invoke the inherited method. =cut sub init { my $self = shift; $self->{MP5_DecodeHeaders} = 0; $self->{MP5_DecodeBodies} = 1; $self->{MP5_Interface} = {}; $self->{MP5_ParseNested} = 'NEST'; $self->{MP5_TmpToCore} = 0; $self->{MP5_IgnoreErrors} = 1; $self->{MP5_UUDecode} = 0; $self->{MP5_MaxParts} = -1; $self->{MP5_TmpDir} = undef; $self->{MP5_AmbiguousContent} = 0; $self->interface(ENTITY_CLASS => 'MIME::Entity'); $self->interface(HEAD_CLASS => 'MIME::Head'); $self->output_dir("."); $self; } #------------------------------ =item init_parse I Invoked automatically whenever one of the top-level parse() methods is called, to reset the parser to a "ready" state. =cut sub init_parse { my $self = shift; $self->{MP5_Results} = new MIME::Parser::Results; $self->{MP5_Filer}->results($self->{MP5_Results}); $self->{MP5_Filer}->purgeable([]); $self->{MP5_Filer}->init_parse(); $self->{MP5_NumParts} = 0; $self->{MP5_AmbiguousContent} = 0; 1; } =back =cut #------------------------------------------------------------ =head2 Altering how messages are parsed =over 4 =cut #------------------------------ =item decode_headers [YESNO] I Controls whether the parser will attempt to decode all the MIME headers (as per RFC 2047) the moment it sees them. B =over =item * B If you fully decode the headers into bytes, you can inadvertently transform a parseable MIME header like this: Content-type: text/plain; filename="=?ISO-8859-1?Q?Hi=22Ho?=" into unparseable gobbledygook; in this case: Content-type: text/plain; filename="Hi"Ho" =item * B An encoded string which contains both Latin-1 and Cyrillic characters will be turned into a binary mishmosh which simply can't be rendered. =back B This method was once the only out-of-the-box way to deal with attachments whose filenames had non-ASCII characters. However, since MIME-tools 5.4xx this is no longer necessary. B If YESNO is true, decoding is done. However, you will get a warning unless you use one of the special "true" values: "I_NEED_TO_FIX_THIS" Just shut up and do it. Not recommended. Provided only for those who need to keep old scripts functioning. "I_KNOW_WHAT_I_AM_DOING" Just shut up and do it. Not recommended. Provided for those who REALLY know what they are doing. If YESNO is false (the default), no attempt at decoding will be done. With no argument, just returns the current setting. B you can always decode the headers I the parsing has completed (see L), or decode the words on demand (see L). =cut sub decode_headers { my ($self, $yesno) = @_; if (@_ > 1) { $self->{MP5_DecodeHeaders} = $yesno; if ($yesno) { if (($yesno eq "I_KNOW_WHAT_I_AM_DOING") || ($yesno eq "I_NEED_TO_FIX_THIS")) { ### ok } else { $self->whine("as of 5.4xx, decode_headers() should NOT be ". "set true... if you are doing this to make sure ". "that non-ASCII filenames are translated, ". "that's now done automatically; for all else, ". "use MIME::Words."); } } } $self->{MP5_DecodeHeaders}; } #------------------------------ =item extract_nested_messages OPTION I Some MIME messages will contain a part of type C ,C or C: literally, the text of an embedded mail/news/whatever message. This option controls whether (and how) we parse that embedded message. If the OPTION is false, we treat such a message just as if it were a C document, without attempting to decode its contents. If the OPTION is true (the default), the body of the C or C part is parsed by this parser, creating an entity object. What happens then is determined by the actual OPTION: =over 4 =item NEST or 1 The default setting. The contained message becomes the sole "part" of the C entity (as if the containing message were a special kind of "multipart" message). You can recover the sub-entity by invoking the L method on the C entity. =item REPLACE The contained message replaces the C entity, as though the C "container" never existed. B notice that, with this option, all the header information in the C header is lost. This might seriously bother you if you're dealing with a top-level message, and you've just lost the sender's address and the subject line. C<:-/>. =back I =cut sub extract_nested_messages { my ($self, $option) = @_; $self->{MP5_ParseNested} = $option if (@_ > 1); $self->{MP5_ParseNested}; } sub parse_nested_messages { usage "parse_nested_messages() is now extract_nested_messages()"; shift->extract_nested_messages(@_); } #------------------------------ =item extract_uuencode [YESNO] I If set true, then whenever we are confronted with a message whose effective content-type is "text/plain" and whose encoding is 7bit/8bit/binary, we scan the encoded body to see if it contains uuencoded data (generally given away by a "begin XXX" line). If it does, we explode the uuencoded message into a multipart, where the text before the first "begin XXX" becomes the first part, and all "begin...end" sections following become the subsequent parts. The filename (if given) is accessible through the normal means. =cut sub extract_uuencode { my ($self, $yesno) = @_; $self->{MP5_UUDecode} = $yesno if @_ > 1; $self->{MP5_UUDecode}; } #------------------------------ =item ignore_errors [YESNO] I Controls whether the parser will attempt to ignore normally-fatal errors, treating them as warnings and continuing with the parse. If YESNO is true (the default), many syntax errors are tolerated. If YESNO is false, fatal errors throw exceptions. With no argument, just returns the current setting. =cut sub ignore_errors { my ($self, $yesno) = @_; $self->{MP5_IgnoreErrors} = $yesno if (@_ > 1); $self->{MP5_IgnoreErrors}; } #------------------------------ =item decode_bodies [YESNO] I Controls whether the parser should decode entity bodies or not. If this is set to a false value (default is true), all entity bodies will be kept as-is in the original content-transfer encoding. To prevent double encoding on the output side MIME::Body->is_encoded is set, which tells MIME::Body not to encode the data again, if encoded data was requested. This is in particular useful, when it's important that the content B be modified, e.g. if you want to calculate OpenPGP signatures from it. B: the semantics change significantly if you parse MIME messages with this option set, because MIME::Entity resp. MIME::Body *always* see encoded data now, while the default behaviour is working with *decoded* data (and encoding it only if you request it). You need to decode the data yourself, if you want to have it decoded. So use this option only if you exactly know, what you're doing, and that you're sure, that you really need it. =cut sub decode_bodies { my ($self, $yesno) = @_; $self->{MP5_DecodeBodies} = $yesno if (@_ > 1); $self->{MP5_DecodeBodies}; } #------------------------------ # # MESSAGES... # #------------------------------ # # debug MESSAGE... # sub debug { my $self = shift; if (MIME::Tools->debugging()) { if (my $r = $self->{MP5_Results}) { unshift @_, $r->indent; $r->msg($M_DEBUG, @_); } MIME::Tools::debug(@_); } } #------------------------------ # # whine PROBLEM... # sub whine { my $self = shift; if (my $r = $self->{MP5_Results}) { unshift @_, $r->indent; $r->msg($M_WARNING, @_); } &MIME::Tools::whine(@_); } #------------------------------ # # error PROBLEM... # # Possibly-forgivable parse error occurred. # Raises a fatal exception unless we are ignoring errors. # sub error { my $self = shift; if (my $r = $self->{MP5_Results}) { unshift @_, $r->indent; $r->msg($M_ERROR, @_); } &MIME::Tools::error(@_); $self->{MP5_IgnoreErrors} ? return undef : die @_; } #------------------------------ # # PARSING... # #------------------------------ # # process_preamble IN, READER, ENTITY # # I # Dispose of a multipart message's preamble. # sub process_preamble { my ($self, $in, $rdr, $ent) = @_; ### Sanity: ($rdr->depth > 0) or die "$ME: internal logic error"; ### Parse preamble: my @saved; my $data = ''; open(my $fh, '>', \$data) or die $!; $rdr->read_chunk($in, $fh, 1); close $fh; # Ugh. Horrible. If the preamble consists only of CRLF, squash it down # to the empty string. Else, remove the trailing CRLF. if( $data =~ m/^[\r\n]\z/ ) { @saved = (''); } else { $data =~ s/[\r\n]\z//; @saved = split(/^/, $data); } $ent->preamble(\@saved); 1; } #------------------------------ # # process_epilogue IN, READER, ENTITY # # I # Dispose of a multipart message's epilogue. # sub process_epilogue { my ($self, $in, $rdr, $ent) = @_; $self->debug("process_epilogue"); ### Parse epilogue: my @saved; $rdr->read_lines($in, \@saved); $ent->epilogue(\@saved); 1; } #------------------------------ # # process_to_bound IN, READER, OUT # # I # Dispose of the next chunk into the given output stream OUT. # sub process_to_bound { my ($self, $in, $rdr, $out) = @_; ### Parse: $rdr->read_chunk($in, $out); 1; } #------------------------------ # # process_header IN, READER # # I # Process and return the next header. # Return undef if, instead of a header, the encapsulation boundary is found. # Fatal exception on failure. # sub process_header { my ($self, $in, $rdr) = @_; $self->debug("process_header"); ### Parse and save the (possibly empty) header, up to and including the ### blank line that terminates it: my $head = $self->interface('HEAD_CLASS')->new; ### Read the lines of the header. ### We localize IO inside here, so that we can support the IO:: interface my @headlines; my $hdr_rdr = $rdr->spawn; $hdr_rdr->add_terminator(""); $hdr_rdr->add_terminator("\r"); ### sigh my $headstr = ''; open(my $outfh, '>:scalar', \$headstr) or die $!; $hdr_rdr->read_chunk($in, $outfh, 0, 1); close $outfh; ### How did we do? if ($hdr_rdr->eos_type eq 'DELIM') { $self->whine("bogus part, without CRLF before body"); return undef; } ($hdr_rdr->eos_type eq 'DONE') or $self->error("unexpected end of header\n"); ### If header line begins with a UTF-8 Byte-Order mark, remove it. $headstr =~ s/^\x{EF}\x{BB}\x{BF}//; ### Extract the header (note that zero-size headers are admissible!): open(my $readfh, '<:scalar', \$headstr) or die $!; $head->read( $readfh ); unless( $readfh->eof() ) { # Not entirely correct, since ->read consumes the line it gives up on. # it's actually the line /before/ the one we get with ->getline $self->error("couldn't parse head; error near:\n", $readfh->getline()); } ### If desired, auto-decode the header as per RFC 2047 ### This shouldn't affect non-encoded headers; however, it will decode ### headers with international characters. WARNING: currently, the ### character-set information is LOST after decoding. $head->decode($self->{MP5_DecodeHeaders}) if $self->{MP5_DecodeHeaders}; ### If this is the top-level head, save it: $self->results->top_head($head) if !$self->results->top_head; return $head; } #------------------------------ # # process_multipart IN, READER, ENTITY # # I # Process the multipart body, and return the state. # Fatal exception on failure. # Invoked by process_part(). # sub process_multipart { my ($self, $in, $rdr, $ent) = @_; my $head = $ent->head; $self->debug("process_multipart..."); ### Get actual type and subtype from the header: my ($type, $subtype) = (split('/', $head->mime_type, -1), ''); ### If this was a type "multipart/digest", then the RFCs say we ### should default the parts to have type "message/rfc822". ### Thanks to Carsten Heyl for suggesting this... my $retype = (($subtype eq 'digest') ? 'message/rfc822' : ''); ### Get the boundaries for the parts: my $bound = $head->multipart_boundary; if (!defined($bound) || ($bound =~ /[\r\n]/)) { $self->error("multipart boundary is missing, or contains CR or LF\n"); $ent->effective_type("application/x-unparseable-multipart"); return $self->process_singlepart($in, $rdr, $ent); } my $part_rdr = $rdr->spawn->add_boundary($bound); ### Prepare to parse: my $eos_type; my $more_parts; ### Parse preamble... $self->process_preamble($in, $part_rdr, $ent); ### ...and look at how we finished up: $eos_type = $part_rdr->eos_type; if ($eos_type eq 'DELIM'){ $more_parts = 1 } elsif ($eos_type eq 'CLOSE'){ $self->whine("empty multipart message\n"); $more_parts = 0; } else { $self->error("unexpected end of preamble\n"); return 1; } ### Parse parts: my $partno = 0; my $part; while ($more_parts) { ++$partno; $self->debug("parsing part $partno..."); ### Parse the next part, and add it to the entity... my $part = $self->process_part($in, $part_rdr, Retype=>$retype); return undef unless defined($part); $ent->add_part($part); ### ...and look at how we finished up: $eos_type = $part_rdr->eos_type; if ($eos_type eq 'DELIM') { $more_parts = 1 } elsif ($eos_type eq 'CLOSE') { $more_parts = 0; } else { $self->error("unexpected end of parts ". "before epilogue\n"); return 1; } } ### Parse epilogue... ### (note that we use the *parent's* reader here, which does not ### know about the boundaries in this multipart!) $self->process_epilogue($in, $rdr, $ent); ### ...and there's no need to look at how we finished up! 1; } #------------------------------ # # process_singlepart IN, READER, ENTITY # # I # Process the singlepart body. Returns true. # Fatal exception on failure. # Invoked by process_part(). # sub process_singlepart { my ($self, $in, $rdr, $ent) = @_; my $head = $ent->head; $self->debug("process_singlepart..."); ### Obtain a filehandle for reading the encoded information: ### We have two different approaches, based on whether or not we ### have to contend with boundaries. my $ENCODED; ### handle my $can_shortcut = (!$rdr->has_bounds and !$self->{MP5_UUDecode}); if ($can_shortcut) { $self->debug("taking shortcut"); $ENCODED = $in; $rdr->eos('EOF'); ### be sure to bogus-up the reader state to EOF: } else { $self->debug("using temp file"); $ENCODED = $self->new_tmpfile(); ### Read encoded body until boundary (or EOF)... $self->process_to_bound($in, $rdr, $ENCODED); ### ...and look at how we finished up. ### If we have bounds, we want DELIM or CLOSE. ### Otherwise, we want EOF (and that's all we'd get, anyway!). if ($rdr->has_bounds) { ($rdr->eos_type =~ /^(DELIM|CLOSE)$/) or $self->error("part did not end with expected boundary\n"); } ### Flush and rewind encoded buffer, so we can read it: $ENCODED->flush or die "$ME: can't flush: $!"; $ENCODED->seek(0, 0) or die "$ME: can't seek: $!"; } ### Get a content-decoder to decode this part's encoding: my $encoding = $head->mime_encoding; my $decoder = new MIME::Decoder $encoding; if (!$decoder) { $self->whine("Unsupported encoding '$encoding': using 'binary'... \n". "The entity will have an effective MIME type of \n". "application/octet-stream."); ### as per RFC-2045 $ent->effective_type('application/octet-stream'); $decoder = new MIME::Decoder 'binary'; $encoding = 'binary'; } ### Data should be stored encoded / as-is? if ( !$self->decode_bodies ) { $decoder = new MIME::Decoder 'binary'; $encoding = 'binary'; } ### If desired, sidetrack to troll for UUENCODE: $self->debug("extract uuencode? ", $self->extract_uuencode); $self->debug("encoding? ", $encoding); $self->debug("effective type? ", $ent->effective_type); if ($self->extract_uuencode and ($encoding =~ /^(7bit|8bit|binary)\Z/) and ($ent->effective_type =~ m{^(?:text/plain|application/mac-binhex40|application/mac-binhex)\Z})) { ### Hunt for it: my $uu_ent = eval { $self->hunt_for_uuencode($ENCODED, $ent) }; if ($uu_ent) { ### snark %$ent = %$uu_ent; return 1; } else { ### boojum $self->whine("while hunting for uuencode: $@"); $ENCODED->seek(0,0) or die "$ME: can't seek: $!"; } } ### Open a new bodyhandle for outputting the data: my $body = $self->new_body_for($head) or die "$ME: no body"; # gotta die $body->binmode(1) or die "$ME: can't set to binmode: $!" unless textual_type($ent->effective_type) or !$self->decode_bodies; $body->is_encoded(1) if !$self->decode_bodies; ### Decode and save the body (using the decoder): my $DECODED = $body->open("w") or die "$ME: body not opened: $!"; eval { $decoder->decode($ENCODED, $DECODED); }; $@ and $self->error($@); $DECODED->close or die "$ME: can't close: $!"; ### Success! Remember where we put stuff: $ent->bodyhandle($body); ### Done! 1; } #------------------------------ # # hunt_for_uuencode ENCODED, ENTITY # # I # Try to detect and dispatch embedded uuencode as a fake multipart message. # Returns new entity or undef. # sub hunt_for_uuencode { my ($self, $ENCODED, $ent) = @_; my ($good, $how_encoded); local $_; $self->debug("sniffing around for UUENCODE"); ### Heuristic: $ENCODED->seek(0,0) or die "$ME: can't seek: $!"; while (defined($_ = $ENCODED->getline)) { if ($good = /^begin [0-7]{3}/) { $how_encoded = 'uu'; last; } if ($good = /^\(This file must be converted with/i) { $how_encoded = 'binhex'; last; } } $good or do { $self->debug("no one made the cut"); return 0 }; # If a decoder doesn't exist for this type, forget it! my $decoder = MIME::Decoder->new(($how_encoded eq 'uu')?'x-uuencode' :'binhex'); unless (defined($decoder)) { $self->debug("No decoder for $how_encoded attachments"); return 0; } ### New entity: my $top_ent = $ent->dup; ### no data yet $top_ent->make_multipart; my @parts; ### Made the first cut; on to the real stuff: $ENCODED->seek(0,0) or die "$ME: can't seek: $!"; $self->whine("Found a $how_encoded attachment"); my $pre; while (1) { my $bin_data = ''; ### Try next part: my $out = IO::File->new(\$bin_data, '>:'); eval { $decoder->decode($ENCODED, $out) }; last if $@; my $preamble = $decoder->last_preamble; my $filename = $decoder->last_filename; my $mode = $decoder->last_mode; ### Get probable type: my $type = 'application/octet-stream'; my ($ext) = $filename =~ /\.(\w+)\Z/; $ext = lc($ext || ''); if ($ext =~ /^(gif|jpe?g|xbm|xpm|png)\Z/) { $type = "image/$1" } ### If we got our first preamble, create the text portion: if (@$preamble and (grep /\S/, @$preamble) and !@parts) { my $txt_ent = $self->interface('ENTITY_CLASS')->new; MIME::Entity->build(Type => "text/plain", Data => ""); $txt_ent->bodyhandle($self->new_body_for($txt_ent->head)); my $io = $txt_ent->bodyhandle->open("w") or die "$ME: can't create: $!"; $io->print(@$preamble) or die "$ME: can't print: $!"; $io->close or die "$ME: can't close: $!"; push @parts, $txt_ent; } ### Create the attachment: ### We use the x-unix-mode convention from "dtmail 1.2.1 SunOS 5.6". if (1) { my $bin_ent = MIME::Entity->build(Type=>$type, Filename=>$filename, Data=>""); $bin_ent->head->mime_attr('Content-type.x-unix-mode' => "0$mode"); $bin_ent->bodyhandle($self->new_body_for($bin_ent->head)); $bin_ent->bodyhandle->binmode(1) or die "$ME: can't set to binmode: $!"; my $io = $bin_ent->bodyhandle->open("w") or die "$ME: can't create: $!"; $io->print($bin_data) or die "$ME: can't print: $!"; $io->close or die "$ME: can't close: $!"; push @parts, $bin_ent; } } ### Did we get anything? @parts or return undef; ### Set the parts and a nice preamble: $top_ent->parts(\@parts); $top_ent->preamble (["The following is a multipart MIME message which was extracted\n", "from a $how_encoded-encoded message.\n"]); $top_ent; } #------------------------------ # # process_message IN, READER, ENTITY # # I # Process the singlepart body, and return true. # Fatal exception on failure. # Invoked by process_part(). # sub process_message { my ($self, $in, $rdr, $ent) = @_; my $head = $ent->head; $self->debug("process_message"); ### Verify the encoding restrictions: my $encoding = $head->mime_encoding; if ($encoding !~ /^(7bit|8bit|binary)$/) { $self->error("illegal encoding [$encoding] for MIME type ". $head->mime_type."\n"); $encoding = 'binary'; } ### Parse the message: my $msg = $self->process_part($in, $rdr); return undef unless defined($msg); ### How to handle nested messages? if ($self->extract_nested_messages eq 'REPLACE') { %$ent = %$msg; ### shallow replace %$msg = (); } else { ### "NEST" or generic 1: $ent->bodyhandle(undef); $ent->add_part($msg); } 1; } #------------------------------ # # process_part IN, READER, [OPTSHASH...] # # I # The real back-end engine. # See the documentation up top for the overview of the algorithm. # The OPTSHASH can contain: # # Retype => retype this part to the given content-type # # Return the entity. # Fatal exception on failure. Returns undef if message to complex # sub process_part { my ($self, $in, $rdr, %p) = @_; if ($self->{MP5_MaxParts} > 0) { $self->{MP5_NumParts}++; if ($self->{MP5_NumParts} > $self->{MP5_MaxParts}) { # Return UNDEF if msg too complex return undef; } } $rdr ||= MIME::Parser::Reader->new; #debug "process_part"; $self->results->level(+1); ### Create a new entity: my $ent = $self->interface('ENTITY_CLASS')->new; ### Parse and add the header: my $head = $self->process_header($in, $rdr); if (not defined $head) { $self->debug("bogus empty part"); $head = $self->interface('HEAD_CLASS')->new; $head->mime_type('text/plain'); $ent->head($head); $ent->bodyhandle($self->new_body_for($head)); $ent->bodyhandle->open("w")->close or die "$ME: can't close: $!"; if (!$self->{MP5_AmbiguousContent}) { if ($ent->head->ambiguous_content) { $self->{MP5_AmbiguousContent} = 1; } } $self->results->level(-1); return $ent; } $ent->head($head); ### Tweak the content-type based on context from our parent... ### For example, multipart/digest messages default to type message/rfc822: $head->mime_type($p{Retype}) if $p{Retype}; # We have the header, so that's enough to check for # ambiguous content... if (!$self->{MP5_AmbiguousContent}) { if ($ent->head->ambiguous_content) { $self->{MP5_AmbiguousContent} = 1; } } ### Get the MIME type and subtype: my ($type, $subtype) = (split('/', $head->mime_type, -1), ''); $self->debug("type = $type, subtype = $subtype"); ### Handle, according to the MIME type: if ($type eq 'multipart') { return undef unless defined($self->process_multipart($in, $rdr, $ent)); } elsif (("$type/$subtype" eq "message/rfc822" || "$type/$subtype" eq "message/external-body" || ("$type/$subtype" eq "message/partial" && defined($head->mime_attr("content-type.number")) && $head->mime_attr("content-type.number") == 1)) && $self->extract_nested_messages) { $self->debug("attempting to process a nested message"); return undef unless defined($self->process_message($in, $rdr, $ent)); } else { $self->process_singlepart($in, $rdr, $ent); } ### Done (we hope!): $self->results->level(-1); return $ent; } =back =head2 Parsing an input source =over 4 =cut #------------------------------ =item parse_data DATA I Parse a MIME message that's already in core. This internally creates an "in memory" filehandle on a Perl scalar value using PerlIO You may supply the DATA in any of a number of ways... =over 4 =item * B which holds the message. A reference to this scalar will be used internally. =item * B which holds the message. This reference will be used internally. =item * B B The array is internally concatenated into a temporary string, and a reference to the new string is used internally. It is much more efficient to pass in a scalar reference, so please consider refactoring your code to use that interface instead. If you absolutely MUST pass an array, you may be better off using IO::ScalarArray in the calling code to generate a filehandle, and passing that filehandle to I =back Returns the parsed MIME::Entity on success. =cut sub parse_data { my ($self, $data) = @_; if (!defined($data)) { croak "parse_data: No data passed"; } ### Get data as a scalar: my $io; if (! ref $data ) { $io = IO::File->new(\$data, '<:'); } elsif( ref $data eq 'SCALAR' ) { $io = IO::File->new($data, '<:'); } elsif( ref $data eq 'ARRAY' ) { # Passing arrays is deprecated now that we've nuked IO::ScalarArray # but for backwards compatibility we still support it by joining the # array lines to a scalar and doing scalar IO on it. my $tmp_data = join('', @$data); $io = IO::File->new(\$tmp_data, '<:'); } else { croak "parse_data: wrong argument ref type: ", ref($data); } if (!$io) { croak "parse_data: unable to open in-memory file handle"; } ### Parse! return $self->parse($io); } #------------------------------ =item parse INSTREAM I Takes a MIME-stream and splits it into its component entities. The INSTREAM can be given as an IO::File, a globref filehandle (like C<\*STDIN>), or as I blessed object conforming to the IO:: interface (which minimally implements getline() and read()). Returns the parsed MIME::Entity on success. Throws exception on failure. If the message contained too many parts (as set by I), returns undef. =cut sub parse { my $self = shift; my $in = shift; my $entity; local $/ = "\n"; ### just to be safe local $\ = undef; # CPAN ticket #71041 $self->init_parse; $entity = $self->process_part($in, undef); ### parse! $entity; } ### Backcompat: sub read { shift->parse(@_); } sub parse_FH { shift->parse(@_); } #------------------------------ =item parse_open EXPR I Convenience front-end onto C. Simply give this method any expression that may be sent as the second argument to open() to open a filehandle for reading. Returns the parsed MIME::Entity on success. Throws exception on failure. =cut sub parse_open { my ($self, $expr) = @_; my $ent; my $io = IO::File->new($expr) or die "$ME: couldn't open $expr: $!"; $ent = $self->parse($io); $io->close or die "$ME: can't close: $!"; $ent; } ### Backcompat: sub parse_in { usage "parse_in() is now parse_open()"; shift->parse_open(@_); } #------------------------------ =item parse_two HEADFILE, BODYFILE I Convenience front-end onto C, intended for programs running under mail-handlers like B, which splits the incoming mail message into a header file and a body file. Simply give this method the paths to the respective files. B it is assumed that, once the files are cat'ed together, there will be a blank line separating the head part and the body part. B new implementation slurps files into line array for portability, instead of using 'cat'. May be an issue if your messages are large. Returns the parsed MIME::Entity on success. Throws exception on failure. =cut sub parse_two { my ($self, $headfile, $bodyfile) = @_; my $data; foreach ($headfile, $bodyfile) { open IN, "<$_" or die "$ME: open $_: $!"; $data .= do { local $/; }; close IN or die "$ME: can't close: $!"; } return $self->parse_data($data); } =back =cut #------------------------------------------------------------ =head2 Specifying output destination B in 5.212 and before, this was done by methods of MIME::Parser. However, since many users have requested fine-tuned control over how this is done, the logic has been split off from the parser into its own class, MIME::Parser::Filer Every MIME::Parser maintains an instance of a MIME::Parser::Filer subclass to manage disk output (see L for details.) The benefit to this is that the MIME::Parser code won't be confounded with a lot of garbage related to disk output. The drawback is that the way you override the default behavior will change. For now, all the normal public-interface methods are still provided, but many are only stubs which create or delegate to the underlying MIME::Parser::Filer object. =over 4 =cut #------------------------------ =item filer [FILER] I Get/set the FILER object used to manage the output of files to disk. This will be some subclass of L. =cut sub filer { my ($self, $filer) = @_; if (@_ > 1) { $self->{MP5_Filer} = $filer; $filer->results($self->results); ### but we still need in init_parse } $self->{MP5_Filer}; } #------------------------------ =item output_dir DIRECTORY I Causes messages to be filed directly into the given DIRECTORY. It does this by setting the underlying L to a new instance of MIME::Parser::FileInto, and passing the arguments into that class' new() method. B Since this method replaces the underlying filer, you must invoke it I doing changing any attributes of the filer, like the output prefix; otherwise those changes will be lost. =cut sub output_dir { my ($self, @init) = @_; if (@_ > 1) { $self->filer(MIME::Parser::FileInto->new(@init)); } else { &MIME::Tools::whine("0-arg form of output_dir is deprecated."); return $self->filer->output_dir; } } #------------------------------ =item output_under BASEDIR, OPTS... I Causes messages to be filed directly into subdirectories of the given BASEDIR, one subdirectory per message. It does this by setting the underlying L to a new instance of MIME::Parser::FileUnder, and passing the arguments into that class' new() method. B Since this method replaces the underlying filer, you must invoke it I doing changing any attributes of the filer, like the output prefix; otherwise those changes will be lost. =cut sub output_under { my ($self, @init) = @_; if (@_ > 1) { $self->filer(MIME::Parser::FileUnder->new(@init)); } else { &MIME::Tools::whine("0-arg form of output_under is deprecated."); return $self->filer->output_dir; } } #------------------------------ =item output_path HEAD I Given a MIME head for a file to be extracted, come up with a good output pathname for the extracted file. Identical to the preferred form: $parser->filer->output_path(...args...); We just delegate this to the underlying L object. =cut sub output_path { my $self = shift; ### We use it, so don't warn! ### &MIME::Tools::whine("output_path deprecated in MIME::Parser"); $self->filer->output_path(@_); } #------------------------------ =item output_prefix [PREFIX] I Get/set the short string that all filenames for extracted body-parts will begin with (assuming that there is no better "recommended filename"). Identical to the preferred form: $parser->filer->output_prefix(...args...); We just delegate this to the underlying L object. =cut sub output_prefix { my $self = shift; &MIME::Tools::whine("output_prefix deprecated in MIME::Parser"); $self->filer->output_prefix(@_); } #------------------------------ =item evil_filename NAME I Identical to the preferred form: $parser->filer->evil_filename(...args...); We just delegate this to the underlying L object. =cut sub evil_filename { my $self = shift; &MIME::Tools::whine("evil_filename deprecated in MIME::Parser"); $self->filer->evil_filename(@_); } #------------------------------ =item max_parts NUM I Limits the number of MIME parts we will parse. Normally, instances of this class parse a message to the bitter end. Messages with many MIME parts can cause excessive memory consumption. If you invoke this method, parsing will abort with a die() if a message contains more than NUM parts. If NUM is set to -1 (the default), then no maximum limit is enforced. With no argument, returns the current setting as an integer =cut sub max_parts { my($self, $num) = @_; if (@_ > 1) { $self->{MP5_MaxParts} = $num; } return $self->{MP5_MaxParts}; } #------------------------------ =item output_to_core YESNO I Normally, instances of this class output all their decoded body data to disk files (via MIME::Body::File). However, you can change this behaviour by invoking this method before parsing: If YESNO is false (the default), then all body data goes to disk files. If YESNO is true, then all body data goes to in-core data structures This is a little risky (what if someone emails you an MPEG or a tar file, hmmm?) but people seem to want this bit of noose-shaped rope, so I'm providing it. Note that setting this attribute true I mean that parser-internal temporary files are avoided! Use L for that. With no argument, returns the current setting as a boolean. =cut sub output_to_core { my ($self, $yesno) = @_; if (@_ > 1) { $yesno = 0 if ($yesno and $yesno eq 'NONE'); $self->{MP5_FilerToCore} = $yesno; } $self->{MP5_FilerToCore}; } =item tmp_recycling I This method is a no-op to preserve the pre-5.421 API. The tmp_recycling() feature was removed in 5.421 because it had never actually worked. Please update your code to stop using it. =cut sub tmp_recycling { return; } #------------------------------ =item tmp_to_core [YESNO] I Should L create real temp files, or use fake in-core ones? Normally we allow the creation of temporary disk files, since this allows us to handle huge attachments even when core is limited. If YESNO is true, we implement new_tmpfile() via in-core handles. If YESNO is false (the default), we use real tmpfiles. With no argument, just returns the current setting. =cut sub tmp_to_core { my ($self, $yesno) = @_; $self->{MP5_TmpToCore} = $yesno if (@_ > 1); $self->{MP5_TmpToCore}; } #------------------------------ =item use_inner_files [YESNO] I. I MIME::Parser no longer supports IO::InnerFile, but this method is retained for backwards compatibility. It does nothing. The original reasoning for IO::InnerFile was that inner files were faster than "in-core" temp files. At the time, the "in-core" tempfile support was implemented with IO::Scalar from the IO-Stringy distribution, which used the tie() interface to wrap a scalar with the appropriate IO::Handle operations. The penalty for this was fairly hefty, and IO::InnerFile actually was faster. Nowadays, MIME::Parser uses Perl's built in ability to open a filehandle on an in-memory scalar variable via PerlIO. Benchmarking shows that IO::InnerFile is slightly slower than using in-memory temporary files, and is slightly faster than on-disk temporary files. Both measurements are within a few percent of each other. Since there's no real benefit, and since the IO::InnerFile abuse was fairly hairy and evil ("writes" to it were faked by extending the size of the inner file with the assumption that the only data you'd ever ->print() to it would be the line from the "outer" file, for example) it's been removed. =cut sub use_inner_files { return 0; } =back =cut #------------------------------------------------------------ =head2 Specifying classes to be instantiated =over 4 =cut #------------------------------ =item interface ROLE,[VALUE] I During parsing, the parser normally creates instances of certain classes, like MIME::Entity. However, you may want to create a parser subclass that uses your own experimental head, entity, etc. classes (for example, your "head" class may provide some additional MIME-field-oriented methods). If so, then this is the method that your subclass should invoke during init. Use it like this: package MyParser; @ISA = qw(MIME::Parser); ... sub init { my $self = shift; $self->SUPER::init(@_); ### do my parent's init $self->interface(ENTITY_CLASS => 'MIME::MyEntity'); $self->interface(HEAD_CLASS => 'MIME::MyHead'); $self; ### return } With no VALUE, returns the VALUE currently associated with that ROLE. =cut sub interface { my ($self, $role, $value) = @_; $self->{MP5_Interface}{$role} = $value if (defined($value)); $self->{MP5_Interface}{$role}; } #------------------------------ =item new_body_for HEAD I Based on the HEAD of a part we are parsing, return a new body object (any desirable subclass of MIME::Body) for receiving that part's data. If you set the C option to false before parsing (the default), then we call C and create a new MIME::Body::File on that filename. If you set the C option to true before parsing, then you get a MIME::Body::InCore instead. If you want the parser to do something else entirely, you can override this method in a subclass. =cut sub new_body_for { my ($self, $head) = @_; if ($self->output_to_core) { $self->debug("outputting body to core"); return (new MIME::Body::InCore); } else { my $outpath = $self->output_path($head); $self->debug("outputting body to disk file: $outpath"); $self->filer->purgeable($outpath); ### we plan to use it return (new MIME::Body::File $outpath); } } #------------------------------ =pod =back =head2 Temporary File Creation =over =item tmp_dir DIRECTORY I Causes any temporary files created by this parser to be created in the given DIRECTORY. If called without arguments, returns current value. The default value is undef, which will cause new_tmpfile() to use the system default temporary directory. =cut sub tmp_dir { my ($self, $dirname) = @_; if ( $dirname ) { $self->{MP5_TmpDir} = $dirname; } return $self->{MP5_TmpDir}; } =item new_tmpfile I Return an IO handle to be used to hold temporary data during a parse. The default uses MIME::Tools::tmpopen() to create a new temporary file, unless L dictates otherwise, but you can override this. You shouldn't need to. The location for temporary files can be changed on a per-parser basis with L. If you do override this, make certain that the object you return is set for binmode(), and is able to handle the following methods: read(BUF, NBYTES) getline() getlines() print(@ARGS) flush() seek(0, 0) Fatal exception if the stream could not be established. =cut sub new_tmpfile { my ($self) = @_; my $io; if ($self->{MP5_TmpToCore}) { my $var; $io = IO::File->new(\$var, '+>:') or die "$ME: Can't open in-core tmpfile: $!"; } else { my $args = {}; if( $self->tmp_dir ) { $args->{DIR} = $self->tmp_dir; } $io = tmpopen( $args ) or die "$ME: can't open tmpfile: $!\n"; binmode($io) or die "$ME: can't set to binmode: $!"; } return $io; } =back =cut #------------------------------------------------------------ =head2 Parse results and error recovery =over 4 =cut #------------------------------ =item last_error I Return the error (if any) that we ignored in the last parse. =cut sub last_error { join '', shift->results->errors; } =item ambiguous_content I Returns true if the most recently parsed message has one or more entities with ambiguous content. See the documentation of C's C method for details. Note that while these two calls to ambuguous_content return the same thing: $entity = $parser->parse($whatever_stream); $parser->ambuguous_content(); $entity->ambuguous_content(); the former is faster because it simply returns the results that were detected during the parse, while the latter actually executes the code that checks for ambiguous content again. Messages with ambiguous content should be treated as a security risk. In particular, if MIME::Parser is used in an email security tool, ambiguous messages should not be delivered to end-users. =cut sub ambiguous_content { my ($self) = @_; return $self->{MP5_AmbiguousContent}; } #------------------------------ =item last_head I Return the top-level MIME header of the last stream we attempted to parse. This is useful for replying to people who sent us bad MIME messages. ### Parse an input stream: eval { $entity = $parser->parse(\*STDIN) }; if (!$entity) { ### parse failed! my $decapitated = $parser->last_head; ... } =cut sub last_head { shift->results->top_head; } #------------------------------ =item results I Return an object containing lots of info from the last entity parsed. This will be an instance of class L. =cut sub results { shift->{MP5_Results}; } =back =cut #------------------------------ 1; __END__ =head1 OPTIMIZING YOUR PARSER =head2 Maximizing speed Optimum input mechanisms: parse() YES (if you give it a globref or a subclass of IO::File) parse_open() YES parse_data() NO (see below) parse_two() NO (see below) Optimum settings: decode_headers() *** (no real difference; 0 is slightly faster) extract_nested_messages() 0 (may be slightly faster, but in general you want it set to 1) output_to_core() 0 (will be MUCH faster) tmp_to_core() 0 (will be MUCH faster) B It's much faster to use E$fooE than $foo-Egetline. For backwards compatibility, this module must continue to use object-oriented I/O in most places, but if you use L with a "real" filehandle (string, globref, or subclass of IO::File) then MIME::Parser is able to perform some crucial optimizations. B Currently this is just a front-end onto parse_data(). If your OS supports it, you're I better off doing something like: $parser->parse_open("/bin/cat msg.head msg.body |"); =head2 Minimizing memory Optimum input mechanisms: parse() YES parse_open() YES parse_data() NO (in-core I/O will burn core) parse_two() NO (in-core I/O will burn core) Optimum settings: decode_headers() *** (no real difference) extract_nested_messages() *** (no real difference) output_to_core() 0 (will use MUCH less memory) tmp_to_core is 1) tmp_to_core() 0 (will use MUCH less memory) =head2 Maximizing tolerance of bad MIME Optimum input mechanisms: parse() *** (doesn't matter) parse_open() *** (doesn't matter) parse_data() *** (doesn't matter) parse_two() *** (doesn't matter) Optimum settings: decode_headers() 0 (sidesteps problem of bad hdr encodings) extract_nested_messages() 0 (sidesteps problems of bad nested messages, but often you want it set to 1 anyway). output_to_core() *** (doesn't matter) tmp_to_core() *** (doesn't matter) =head2 Avoiding disk-based temporary files Optimum input mechanisms: parse() YES (if you give it a seekable handle) parse_open() YES (becomes a seekable handle) parse_data() NO (unless you set tmp_to_core(1)) parse_two() NO (unless you set tmp_to_core(1)) Optimum settings: decode_headers() *** (doesn't matter) extract_nested_messages() *** (doesn't matter) output_to_core() *** (doesn't matter) tmp_to_core() 1 B You can set L true: this will always use in-core I/O for the buffering (B this will slow down the parsing of messages with large attachments). B You can always override L in a subclass. =head1 WARNINGS =over 4 =item Multipart messages are always read line-by-line Multipart document parts are read line-by-line, so that the encapsulation boundaries may easily be detected. However, bad MIME composition agents (for example, naive CGI scripts) might return multipart documents where the parts are, say, unencoded bitmap files... and, consequently, where such "lines" might be veeeeeeeeery long indeed. A better solution for this case would be to set up some form of state machine for input processing. This will be left for future versions. =item Multipart parts read into temp files before decoding In my original implementation, the MIME::Decoder classes had to be aware of encapsulation boundaries in multipart MIME documents. While this decode-while-parsing approach obviated the need for temporary files, it resulted in inflexible and complex decoder implementations. The revised implementation uses a temporary file (a la C) during parsing to hold the I portion of the current MIME document or part. This file is deleted automatically after the current part is decoded and the data is written to the "body stream" object; you'll never see it, and should never need to worry about it. Some folks have asked for the ability to bypass this temp-file mechanism, I suppose because they assume it would slow down their application. I considered accommodating this wish, but the temp-file approach solves a lot of thorny problems in parsing, and it also protects against hidden bugs in user applications (what if you've directed the encoded part into a scalar, and someone unexpectedly sends you a 6 MB tar file?). Finally, I'm just not convinced that the temp-file use adds significant overhead. =item Fuzzing of CRLF and newline on input RFC 2045 dictates that MIME streams have lines terminated by CRLF (C<"\r\n">). However, it is extremely likely that folks will want to parse MIME streams where each line ends in the local newline character C<"\n"> instead. An attempt has been made to allow the parser to handle both CRLF and newline-terminated input. =item Fuzzing of CRLF and newline on output The C<"7bit"> and C<"8bit"> decoders will decode both a C<"\n"> and a C<"\r\n"> end-of-line sequence into a C<"\n">. The C<"binary"> decoder (default if no encoding specified) still outputs stuff verbatim... so a MIME message with CRLFs and no explicit encoding will be output as a text file that, on many systems, will have an annoying ^M at the end of each line... I. =item Inability to handle multipart boundaries that contain newlines First, let's get something straight: I and is incompatible with RFC 2046... hence, it's not valid MIME. If your mailer creates multipart boundary strings that contain newlines I give it two weeks notice and find another one. If your mail robot receives MIME mail like this, regard it as syntactically incorrect MIME, which it is. Why do I say that? Well, in RFC 2046, the syntax of a boundary is given quite clearly: boundary := 0*69 bcharsnospace bchars := bcharsnospace / " " bcharsnospace := DIGIT / ALPHA / "'" / "(" / ")" / "+" /"_" / "," / "-" / "." / "/" / ":" / "=" / "?" All of which means that a valid boundary string I have newlines in it, and any newlines in such a string in the message header are expected to be solely the result of I the string (i.e., inserting to-be-removed newlines for readability and line-shortening I). Yet, there is at least one brain-damaged user agent out there that composes mail like this: MIME-Version: 1.0 Content-type: multipart/mixed; boundary="----ABC- 123----" Subject: Hi... I'm a dork! This is a multipart MIME message (yeah, right...) ----ABC- 123---- Hi there! We have I to discourage practices like this (and the recent file upload idiocy where binary files that are part of a multipart MIME message aren't base64-encoded) if we want MIME to stay relatively simple, and MIME parsers to be relatively robust. I =back =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Eryq (F), ZeeGee Software Inc (F). Dianne Skoll (dianne@skoll.ca) All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut MIME-tools-5.515/lib/MIME/Parser/0000755000175000017500000000000014612223175014264 5ustar dfsdfsMIME-tools-5.515/lib/MIME/Parser/Filer.pm0000644000175000017500000006247014121157116015670 0ustar dfsdfspackage MIME::Parser::Filer; =head1 NAME MIME::Parser::Filer - manage file-output of the parser =head1 SYNOPSIS Before reading further, you should see L to make sure that you understand where this module fits into the grand scheme of things. Go on, do it now. I'll wait. Ready? Ok... now read L<"DESCRIPTION"> below, and everything else should make sense. =head2 Public interface ### Create a "filer" of the desired class: my $filer = MIME::Parser::FileInto->new($dir); my $filer = MIME::Parser::FileUnder->new($basedir); ... ### Want added security? Don't let outsiders name your files: $filer->ignore_filename(1); ### Prepare for the parsing of a new top-level message: $filer->init_parse; ### Return the path where this message's data should be placed: $path = $filer->output_path($head); =head2 Semi-public interface These methods might be overridden or ignored in some subclasses, so they don't all make sense in all circumstances: ### Tweak the mapping from content-type to extension: $emap = $filer->output_extension_map; $emap->{"text/html"} = ".htm"; =head1 DESCRIPTION =head2 How this class is used when parsing When a MIME::Parser decides that it wants to output a file to disk, it uses its "Filer" object -- an instance of a MIME::Parser::Filer subclass -- to determine where to put the file. Every parser has a single Filer object, which it uses for all parsing. You can get the Filer for a given $parser like this: $filer = $parser->filer; At the beginning of each C, the filer's internal state is reset by the parser: $parser->filer->init_parse; The parser can then get a path for each entity in the message by handing that entity's header (a MIME::Head) to the filer and having it do the work, like this: $new_file = $parser->filer->output_path($head); Since it's nice to be able to clean up after a parse (especially a failed parse), the parser tells the filer when it has actually used a path: $parser->filer->purgeable($new_file); Then, if you want to clean up the files which were created for a particular parse (and also any directories that the Filer created), you would do this: $parser->filer->purge; =head2 Writing your own subclasses There are two standard "Filer" subclasses (see below): B, which throws all files from all parses into the same directory, and B (preferred), which creates a subdirectory for each message. Hopefully, these will be sufficient for most uses, but just in case... The only method you have to override is L: $filer->output_path($head); This method is invoked by MIME::Parser when it wants to put a decoded message body in an output file. The method should return a path to the file to create. Failure is indicated by throwing an exception. The path returned by C should be "ready for open()": any necessary parent directories need to exist at that point. These directories can be created by the Filer, if course, and they should be marked as B if a purge should delete them. Actually, if your issue is more I the files go than what they're named, you can use the default L method and just override one of its components: $dir = $filer->output_dir($head); $name = $filer->output_filename($head); ... =head1 PUBLIC INTERFACE =head2 MIME::Parser::Filer This is the abstract superclass of all "filer" objects. =over 4 =cut use strict; ### Kit modules: use MIME::Tools qw(:msgtypes); use File::Spec; use File::Path qw(rmtree); use MIME::WordDecoder; ### Output path uniquifiers: my $GFileNo = 0; my $GSubdirNo = 0; ### Map content-type to extension. ### If we can't map "major/minor", we try "major/*", then use "*/*". my %DefaultTypeToExt = qw( application/andrew-inset .ez application/octet-stream .bin application/oda .oda application/pdf .pdf application/pgp .pgp application/postscript .ps application/rtf .rtf application/x-bcpio .bcpio application/x-chess-pgn .pgn application/x-cpio .cpio application/x-csh .csh application/x-dvi .dvi application/x-gtar .gtar application/x-gunzip .gz application/x-hdf .hdf application/x-latex .latex application/x-mif .mif application/x-netcdf .cdf application/x-netcdf .nc application/x-sh .sh application/x-shar .shar application/x-sv4cpio .sv4cpio application/x-sv4crc .sv4crc application/x-tar .tar application/x-tcl .tcl application/x-tex .tex application/x-texinfo .texi application/x-troff .roff application/x-troff .tr application/x-troff-man .man application/x-troff-me .me application/x-troff-ms .ms application/x-ustar .ustar application/x-wais-source .src application/zip .zip audio/basic .snd audio/ulaw .au audio/x-aiff .aiff audio/x-wav .wav image/gif .gif image/ief .ief image/jpeg .jpg image/png .png image/xbm .xbm image/tiff .tif image/x-cmu-raster .ras image/x-portable-anymap .pnm image/x-portable-bitmap .pbm image/x-portable-graymap .pgm image/x-portable-pixmap .ppm image/x-rgb .rgb image/x-xbitmap .xbm image/x-xpixmap .xpm image/x-xwindowdump .xwd text/* .txt text/html .html text/plain .txt text/richtext .rtx text/tab-separated-values .tsv text/x-setext .etx text/x-vcard .vcf video/mpeg .mpg video/quicktime .mov video/x-msvideo .avi video/x-sgi-movie .movie message/* .msg */* .dat ); #------------------------------ =item new INITARGS... I Create a new outputter for the given parser. Any subsequent arguments are given to init(), which subclasses should override for their own use (the default init does nothing). =cut sub new { my ($class, @initargs) = @_; my $self = bless { MPF_Prefix => "msg", MPF_Dir => ".", MPF_Ext => { %DefaultTypeToExt }, MPF_Purgeable => [], ### files created by the last parse MPF_MaxName => 80, ### max filename before treated as evil MPF_TrimRoot => 14, ### trim root to this length MPF_TrimExt => 3, ### trim extension to this length }, $class; $self->init(@initargs); $self; } sub init { ### no-op } #------------------------------ # My PID, but untainted # sub untainted_pid { if ($$ =~ /^(\d+)$/) { return $1; } # Can't happen... return "0"; } #------------------------------ # # cleanup_dir # # Instance method, private. # Cleanup a directory, defaulting empty to "." # sub cleanup_dir { my ($self, $dir) = @_; $dir = '.' if (!defined($dir) || ($dir eq '')); # coerce empty to "." $dir = '/.' if ($dir eq '/'); # coerce "/" so "$dir/$filename" works $dir =~ s|/$||; # be nice: get rid of any trailing "/" $dir; } #------------------------------ =item results RESULTS I Link this filer to a MIME::Parser::Results object which will tally the messages. Notice that we avoid linking it to the parser to avoid circular reference! =cut sub results { my ($self, $results) = @_; $self->{MPF_Results} = $results if (@_ > 1); $self->{MPF_Results}; } ### Log debug messages: sub debug { my $self = shift; if (MIME::Tools->debugging()) { if ($self->{MPF_Results}) { unshift @_, $self->{MPF_Results}->indent; $self->{MPF_Results}->msg($M_DEBUG, @_); } MIME::Tools::debug(@_); } } ### Log warning messages: sub whine { my $self = shift; if ($self->{MPF_Results}) { unshift @_, $self->{MPF_Results}->indent; $self->{MPF_Results}->msg($M_WARNING, @_); } MIME::Tools::whine(@_); } #------------------------------ =item init_parse I Prepare to start parsing a new message. Subclasses should always be sure to invoke the inherited method. =cut sub init_parse { my $self = shift; $self->{MPF_Purgeable} = []; } #------------------------------ =item evil_filename FILENAME I Is this an evil filename; i.e., one which should not be used in generating a disk file name? It is if any of these are true: * it is empty or entirely whitespace * it contains leading or trailing whitespace * it is a string of dots: ".", "..", etc. * it contains characters not in the set: "A" - "Z", "a" - "z", "0" - "9", "-", "_", "+", "=", ".", ",", "@", "#", "$", and " ". * it is too long If you just want to change this behavior, you should override this method in the subclass of MIME::Parser::Filer that you use. B at the time this method is invoked, the FILENAME has already been unmime'd into the local character set. If you're using any character set other than ASCII, ISO-8859-*, or UTF-8, the interpretation of the "path" characters might be very different, and you will probably need to override this method. See L for more details. B subclasses of MIME::Parser::Filer which override output_path() might not consult this method; note, however, that the built-in subclasses do consult it. I =cut sub evil_filename { my ($self, $name) = @_; $self->debug("is this evil? '$name'"); return 1 if (!defined($name) or ($name eq '')); ### empty return 1 if ($name =~ m{(^\s)|(\s+\Z)}); ### leading/trailing whitespace return 1 if ($name =~ m{^\.+\Z}); ### dots return 1 if ($name =~ /[^-A-Z0-9_+=.,@\#\$\% ]/i); # Only allow good chars return 1 if ($self->{MPF_MaxName} and (length($name) > $self->{MPF_MaxName})); $self->debug("it's ok"); 0; } #------------------------------ =item exorcise_filename FILENAME I If a given filename is evil (see L) we try to rescue it by performing some basic operations: shortening it, removing bad characters, etc., and checking each against evil_filename(). Returns the exorcised filename (which is guaranteed to not be evil), or undef if it could not be salvaged. B at the time this method is invoked, the FILENAME has already been unmime'd into the local character set. If you're using anything character set other than ASCII, ISO-8859-*, or UTF-8, the interpretation of the "path" characters might be very very different, and you will probably need to override this method. See L for more details. =cut sub exorcise_filename { my ($self, $fname) = @_; ### Isolate to last path element: my $last = $fname; ### Path separators are / or \ $last =~ s{^.*[/\\]}{}; ### Convert semi-evil characters to underscores $last =~ s/[\/\\\[\]:]/_/g; if ($last and !$self->evil_filename($last)) { $self->debug("looks like I can use the last path element"); return $last; } ### Break last element into root and extension, and truncate: my ($root, $ext) = (($last =~ /^(.*)\.([^\.]+)\Z/) ? ($1, $2) : ($last, '')); ### Delete leading and trailing whitespace $root =~ s/^\s+//; $ext =~ s/\s+$//; $root = substr($root, 0, ($self->{MPF_TrimRoot} || 14)); $ext = substr($ext, 0, ($self->{MPF_TrimExt} || 3)); $ext =~ /^\w+$/ or $ext = "dat"; my $trunc = $root . ($ext ? ".$ext" : ''); if (!$self->evil_filename($trunc)) { $self->debug("looks like I can use the truncated last path element"); return $trunc; } ### Remove all bad characters $trunc =~ s/([^-A-Z0-9_+=.,@\#\$ ])/sprintf("%%%02X", unpack("C", $1))/ige; if (!$self->evil_filename($trunc)) { $self->debug("looks like I can use a munged version of the truncated last path element"); return $trunc; } ### Hope that works: undef; } #------------------------------ =item find_unused_path DIR, FILENAME I We have decided on an output directory and tentative filename, but there is a chance that it might already exist. Keep adding a numeric suffix "-1", "-2", etc. to the filename until an unused path is found, and then return that path. The suffix is actually added before the first "." in the filename is there is one; for example: picture.gif archive.tar.gz readme picture-1.gif archive-1.tar.gz readme-1 picture-2.gif archive-2.tar.gz readme-2 ... ... ... picture-10.gif ... This can be a costly operation, and risky if you don't want files renamed, so it is in your best interest to minimize situations where these kinds of collisions occur. Unfortunately, if a multipart message gives all of its parts the same recommended filename, and you are placing them all in the same directory, this method might be unavoidable. =cut sub find_unused_path { my ($self, $dir, $fname) = @_; my $i = 0; while (1) { ### Create suffixed name (from filename), and see if we can use it: my $suffix = ($i ? "-$i" : ""); my $sname = $fname; $sname =~ s/^(.*?)(\.|\Z)/$1$suffix$2/; my $path = File::Spec->catfile($dir, $sname); if (! -e $path) { ### it's good! $i and $self->whine("collision with $fname in $dir: using $path"); return $path; } $self->debug("$path already taken"); } continue { ++$i; } } #------------------------------ =item ignore_filename [YESNO] I Return true if we should always ignore recommended filenames in messages, choosing instead to always generate our own filenames. With argument, sets this value. B subclasses of MIME::Parser::Filer which override output_path() might not honor this setting; note, however, that the built-in subclasses honor it. =cut sub ignore_filename { my $self = shift; $self->{MPF_IgnoreFilename} = $_[0] if @_; $self->{MPF_IgnoreFilename}; } #------------------------------ =item output_dir HEAD I Return the output directory for the given header. The default method returns ".". =cut sub output_dir { my ($self, $head) = @_; return "."; } #------------------------------ =item output_filename HEAD I A given recommended filename was either not given, or it was judged to be evil. Return a fake name, possibly using information in the message HEADer. Note that this is just the filename, not the full path. Used by L. If you're using the default C, you probably don't need to worry about avoiding collisions with existing files; we take care of that in L. =cut sub output_filename { my ($self, $head) = @_; ### Get the recommended name: my $recommended = $head->recommended_filename; ### Get content type: my ($type, $subtype) = split m{/}, $head->mime_type; $subtype ||= ''; ### Get recommended extension, being quite conservative: my $recommended_ext = (($recommended and ($recommended =~ m{(\.\w+)\Z})) ? $1 : undef); ### Try and get an extension, honoring a given one first: my $ext = ($recommended_ext || $self->{MPF_Ext}{"$type/$subtype"} || $self->{MPF_Ext}{"$type/*"} || $self->{MPF_Ext}{"*/*"} || ".dat"); ### Get a prefix: ++$GFileNo; return ($self->output_prefix . "-" . untainted_pid() . "-$GFileNo$ext"); } #------------------------------ =item output_prefix [PREFIX] I Get the short string that all filenames for extracted body-parts will begin with (assuming that there is no better "recommended filename"). The default is F<"msg">. If PREFIX I given, the current output prefix is returned. If PREFIX I given, the output prefix is set to the new value, and the previous value is returned. Used by L. B subclasses of MIME::Parser::Filer which override output_path() or output_filename() might not honor this setting; note, however, that the built-in subclasses honor it. =cut sub output_prefix { my ($self, $prefix) = @_; $self->{MPF_Prefix} = $prefix if (@_ > 1); $self->{MPF_Prefix}; } #------------------------------ =item output_type_ext I Return a reference to the hash used by the default L for mapping from content-types to extensions when there is no default extension to use. $emap = $filer->output_typemap; $emap->{'text/plain'} = '.txt'; $emap->{'text/html'} = '.html'; $emap->{'text/*'} = '.txt'; $emap->{'*/*'} = '.dat'; B subclasses of MIME::Parser::Filer which override output_path() or output_filename() might not consult this hash; note, however, that the built-in subclasses consult it. =cut sub output_type_ext { my $self = shift; return $self->{MPF_Ext}; } #------------------------------ =item output_path HEAD I Given a MIME head for a file to be extracted, come up with a good output pathname for the extracted file. This is the only method you need to worry about if you are building a custom filer. The default implementation does a lot of work; subclass implementers I should try to just override its components instead of the whole thing. It works basically as follows: $directory = $self->output_dir($head); $filename = $head->recommended_filename(); if (!$filename or $self->ignore_filename() or $self->evil_filename($filename)) { $filename = $self->output_filename($head); } return $self->find_unused_path($directory, $filename); B There are many, many, many ways you might want to control the naming of files, based on your application. If you don't like the behavior of this function, you can easily define your own subclass of MIME::Parser::Filer and override it there. B Nickolay Saukh pointed out that, given the subjective nature of what is "evil", this function really shouldn't I about an evil filename, but maybe just issue a I message. I considered that, but then I thought: if debugging were off, people wouldn't know why (or even if) a given filename had been ignored. In mail robots that depend on externally-provided filenames, this could cause hard-to-diagnose problems. So, the message is still a warning. I =cut sub output_path { my ($self, $head) = @_; ### Get the output directory: my $dir = $self->output_dir($head); ### Get the output filename as UTF-8 my $fname = $head->recommended_filename; ### Can we use it: if (!defined($fname)) { $self->debug("no filename recommended: synthesizing our own"); $fname = $self->output_filename($head); } elsif ($self->ignore_filename) { $self->debug("ignoring all external filenames: synthesizing our own"); $fname = $self->output_filename($head); } elsif ($self->evil_filename($fname)) { ### Can we save it by just taking the last element? my $ex = $self->exorcise_filename($fname); if (defined($ex) and !$self->evil_filename($ex)) { $self->whine("Provided filename '$fname' is regarded as evil, ", "but I was able to exorcise it and get something ", "usable."); $fname = $ex; } else { $self->whine("Provided filename '$fname' is regarded as evil; ", "I'm ignoring it and supplying my own."); $fname = $self->output_filename($head); } } else { # Untaint $fname... we know it's not evil if ($fname =~ /^(.*)$/) { $fname = $1; } } $self->debug("planning to use '$fname'"); ### Resolve collisions and return final path: return $self->find_unused_path($dir, $fname); } #------------------------------ =item purge I Purge all files/directories created by the last parse. This method simply goes through the purgeable list in reverse order (see L) and removes all existing files/directories in it. You should not need to override this method. =cut sub purge { my ($self) = @_; foreach my $path (reverse @{$self->{MPF_Purgeable}}) { (-e $path) or next; ### must check: might delete DIR before DIR/FILE rmtree($path, 0, 1); (-e $path) and $self->whine("unable to purge: $path"); } 1; } #------------------------------ =item purgeable [FILE] I Add FILE to the list of "purgeable" files/directories (those which will be removed if you do a C). You should not need to override this method. If FILE is not given, the "purgeable" list is returned. This may be used for more-sophisticated purging. As a special case, invoking this method with a FILE that is an arrayref will replace the purgeable list with a copy of the array's contents, so [] may be used to clear the list. Note that the "purgeable" list is cleared when a parser begins a new parse; therefore, if you want to use purge() to do cleanup, you I do so I starting a new parse! =cut sub purgeable { my ($self, $path) = @_; return @{$self->{MPF_Purgeable}} if (@_ == 1); if (ref($path)) { $self->{MPF_Purgeable} = [ @$path ]; } else { push @{$self->{MPF_Purgeable}}, $path; } 1; } =back =cut #------------------------------------------------------------ #------------------------------------------------------------ =head2 MIME::Parser::FileInto This concrete subclass of MIME::Parser::Filer supports filing into a given directory. =over 4 =cut package MIME::Parser::FileInto; use strict; use vars qw(@ISA); @ISA = qw(MIME::Parser::Filer); #------------------------------ =item init DIRECTORY I Set the directory where all files will go. =cut sub init { my ($self, $dir) = @_; $self->{MPFI_Dir} = $self->cleanup_dir($dir); } #------------------------------ # # output_dir HEAD # # I # Return the output directory where the files go. # sub output_dir { shift->{MPFI_Dir}; } =back =cut #------------------------------------------------------------ #------------------------------------------------------------ =head2 MIME::Parser::FileUnder This concrete subclass of MIME::Parser::Filer supports filing under a given directory, using one subdirectory per message, but with all message parts in the same directory. =over 4 =cut package MIME::Parser::FileUnder; use strict; use vars qw(@ISA); @ISA = qw(MIME::Parser::Filer); #------------------------------ =item init BASEDIR, OPTSHASH... I Set the base directory which will contain the message directories. If used, then each parse of begins by creating a new subdirectory of BASEDIR where the actual parts of the message are placed. OPTSHASH can contain the following: =over 4 =item DirName Explicitly set the name of the subdirectory which is created. The default is to use the time, process id, and a sequence number, but you might want a predictable directory. =item Purge Automatically purge the contents of the directory (including all subdirectories) before each parse. This is really only needed if using an explicit DirName, and is provided as a convenience only. Currently we use the 1-arg form of File::Path::rmtree; you should familiarize yourself with the caveats therein. =back The output_dir() will return the path to this message-specific directory until the next parse is begun, so you can do this: use File::Path; $parser->output_under("/tmp"); $ent = eval { $parser->parse_open($msg); }; ### parse if (!$ent) { ### parse failed rmtree($parser->output_dir); die "parse failed: $@"; } else { ### parse succeeded ...do stuff... } =cut sub init { my ($self, $basedir, %opts) = @_; $self->{MPFU_Base} = $self->cleanup_dir($basedir); $self->{MPFU_DirName} = $opts{DirName}; $self->{MPFU_Purge} = $opts{Purge}; } #------------------------------ # # init_parse # # I # Prepare to start parsing a new message. # sub init_parse { my $self = shift; ### Invoke inherited method first! $self->SUPER::init_parse; ### Determine the subdirectory of their base to use: my $subdir = (defined($self->{MPFU_DirName}) ? $self->{MPFU_DirName} : ("msg-" . scalar(time) . "-" . MIME::Parser::Filer::untainted_pid() . "-" . $GSubdirNo++)); $self->debug("subdir = $subdir"); ### Determine full path to the per-message output directory: $self->{MPFU_Dir} = File::Spec->catfile($self->{MPFU_Base}, $subdir); ### Remove and re-create the per-message output directory: rmtree $self->output_dir if $self->{MPFU_Purge}; (-d $self->output_dir) or mkdir $self->output_dir, 0700 or die "mkdir ".$self->output_dir.": $!\n"; ### Add the per-message output directory to the puregables: $self->purgeable($self->output_dir); 1; } #------------------------------ # # output_dir HEAD # # I # Return the output directory that we used for the last parse. # sub output_dir { shift->{MPFU_Dir}; } =back =cut 1; __END__ =head1 SEE ALSO L, L =head1 AUTHOR Eryq (F), ZeeGee Software Inc (F). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. MIME-tools-5.515/lib/MIME/Parser/Reader.pm0000644000175000017500000002016512453242604016027 0ustar dfsdfspackage MIME::Parser::Reader; =head1 NAME MIME::Parser::Reader - a line-oriented reader for a MIME::Parser =head1 SYNOPSIS This module is used internally by MIME::Parser; you probably don't need to be looking at it at all. But just in case... ### Create a top-level reader, where chunks end at EOF: $rdr = MIME::Parser::Reader->new(); ### Spawn a child reader, where chunks also end at a boundary: $subrdr = $rdr->spawn->add_boundary($bound); ### Spawn a child reader, where chunks also end at a given string: $subrdr = $rdr->spawn->add_terminator($string); ### Read until boundary or terminator: $subrdr->read_chunk($in, $out); =head1 DESCRIPTION A line-oriented reader which can deal with virtual end-of-stream defined by a collection of boundaries. B this is a private class solely for use by MIME::Parser. This class has no official public interface =cut use strict; ### All possible end-of-line sequences. ### Note that "" is included because last line of stream may have no newline! my @EOLs = ("", "\r", "\n", "\r\n", "\n\r"); ### Long line: my $LONGLINE = ' ' x 1000; #------------------------------ # # new # # I # Construct an empty (top-level) reader. # sub new { my ($class) = @_; my $eos; return bless { Bounds => [], BH => {}, TH => {}, EOS => \$eos, }, $class; } #------------------------------ # # spawn # # I # Return a reader which is mostly a duplicate, except that the EOS # accumulator is shared. # sub spawn { my $self = shift; my $dup = bless {}, ref($self); $dup->{Bounds} = [ @{$self->{Bounds}} ]; ### deep copy $dup->{BH} = { %{$self->{BH}} }; ### deep copy $dup->{TH} = { %{$self->{TH}} }; ### deep copy $dup->{EOS} = $self->{EOS}; ### shallow copy; same ref! $dup; } #------------------------------ # # add_boundary BOUND # # I # Let BOUND be the new innermost boundary. Returns self. # sub add_boundary { my ($self, $bound) = @_; unshift @{$self->{Bounds}}, $bound; ### now at index 0 $self->{BH}{"--$bound"} = "DELIM $bound"; $self->{BH}{"--$bound--"} = "CLOSE $bound"; $self; } #------------------------------ # # add_terminator LINE # # I # Let LINE be another terminator. Returns self. # sub add_terminator { my ($self, $line) = @_; foreach (@EOLs) { $self->{TH}{"$line$_"} = "DONE $line"; } $self; } #------------------------------ # # has_bounds # # I # Are there boundaries to contend with? # sub has_bounds { scalar(@{shift->{Bounds}}); } #------------------------------ # # depth # # I # How many levels are there? # sub depth { scalar(@{shift->{Bounds}}); } #------------------------------ # # eos [EOS] # # I # Return the last end-of-stream token seen. # See read_chunk() for what these might be. # sub eos { my $self = shift; ${$self->{EOS}} = $_[0] if @_; ${$self->{EOS}}; } #------------------------------ # # eos_type [EOSTOKEN] # # I # Return the high-level type of the given token (defaults to our token). # # DELIM saw an innermost boundary like --xyz # CLOSE saw an innermost boundary like --xyz-- # DONE callback returned false # EOF end of file # EXT saw boundary of some higher-level # sub eos_type { my ($self, $eos) = @_; $eos = $self->eos if (@_ == 1); if ($eos =~ /^(DONE|EOF)/) { return $1; } elsif ($eos =~ /^(DELIM|CLOSE) (.*)$/) { return (($2 eq $self->{Bounds}[0]) ? $1 : 'EXT'); } else { die("internal error: unable to classify boundary token ($eos)"); } } #------------------------------ # # native_handle HANDLE # # I # Can we do native i/o on HANDLE? If true, returns the handle # that will respond to native I/O calls; else, returns undef. # sub native_handle { my $fh = shift; return $fh if ($fh->isa('IO::File') || $fh->isa('IO::Handle')); return $fh if (ref $fh eq 'GLOB'); undef; } #------------------------------ # # read_chunk INHANDLE, OUTHANDLE # # I # Get lines until end-of-stream. # Returns the terminating-condition token: # # DELIM xyz saw boundary line "--xyz" # CLOSE xyz saw boundary line "--xyz--" # DONE xyz saw terminator line "xyz" # EOF end of file # Parse up to (and including) the boundary, and dump output. # Follows the RFC 2046 specification, that the CRLF immediately preceding # the boundary is part of the boundary, NOT part of the input! # # NOTE: while parsing bodies, we take care to remember the EXACT end-of-line # sequence. This is because we *may* be handling 'binary' encoded data, and # in that case we can't just massage \r\n into \n! Don't worry... if the # data is styled as '7bit' or '8bit', the "decoder" will massage the CRLF # for us. For now, we're just trying to chop up the data stream. # NBK - Oct 12, 1999 # The CRLF at the end of the current line is considered part # of the boundary. I buffer the current line and output the # last. I strip the last CRLF when I hit the boundary. sub read_chunk { my ($self, $in, $out, $keep_newline, $normalize_newlines) = @_; # If we're parsing a preamble or epilogue, we need to keep the blank line # that precedes the boundary line. $keep_newline ||= 0; $normalize_newlines ||= 0; ### Init: my %bh = %{$self->{BH}}; my %th = %{$self->{TH}}; my $thx = keys %th; local $_ = $LONGLINE; my $maybe; my $last = ''; my $eos = ''; ### Determine types: my $n_in = native_handle($in); my $n_out = native_handle($out); ### Handle efficiently by type: if ($n_in) { if ($n_out) { ### native input, native output [fastest] while (<$n_in>) { # Normalize line ending $_ =~ s/(?:\n\r|\r\n|\r)$/\n/ if $normalize_newlines; if (substr($_, 0, 2) eq '--') { ($maybe = $_) =~ s/[ \t\r\n]+\Z//; $bh{$maybe} and do { $eos = $bh{$maybe}; last }; } $thx and $th{$_} and do { $eos = $th{$_}; last }; print $n_out $last; $last = $_; } } else { ### native input, OO output [slower] while (<$n_in>) { # Normalize line ending $_ =~ s/(?:\n\r|\r\n|\r)$/\n/ if $normalize_newlines; if (substr($_, 0, 2) eq '--') { ($maybe = $_) =~ s/[ \t\r\n]+\Z//; $bh{$maybe} and do { $eos = $bh{$maybe}; last }; } $thx and $th{$_} and do { $eos = $th{$_}; last }; $out->print($last); $last = $_; } } } else { if ($n_out) { ### OO input, native output [even slower] while (defined($_ = $in->getline)) { # Normalize line ending $_ =~ s/(?:\n\r|\r\n|\r)$/\n/ if $normalize_newlines; if (substr($_, 0, 2) eq '--') { ($maybe = $_) =~ s/[ \t\r\n]+\Z//; $bh{$maybe} and do { $eos = $bh{$maybe}; last }; } $thx and $th{$_} and do { $eos = $th{$_}; last }; print $n_out $last; $last = $_; } } else { ### OO input, OO output [slowest] while (defined($_ = $in->getline)) { # Normalize line ending $_ =~ s/(?:\n\r|\r\n|\r)$/\n/ if $normalize_newlines; if (substr($_, 0, 2) eq '--') { ($maybe = $_) =~ s/[ \t\r\n]+\Z//; $bh{$maybe} and do { $eos = $bh{$maybe}; last }; } $thx and $th{$_} and do { $eos = $th{$_}; last }; $out->print($last); $last = $_; } } } # Write out last held line, removing terminating CRLF if ended on bound, # unless the line consists only of CRLF and we're wanting to keep the # preceding blank line (as when parsing a preamble) $last =~ s/[\r\n]+\Z// if ($eos =~ /^(DELIM|CLOSE)/ && !($keep_newline && $last =~ m/^[\r\n]\z/)); $out->print($last); ### Save and return what we finished on: ${$self->{EOS}} = ($eos || 'EOF'); 1; } #------------------------------ # # read_lines INHANDLE, \@OUTLINES # # I # Read lines into the given array. # sub read_lines { my ($self, $in, $outlines) = @_; my $data = ''; open(my $fh, '>', \$data) or die $!; $self->read_chunk($in, $fh); @$outlines = split(/^/, $data); close $fh; 1; } 1; __END__ =head1 SEE ALSO L, L MIME-tools-5.515/lib/MIME/Parser/Results.pm0000644000175000017500000000601211032231440016245 0ustar dfsdfspackage MIME::Parser::Results; =head1 NAME MIME::Parser::Results - results of the last entity parsed =head1 SYNOPSIS Before reading further, you should see L to make sure that you understand where this module fits into the grand scheme of things. Go on, do it now. I'll wait. Ready? Ok... ### Do parse, get results: my $entity = eval { $parser->parse(\*STDIN); }; my $results = $parser->results; ### Get all messages logged: @msgs = $results->msgs; ### Get messages of specific types (also tests if there were problems): $had_errors = $results->errors; $had_warnings = $results->warnings; ### Get outermost header: $top_head = $results->top_head; =head1 DESCRIPTION Results from the last MIME::Parser parse. =head1 PUBLIC INTERFACE =over 4 =cut use strict; ### Kit modules: use MIME::Tools qw(:msgs); #------------------------------ =item new I =cut sub new { bless { MPI_ID => 'MIME-parser', MPI_Msgs => [], MPI_Level => 0, MPI_TopHead => undef, }, shift; } #------------------------------ =item msgs I Return all messages that we logged, in order. Every message is a string beginning with its type followed by C<": ">; the current types are C, C, and C. =cut sub msgs { @{shift->{MPI_Msgs}}; } #------------------------------ =item errors I Return all error messages that we logged, in order. A convenience front-end onto msgs(). =cut sub errors { grep /^error: /, @{shift->{MPI_Msgs}}; } #------------------------------ =item warnings I Return all warning messages that we logged, in order. A convenience front-end onto msgs(). =cut sub warnings { grep /^warning: /, @{shift->{MPI_Msgs}}; } #------------------------------ =item top_head I Return the topmost header, if we were able to read it. This may be useful if the parse fails. =cut sub top_head { my ($self, $head) = @_; $self->{MPI_TopHead} = $head if @_ > 1; $self->{MPI_TopHead}; } #------------------------------ # # PRIVATE: FOR USE DURING PARSING ONLY! # #------------------------------ # # msg TYPE, MESSAGE... # # Take a message. # sub msg { my $self = shift; my $type = shift; my @args = map { defined($_) ? $_ : '<>' } @_; push @{$self->{MPI_Msgs}}, ($type.": ".join('', @args)."\n"); } #------------------------------ # # level [+1|-1] # # Return current parsing level. # sub level { my ($self, $lvl) = @_; $self->{MPI_Level} += $lvl if @_ > 1; $self->{MPI_Level}; } #------------------------------ # # indent # # Return indent for current parsing level. # sub indent { my ($self) = @_; ' ' x $self->{MPI_Level}; } =back =cut 1; __END__ =head1 SEE ALSO L, L =head1 AUTHOR Eryq (F), ZeeGee Software Inc (F). All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. MIME-tools-5.515/lib/MIME/Entity.pm0000644000175000017500000020250514612222720014641 0ustar dfsdfspackage MIME::Entity; =head1 NAME MIME::Entity - class for parsed-and-decoded MIME message =head1 SYNOPSIS Before reading further, you should see L to make sure that you understand where this module fits into the grand scheme of things. Go on, do it now. I'll wait. Ready? Ok... ### Create an entity: $top = MIME::Entity->build(From => 'me@myhost.com', To => 'you@yourhost.com', Subject => "Hello, nurse!", Data => \@my_message); ### Attach stuff to it: $top->attach(Path => $gif_path, Type => "image/gif", Encoding => "base64"); ### Sign it: $top->sign; ### Output it: $top->print(\*STDOUT); =head1 DESCRIPTION A subclass of B. This package provides a class for representing MIME message entities, as specified in RFCs 2045, 2046, 2047, 2048 and 2049. =head1 EXAMPLES =head2 Construction examples Create a document for an ordinary 7-bit ASCII text file (lots of stuff is defaulted for us): $ent = MIME::Entity->build(Path=>"english-msg.txt"); Create a document for a text file with 8-bit (Latin-1) characters: $ent = MIME::Entity->build(Path =>"french-msg.txt", Encoding =>"quoted-printable", From =>'jean.luc@inria.fr', Subject =>"C'est bon!"); Create a document for a GIF file (the description is completely optional; note that we have to specify content-type and encoding since they're not the default values): $ent = MIME::Entity->build(Description => "A pretty picture", Path => "./docs/mime-sm.gif", Type => "image/gif", Encoding => "base64"); Create a document that you already have the text for, using "Data": $ent = MIME::Entity->build(Type => "text/plain", Encoding => "quoted-printable", Data => ["First line.\n", "Second line.\n", "Last line.\n"]); Create a multipart message, with the entire structure given explicitly: ### Create the top-level, and set up the mail headers: $top = MIME::Entity->build(Type => "multipart/mixed", From => 'me@myhost.com', To => 'you@yourhost.com', Subject => "Hello, nurse!"); ### Attachment #1: a simple text document: $top->attach(Path=>"./testin/short.txt"); ### Attachment #2: a GIF file: $top->attach(Path => "./docs/mime-sm.gif", Type => "image/gif", Encoding => "base64"); ### Attachment #3: text we'll create with text we have on-hand: $top->attach(Data => $contents); Suppose you don't know ahead of time that you'll have attachments? No problem: you can "attach" to singleparts as well: $top = MIME::Entity->build(From => 'me@myhost.com', To => 'you@yourhost.com', Subject => "Hello, nurse!", Data => \@my_message); if ($GIF_path) { $top->attach(Path => $GIF_path, Type => 'image/gif'); } Copy an entity (headers, parts... everything but external body data): my $deepcopy = $top->dup; =head2 Access examples ### Get the head, a MIME::Head: $head = $ent->head; ### Get the body, as a MIME::Body; $bodyh = $ent->bodyhandle; ### Get the intended MIME type (as declared in the header): $type = $ent->mime_type; ### Get the effective MIME type (in case decoding failed): $eff_type = $ent->effective_type; ### Get preamble, parts, and epilogue: $preamble = $ent->preamble; ### ref to array of lines $num_parts = $ent->parts; $first_part = $ent->parts(0); ### an entity $epilogue = $ent->epilogue; ### ref to array of lines =head2 Manipulation examples Muck about with the body data: ### Read the (unencoded) body data: if ($io = $ent->open("r")) { while (defined($_ = $io->getline)) { print $_ } $io->close; } ### Write the (unencoded) body data: if ($io = $ent->open("w")) { foreach (@lines) { $io->print($_) } $io->close; } ### Delete the files for any external (on-disk) data: $ent->purge; Muck about with the signature: ### Sign it (automatically removes any existing signature): $top->sign(File=>"$ENV{HOME}/.signature"); ### Remove any signature within 15 lines of the end: $top->remove_sig(15); Muck about with the headers: ### Compute content-lengths for singleparts based on bodies: ### (Do this right before you print!) $entity->sync_headers(Length=>'COMPUTE'); Muck about with the structure: ### If a 0- or 1-part multipart, collapse to a singlepart: $top->make_singlepart; ### If a singlepart, inflate to a multipart with 1 part: $top->make_multipart; Delete parts: ### Delete some parts of a multipart message: my @keep = grep { keep_part($_) } $msg->parts; $msg->parts(\@keep); =head2 Output examples Print to filehandles: ### Print the entire message: $top->print(\*STDOUT); ### Print just the header: $top->print_header(\*STDOUT); ### Print just the (encoded) body... includes parts as well! $top->print_body(\*STDOUT); Stringify... note that C can also be written C; the methods are synonymous, and neither form will be deprecated. If you set the variable $MIME::Entity::BOUNDARY_DELIMITER to a string, that string will be used as the line-end delimiter on output. If it is not set, the line ending will be a newline character (\n) NOTE that $MIME::Entity::BOUNDARY_DELIMITER only applies to structural parts of the MIME data generated by this package and to the Base64 encoded output; if a part internally uses a different line-end delimiter and is output as-is, the line-ending is not changed to match $MIME::Entity::BOUNDARY_DELIMITER. ### Stringify the entire message: print $top->stringify; ### or $top->as_string ### Stringify just the header: print $top->stringify_header; ### or $top->header_as_string ### Stringify just the (encoded) body... includes parts as well! print $top->stringify_body; ### or $top->body_as_string Debug: ### Output debugging info: $entity->dump_skeleton(\*STDERR); =head1 PUBLIC INTERFACE =cut #------------------------------ ### Pragmas: use vars qw(@ISA $VERSION); use strict; ### System modules: use Carp; ### Other modules: use Mail::Internet 1.28 (); use Mail::Field 1.05 (); ### Kit modules: use MIME::Tools qw(:config :msgs :utils); use MIME::Head; use MIME::Body; use MIME::Decoder; @ISA = qw(Mail::Internet); #------------------------------ # # Globals... # #------------------------------ ### The package version, both in 1.23 style *and* usable by MakeMaker: $VERSION = "5.515"; ### Boundary counter: my $BCount = 0; ### Standard "Content-" MIME fields, for scrub(): my $StandardFields = 'Description|Disposition|Id|Type|Transfer-Encoding'; ### Known Mail/MIME fields... these, plus some general forms like ### "x-*", are recognized by build(): my %KnownField = map {$_=>1} qw( bcc cc comments date encrypted from keywords message-id mime-version organization received references reply-to return-path sender subject to ); ### Fallback preamble and epilogue: my $DefPreamble = [ "This is a multi-part message in MIME format..." ]; my $DefEpilogue = [ ]; #============================== # # Utilities, private # #------------------------------ # # known_field FIELDNAME # # Is this a recognized Mail/MIME field? # sub known_field { my $field = lc(shift); $KnownField{$field} or ($field =~ m{^(content|resent|x)-.}); } #------------------------------ # # make_boundary # # Return a unique boundary string. # This is used both internally and by MIME::ParserBase, but it is NOT in # the public interface! Do not use it! # # We generate one containing a "=_", as RFC2045 suggests: # A good strategy is to choose a boundary that includes a character # sequence such as "=_" which can never appear in a quoted-printable # body. See the definition of multipart messages in RFC 2046. # sub make_boundary { return "----------=_".scalar(time)."-$$-".$BCount++; } #============================== =head2 Construction =over 4 =cut #------------------------------ =item new [SOURCE] I Create a new, empty MIME entity. Basically, this uses the Mail::Internet constructor... If SOURCE is an ARRAYREF, it is assumed to be an array of lines that will be used to create both the header and an in-core body. Else, if SOURCE is defined, it is assumed to be a filehandle from which the header and in-core body is to be read. B in either case, the body will not be I merely read! =cut sub new { my $class = shift; my $self = $class->Mail::Internet::new(@_); ### inherited $self->{ME_Parts} = []; ### no parts extracted $self; } =item ambiguous_content I Returns true if this entity I has a C that indicates ambiguous content. Note carefully the difference between: $entity->head->ambiguous_content(); and $entity->ambiguous_content(); The first returns true only if this specific entity's headers indicate ambiguity. The second returns true if this entity I has headers that indicate ambiguity. =cut sub ambiguous_content { my ($self) = @_; return 1 if $self->head->ambiguous_content; return 0 unless $self->is_multipart; foreach my $part ($self->parts) { return 1 if $part->ambiguous_content; } return 0; } ###------------------------------ =item add_part ENTITY, [OFFSET] I Assuming we are a multipart message, add a body part (a MIME::Entity) to the array of body parts. Returns the part that was just added. If OFFSET is positive, the new part is added at that offset from the beginning of the array of parts. If it is negative, it counts from the end of the array. (An INDEX of -1 will place the new part at the very end of the array, -2 will place it as the penultimate item in the array, etc.) If OFFSET is not given, the new part is added to the end of the array. I B in general, you only want to attach parts to entities with a content-type of C). =cut sub add_part { my ($self, $part, $index) = @_; defined($index) or $index = -1; ### Make $index count from the end if negative: $index = $#{$self->{ME_Parts}} + 2 + $index if ($index < 0); splice(@{$self->{ME_Parts}}, $index, 0, $part); $part; } #------------------------------ =item attach PARAMHASH I The real quick-and-easy way to create multipart messages. The PARAMHASH is used to C a new entity; this method is basically equivalent to: $entity->add_part(ref($entity)->build(PARAMHASH, Top=>0)); B normally, you attach to multipart entities; however, if you attach something to a singlepart (like attaching a GIF to a text message), the singlepart will be coerced into a multipart automatically. =cut sub attach { my $self = shift; $self->make_multipart; $self->add_part(ref($self)->build(@_, Top=>0)); } #------------------------------ =item build PARAMHASH I A quick-and-easy catch-all way to create an entity. Use it like this to build a "normal" single-part entity: $ent = MIME::Entity->build(Type => "image/gif", Encoding => "base64", Path => "/path/to/xyz12345.gif", Filename => "saveme.gif", Disposition => "attachment"); And like this to build a "multipart" entity: $ent = MIME::Entity->build(Type => "multipart/mixed", Boundary => "---1234567"); A minimal MIME header will be created. If you want to add or modify any header fields afterwards, you can of course do so via the underlying head object... but hey, there's now a prettier syntax! $ent = MIME::Entity->build(Type =>"multipart/mixed", From => $myaddr, Subject => "Hi!", 'X-Certified' => ['SINED', 'SEELED', 'DELIVERED']); Normally, an C header field is output which contains this toolkit's name and version (plus this module's RCS version). This will allow any bad MIME we generate to be traced back to us. You can of course overwrite that header with your own: $ent = MIME::Entity->build(Type => "multipart/mixed", 'X-Mailer' => "myprog 1.1"); Or remove it entirely: $ent = MIME::Entity->build(Type => "multipart/mixed", 'X-Mailer' => undef); OK, enough hype. The parameters are: =over 4 =item (FIELDNAME) Any field you want placed in the message header, taken from the standard list of header fields (you don't need to worry about case): Bcc Encrypted Received Sender Cc From References Subject Comments Keywords Reply-To To Content-* Message-ID Resent-* X-* Date MIME-Version Return-Path Organization To give experienced users some veto power, these fields will be set I the ones I set... so be careful: I (like C) unless you know what you're doing! To specify a fieldname that's I in the above list, even one that's identical to an option below, just give it with a trailing C<":">, like C<"My-field:">. When in doubt, that I signals a mail field (and it sort of looks like one too). =item Boundary I The boundary string. As per RFC-2046, it must consist only of the characters C<[0-9a-zA-Z'()+_,-./:=?]> and space (you'll be warned, and your boundary will be ignored, if this is not the case). If you omit this, a random string will be chosen... which is probably safer. =item Charset I The character set. =item Data I An alternative to Path (q.v.): the actual data, either as a scalar or an array reference (whose elements are joined together to make the actual scalar). The body is opened on the data using MIME::Body::InCore. Note that for text parts, the Data scalar or array is assumed to be encoded in a suitable character encoding (as if by C) rather than a native Perl string. The encoding you use must, of course, match the C option of the C header. =item Description I The text of the content-description. If you don't specify it, the field is not put in the header. =item Disposition I The basic content-disposition (C<"attachment"> or C<"inline">). If you don't specify it, it defaults to "inline" for backwards compatibility. I =item Encoding I The content-transfer-encoding. If you don't specify it, a reasonable default is put in. You can also give the special value '-SUGGEST', to have it chosen for you in a heavy-duty fashion which scans the data itself. =item Filename I The recommended filename. Overrides any name extracted from C. The information is stored both the deprecated (content-type) and preferred (content-disposition) locations. If you explicitly want to I a recommended filename (even when Path is used), supply this as empty or undef. =item Id I Set the content-id. =item Path I The path to the file to attach. The body is opened on that file using MIME::Body::File. =item Top I Is this a top-level entity? If so, it must sport a MIME-Version. The default is true. (NB: look at how C uses it.) =item Type I The basic content-type (C<"text/plain">, etc.). If you don't specify it, it defaults to C<"text/plain"> as per RFC 2045. I =back =cut sub build { my ($self, @paramlist) = @_; my %params = @paramlist; my ($field, $filename, $boundary); ### Create a new entity, if needed: ref($self) or $self = $self->new; ### GET INFO... ### Get sundry field: my $type = $params{Type} || 'text/plain'; my $charset = $params{Charset}; my $is_multipart = ($type =~ m{^multipart/}i); my $encoding = $params{Encoding} || ''; my $desc = $params{Description}; my $top = exists($params{Top}) ? $params{Top} : 1; my $disposition = $params{Disposition} || 'inline'; my $id = $params{Id}; ### Get recommended filename, allowing explicit no-value value: my ($path_fname) = (($params{Path}||'') =~ m{([^/]+)\Z}); $filename = (exists($params{Filename}) ? $params{Filename} : $path_fname); $filename = undef if (defined($filename) and $filename eq ''); ### Type-check sanity: if ($type =~ m{^(multipart/|message/(rfc822|partial|external-body|delivery-status|disposition-notification|feedback-report)$)}i) { ($encoding =~ /^(|7bit|8bit|binary|-suggest)$/i) or croak "can't have encoding $encoding for message type $type!"; } ### Multipart or not? Do sanity check and fixup: if ($is_multipart) { ### multipart... ### Get any supplied boundary, and check it: if (defined($boundary = $params{Boundary})) { ### they gave us one... if ($boundary eq '') { whine "empty string not a legal boundary: I'm ignoring it"; $boundary = undef; } elsif ($boundary =~ m{[^0-9a-zA-Z_\'\(\)\+\,\.\/\:\=\?\- ]}) { whine "boundary ignored: illegal characters ($boundary)"; $boundary = undef; } } ### If we have to roll our own boundary, do so: defined($boundary) or $boundary = make_boundary(); } else { ### single part... ### Create body: if ($params{Path}) { $self->bodyhandle(new MIME::Body::File $params{Path}); } elsif (defined($params{Data})) { $self->bodyhandle(new MIME::Body::InCore $params{Data}); } else { die "can't build entity: no body, and not multipart\n"; } ### Check whether we need to binmode(): [Steve Kilbane] $self->bodyhandle->binmode(1) unless textual_type($type); } ### MAKE HEAD... ### Create head: my $head = new MIME::Head; $self->head($head); $head->modify(1); ### Add content-type field: $field = new Mail::Field 'Content_type'; ### not a typo :-( $field->type($type); $field->charset($charset) if $charset; $field->name($filename) if defined($filename); $field->boundary($boundary) if defined($boundary); $head->replace('Content-type', $field->stringify); ### Now that both body and content-type are available, we can suggest ### content-transfer-encoding (if desired); if (!$encoding) { $encoding = $self->suggest_encoding_lite; } elsif (lc($encoding) eq '-suggest') { $encoding = $self->suggest_encoding; } ### Add content-disposition field (if not multipart): unless ($is_multipart) { $field = new Mail::Field 'Content_disposition'; ### not a typo :-( $field->type($disposition); $field->filename($filename) if defined($filename); $head->replace('Content-disposition', $field->stringify); } ### Add other MIME fields: $head->replace('Content-transfer-encoding', $encoding) if $encoding; $head->replace('Content-description', $desc) if $desc; # Content-Id value should be surrounded by < >, but versions before 5.428 # did not do this. So, we check, and add if the caller has not done so # already. if( defined $id ) { if( $id !~ /^<.*>$/ ) { $id = "<$id>"; } $head->replace('Content-id', $id); } $head->replace('MIME-Version', '1.0') if $top; ### Add the X-Mailer field, if top level (use default value if not given): $top and $head->replace('X-Mailer', "MIME-tools ".(MIME::Tools->version). " (Entity " .($VERSION).")"); ### Add remaining user-specified fields, if any: while (@paramlist) { my ($tag, $value) = (shift @paramlist, shift @paramlist); ### Get fieldname, if that's what it is: if ($tag =~ /^-(.*)/s) { $tag = lc($1) } ### old style, b.c. elsif ($tag =~ /(.*):$/s ) { $tag = lc($1) } ### new style elsif (known_field(lc($tag))) { 1 } ### known field else { next; } ### not a field ### Clear head, get list of values, and add them: $head->delete($tag); foreach $value (ref($value) ? @$value : ($value)) { (defined($value) && ($value ne '')) or next; $head->add($tag, $value); } } ### Done! $self; } #------------------------------ =item dup I Duplicate the entity. Does a deep, recursive copy, I external data in bodyhandles is I copied to new files! Changing the data in one entity's data file, or purging that entity, I affect its duplicate. Entities with in-core data probably need not worry. =cut sub dup { my $self = shift; local($_); ### Self (this will also dup the header): my $dup = bless $self->SUPER::dup(), ref($self); ### Any simple inst vars: foreach (keys %$self) {$dup->{$_} = $self->{$_} unless ref($self->{$_})}; ### Bodyhandle: $dup->bodyhandle($self->bodyhandle ? $self->bodyhandle->dup : undef); ### Preamble and epilogue: foreach (qw(ME_Preamble ME_Epilogue)) { $dup->{$_} = [@{$self->{$_}}] if $self->{$_}; } ### Parts: $dup->{ME_Parts} = []; foreach (@{$self->{ME_Parts}}) { push @{$dup->{ME_Parts}}, $_->dup } ### Done! $dup; } =back =cut #============================== =head2 Access =over 4 =cut #------------------------------ =item body [VALUE] I Get the I (transport-ready) body, as an array of lines. Returns an array reference. Each array entry is a newline-terminated line. This is a read-only data structure: changing its contents will have no effect. Its contents are identical to what is printed by L. Provided for compatibility with Mail::Internet, so that methods like C will work. Note however that if VALUE is given, a fatal exception is thrown, since you cannot use this method to I the lines of the encoded message. If you want the raw (unencoded) body data, use the L method to get and use a MIME::Body. The content-type of the entity will tell you whether that body is best read as text (via getline()) or raw data (via read()). =cut sub body { my ($self, $value) = @_; my $boundary_delimiter = $MIME::Entity::BOUNDARY_DELIMITER || "\n"; if (@_ > 1) { ### setting body line(s)... croak "you cannot use body() to set the encoded contents\n"; } else { my $output = ''; my $fh = IO::File->new(\$output, '>:') or croak("Cannot open in-memory file: $!"); $self->print_body($fh); close($fh); my @ary = split(/\n/, $output); # Each line needs the terminating newline @ary = map { "$_$boundary_delimiter" } @ary; return \@ary; } } #------------------------------ =item bodyhandle [VALUE] I Get or set an abstract object representing the body of the message. The body holds the decoded message data. B An entity will have either a body or parts: not both. This method will I return an object if this entity can have a body; otherwise, it will return undefined. Whether-or-not a given entity can have a body is determined by (1) its content type, and (2) whether-or-not the parser was told to extract nested messages: Type: | Extract nested? | bodyhandle() | parts() ----------------------------------------------------------------------- multipart/* | - | undef | 0 or more MIME::Entity message/* | true | undef | 0 or 1 MIME::Entity message/* | false | MIME::Body | empty list (other) | - | MIME::Body | empty list If C I given, the current bodyhandle is returned, or undef if the entity cannot have a body. If C I given, the bodyhandle is set to the new value, and the previous value is returned. See L for more info. =cut sub bodyhandle { my ($self, $newvalue) = @_; my $value = $self->{ME_Bodyhandle}; $self->{ME_Bodyhandle} = $newvalue if (@_ > 1); $value; } #------------------------------ =item effective_type [MIMETYPE] I Set/get the I MIME type of this entity. This is I identical to the actual (or defaulted) MIME type, but in some cases it differs. For example, from RFC-2045: Any entity with an unrecognized Content-Transfer-Encoding must be treated as if it has a Content-Type of "application/octet-stream", regardless of what the Content-Type header field actually says. Why? because if we can't decode the message, then we have to take the bytes as-is, in their (unrecognized) encoded form. So the message ceases to be a "text/foobar" and becomes a bunch of undecipherable bytes -- in other words, an "application/octet-stream". Such an entity, if parsed, would have its effective_type() set to C<"application/octet_stream">, although the mime_type() and the contents of the header would remain the same. If there is no effective type, the method just returns what mime_type() would. B the effective type is "sticky"; once set, that effective_type() will always be returned even if the conditions that necessitated setting the effective type become no longer true. =cut sub effective_type { my $self = shift; $self->{ME_EffType} = shift if @_; return ($self->{ME_EffType} ? lc($self->{ME_EffType}) : $self->mime_type); } #------------------------------ =item epilogue [LINES] I Get/set the text of the epilogue, as an array of newline-terminated LINES. Returns a reference to the array of lines, or undef if no epilogue exists. If there is a epilogue, it is output when printing this entity; otherwise, a default epilogue is used. Setting the epilogue to undef (not []!) causes it to fallback to the default. =cut sub epilogue { my ($self, $lines) = @_; $self->{ME_Epilogue} = $lines if @_ > 1; $self->{ME_Epilogue}; } #------------------------------ =item head [VALUE] I Get/set the head. If there is no VALUE given, returns the current head. If none exists, an empty instance of MIME::Head is created, set, and returned. B This is a patch over a problem in Mail::Internet, which doesn't provide a method for setting the head to some given object. =cut sub head { my ($self, $value) = @_; (@_ > 1) and $self->{'mail_inet_head'} = $value; $self->{'mail_inet_head'} ||= new MIME::Head; ### KLUDGE! } #------------------------------ =item is_multipart I Does this entity's effective MIME type indicate that it's a multipart entity? Returns undef (false) if the answer couldn't be determined, 0 (false) if it was determined to be false, and true otherwise. Note that this says nothing about whether or not parts were extracted. NOTE: we switched to effective_type so that multiparts with bad or missing boundaries could be coerced to an effective type of C. =cut sub is_multipart { my $self = shift; $self->head or return undef; ### no head, so no MIME type! my ($type, $subtype) = split('/', $self->effective_type); (($type eq 'multipart') ? 1 : 0); } #------------------------------ =item mime_type I A purely-for-convenience method. This simply relays the request to the associated MIME::Head object. If there is no head, returns undef in a scalar context and the empty array in a list context. B consider using effective_type() instead, especially if you obtained the entity from a MIME::Parser. =cut sub mime_type { my $self = shift; $self->head or return (wantarray ? () : undef); $self->head->mime_type; } #------------------------------ =item open READWRITE I A purely-for-convenience method. This simply relays the request to the associated MIME::Body object (see MIME::Body::open()). READWRITE is either 'r' (open for read) or 'w' (open for write). If there is no body, returns false. =cut sub open { my $self = shift; $self->bodyhandle and $self->bodyhandle->open(@_); } #------------------------------ =item parts =item parts INDEX =item parts ARRAYREF I Return the MIME::Entity objects which are the sub parts of this entity (if any). I returns the array of all sub parts, returning the empty array if there are none (e.g., if this is a single part message, or a degenerate multipart). In a scalar context, this returns you the number of parts. I return the INDEXed part, or undef if it doesn't exist. I then this method I the parts to a copy of that array, and returns the parts. This can be used to delete parts, as follows: ### Delete some parts of a multipart message: $msg->parts([ grep { keep_part($_) } $msg->parts ]); B for multipart messages, the preamble and epilogue are I considered parts. If you need them, use the C and C methods. B there are ways of parsing with a MIME::Parser which cause certain message parts (such as those of type C) to be "reparsed" into pseudo-multipart entities. You should read the documentation for those options carefully: it I possible for a diddled entity to not be multipart, but still have parts attached to it! See L for a discussion of parts vs. bodies. =cut sub parts { my $self = shift; ref($_[0]) and return @{$self->{ME_Parts} = [@{$_[0]}]}; ### set the parts (@_ ? $self->{ME_Parts}[$_[0]] : @{$self->{ME_Parts}}); } #------------------------------ =item parts_DFS I Return the list of all MIME::Entity objects included in the entity, starting with the entity itself, in depth-first-search order. If the entity has no parts, it alone will be returned. I =cut sub parts_DFS { my $self = shift; return ($self, map { $_->parts_DFS } $self->parts); } #------------------------------ =item preamble [LINES] I Get/set the text of the preamble, as an array of newline-terminated LINES. Returns a reference to the array of lines, or undef if no preamble exists (e.g., if this is a single-part entity). If there is a preamble, it is output when printing this entity; otherwise, a default preamble is used. Setting the preamble to undef (not []!) causes it to fallback to the default. =cut sub preamble { my ($self, $lines) = @_; $self->{ME_Preamble} = $lines if @_ > 1; $self->{ME_Preamble}; } =back =cut #============================== =head2 Manipulation =over 4 =cut #------------------------------ =item make_multipart [SUBTYPE], OPTSHASH... I Force the entity to be a multipart, if it isn't already. We do this by replacing the original [singlepart] entity with a new multipart that has the same non-MIME headers ("From", "Subject", etc.), but all-new MIME headers ("Content-type", etc.). We then create a copy of the original singlepart, I the non-MIME headers from that, and make it a part of the new multipart. So this: From: me To: you Content-type: text/plain Content-length: 12 Hello there! Becomes something like this: From: me To: you Content-type: multipart/mixed; boundary="----abc----" ------abc---- Content-type: text/plain Content-length: 12 Hello there! ------abc------ The actual type of the new top-level multipart will be "multipart/SUBTYPE" (default SUBTYPE is "mixed"). Returns 'DONE' if we really did inflate a singlepart to a multipart. Returns 'ALREADY' (and does nothing) if entity is I multipart and Force was not chosen. If OPTSHASH contains Force=>1, then we I bump the top-level's content and content-headers down to a subpart of this entity, even if this entity is already a multipart. This is apparently of use to people who are tweaking messages after parsing them. =cut sub make_multipart { my ($self, $subtype, %opts) = @_; my $tag; $subtype ||= 'mixed'; my $force = $opts{Force}; ### Trap for simple case: already a multipart? return 'ALREADY' if ($self->is_multipart and !$force); ### Rip out our guts, and spew them into our future part: my $part = bless {%$self}, ref($self); ### part is a shallow copy %$self = (); ### lobotomize ourselves! $self->head($part->head->dup); ### dup the header ### Remove content headers from top-level, and set it up as a multipart: foreach $tag (grep {/^content-/i} $self->head->tags) { $self->head->delete($tag); } $self->head->mime_attr('Content-type' => "multipart/$subtype"); $self->head->mime_attr('Content-type.boundary' => make_boundary()); ### Remove NON-content headers from the part: foreach $tag (grep {!/^content-/i} $part->head->tags) { $part->head->delete($tag); } ### Add the [sole] part: $self->{ME_Parts} = []; $self->add_part($part); 'DONE'; } #------------------------------ =item make_singlepart I If the entity is a multipart message with one part, this tries hard to rewrite it as a singlepart, by replacing the content (and content headers) of the top level with those of the part. Also crunches 0-part multiparts into singleparts. Returns 'DONE' if we really did collapse a multipart to a singlepart. Returns 'ALREADY' (and does nothing) if entity is already a singlepart. Returns '0' (and does nothing) if it can't be made into a singlepart. =cut sub make_singlepart { my $self = shift; ### Trap for simple cases: return 'ALREADY' if !$self->is_multipart; ### already a singlepart? return '0' if ($self->parts > 1); ### can this even be done? # Get rid of all our existing content info my $tag; foreach $tag (grep {/^content-/i} $self->head->tags) { $self->head->delete($tag); } if ($self->parts == 1) { ### one part my $part = $self->parts(0); ### Populate ourselves with any content info from the part: foreach $tag (grep {/^content-/i} $part->head->tags) { foreach ($part->head->get($tag)) { $self->head->add($tag, $_) } } ### Save reconstructed header, replace our guts, and restore header: my $new_head = $self->head; %$self = %$part; ### shallow copy is ok! $self->head($new_head); ### One more thing: the part *may* have been a multi with 0 or 1 parts! return $self->make_singlepart(@_) if $self->is_multipart; } else { ### no parts! $self->head->mime_attr('Content-type'=>'text/plain'); ### simple } 'DONE'; } #------------------------------ =item purge I Recursively purge (e.g., unlink) all external (e.g., on-disk) body parts in this message. See MIME::Body::purge() for details. B this does I delete the directories that those body parts are contained in; only the actual message data files are deleted. This is because some parsers may be customized to create intermediate directories while others are not, and it's impossible for this class to know what directories are safe to remove. Only your application program truly knows that. B one good way is to use C, and then do this before parsing your next message: $parser->filer->purge(); I wouldn't attempt to read those body files after you do this, for obvious reasons. As of MIME-tools 4.x, each body's path I undefined after this operation. I warned you I might do this; truly I did. I =cut sub purge { my $self = shift; $self->bodyhandle and $self->bodyhandle->purge; ### purge me foreach ($self->parts) { $_->purge } ### recurse 1; } #------------------------------ # # _do_remove_sig # # Private. Remove a signature within NLINES lines from the end of BODY. # The signature must be flagged by a line containing only "-- ". sub _do_remove_sig { my ($body, $nlines) = @_; $nlines ||= 10; my $i = 0; my $line = int(@$body) || return; while ($i++ < $nlines and $line--) { if ($body->[$line] =~ /\A--[ \040][\r\n]+\Z/) { $#{$body} = $line-1; return; } } } #------------------------------ =item remove_sig [NLINES] I Attempts to remove a user's signature from the body of a message. It does this by looking for a line matching C within the last C of the message. If found then that line and all lines after it will be removed. If C is not given, a default value of 10 will be used. This would be of most use in auto-reply scripts. For MIME entity, this method is reasonably cautious: it will only attempt to un-sign a message with a content-type of C. If you send remove_sig() to a multipart entity, it will relay it to the first part (the others usually being the "attachments"). B currently slurps the whole message-part into core as an array of lines, so you probably don't want to use this on extremely long messages. Returns truth on success, false on error. =cut sub remove_sig { my $self = shift; my $nlines = shift; # If multipart, we only attempt to remove the sig from the first # part. This is usually a good assumption for multipart/mixed, but # may not always be correct. It is also possibly incorrect on # multipart/alternative (both may have sigs). if( $self->is_multipart ) { my $first_part = $self->parts(0); if( $first_part ) { return $first_part->remove_sig(@_); } return undef; } ### Refuse non-textual unless forced: textual_type($self->head->mime_type) or return error "I won't un-sign a non-text message unless I'm forced"; ### Get body data, as an array of newline-terminated lines: $self->bodyhandle or return undef; my @body = $self->bodyhandle->as_lines; ### Nuke sig: _do_remove_sig(\@body, $nlines); ### Output data back into body: my $io = $self->bodyhandle->open("w"); foreach (@body) { $io->print($_) }; ### body data $io->close; ### Done! 1; } #------------------------------ =item sign PARAMHASH I Append a signature to the message. The params are: =over 4 =item Attach Instead of appending the text, add it to the message as an attachment. The disposition will be C, and the description will indicate that it is a signature. The default behavior is to append the signature to the text of the message (or the text of its first part if multipart). I =item File Use the contents of this file as the signature. Fatal error if it can't be read. I =item Force Sign it even if the content-type isn't C. Useful for non-standard types like C, but be careful! I =item Remove Normally, we attempt to strip out any existing signature. If true, this gives us the NLINES parameter of the remove_sig call. If zero but defined, tells us I to remove any existing signature. If undefined, removal is done with the default of 10 lines. I =item Signature Use this text as the signature. You can supply it as either a scalar, or as a ref to an array of newline-terminated scalars. I =back For MIME messages, this method is reasonably cautious: it will only attempt to sign a message with a content-type of C, unless C is specified. If you send this message to a multipart entity, it will relay it to the first part (the others usually being the "attachments"). B currently slurps the whole message-part into core as an array of lines, so you probably don't want to use this on extremely long messages. Returns true on success, false otherwise. =cut sub sign { my $self = shift; my %params = @_; my $io; my $boundary_delimiter = $MIME::Entity::BOUNDARY_DELIMITER || "\n"; ### If multipart and not attaching, try to sign our first part: if ($self->is_multipart and !$params{Attach}) { return $self->parts(0)->sign(@_); } ### Get signature: my $sig; if (defined($sig = $params{Signature})) { ### scalar or array $sig = (ref($sig) ? join('', @$sig) : $sig); } elsif ($params{File}) { ### file contents my $fh = IO::File->new( $params{File} ) or croak "can't open $params{File}: $!"; $sig = join('', $fh->getlines); $fh->close or croak "can't close $params{File}: $!"; } else { croak "no signature given!"; } ### Add signature to message as appropriate: if ($params{Attach}) { ### Attach .sig as new part... return $self->attach(Type => 'text/plain', Description => 'Signature', Disposition => 'inline', Encoding => '-SUGGEST', Data => $sig); } else { ### Add text of .sig to body data... ### Refuse non-textual unless forced: ($self->head->mime_type =~ m{text/}i or $params{Force}) or return error "I won't sign a non-text message unless I'm forced"; ### Get body data, as an array of newline-terminated lines: $self->bodyhandle or return undef; my @body = $self->bodyhandle->as_lines; ### Nuke any existing sig? if (!defined($params{Remove}) || ($params{Remove} > 0)) { _do_remove_sig(\@body, $params{Remove}); } ### Output data back into body, followed by signature: my $line; $io = $self->open("w") or croak("open: $!"); foreach $line (@body) { $io->print($line) }; ### body data (($body[-1]||'') =~ /\n\Z/) or $io->print($boundary_delimiter); ### ensure final \n $io->print("-- $boundary_delimiter$sig"); ### separator + sig $io->close or croak("close: $!"); return 1; ### done! } } #------------------------------ =item suggest_encoding I Based on the effective content type, return a good suggested encoding. C and C types have their bodies scanned line-by-line for 8-bit characters and long lines; lack of either means that the message is 7bit-ok. Other types are chosen independent of their body: Major type: 7bit ok? Suggested encoding: ----------------------------------------------------------- text yes 7bit text no quoted-printable message yes 7bit message no binary multipart * binary (in case some parts are bad) image, etc... * base64 =cut ### TO DO: resolve encodings of nested entities (possibly in sync_headers). sub suggest_encoding { my $self = shift; my ($type) = split '/', $self->effective_type; if (($type eq 'text') || ($type eq 'message')) { ### scan message body $self->bodyhandle || return ($self->parts ? 'binary' : '7bit'); my ($IO, $unclean); if ($IO = $self->bodyhandle->open("r")) { ### Scan message for 7bit-cleanliness local $_; while (defined($_ = $IO->getline)) { last if ($unclean = ((length($_) > 999) or /[\200-\377]/)); } ### Return '7bit' if clean; try and encode if not... ### Note that encodings are not permitted for messages! return ($unclean ? (($type eq 'message') ? 'binary' : 'quoted-printable') : '7bit'); } } else { return ($type eq 'multipart') ? 'binary' : 'base64'; } } sub suggest_encoding_lite { my $self = shift; my ($type) = split '/', $self->effective_type; return (($type =~ /^(text|message|multipart)$/) ? 'binary' : 'base64'); } #------------------------------ =item sync_headers OPTIONS I This method does a variety of activities which ensure that the MIME headers of an entity "tree" are in-synch with the body parts they describe. It can be as expensive an operation as printing if it involves pre-encoding the body parts; however, the aim is to produce fairly clean MIME. B The OPTIONS is a hash, which describes what is to be done. =over 4 =item Length One of the "official unofficial" MIME fields is "Content-Length". Normally, one doesn't care a whit about this field; however, if you are preparing output destined for HTTP, you may. The value of this option dictates what will be done: B means to set a C field for every non-multipart part in the entity, and to blank that field out for every multipart part in the entity. B means that C fields will all be blanked out. This is fast, painless, and safe. B (the default) means to take no action. =item Nonstandard Any header field beginning with "Content-" is, according to the RFC, a MIME field. However, some are non-standard, and may cause problems with certain MIME readers which interpret them in different ways. B means that all such fields will be blanked out. This is done I the B option (q.v.) is examined and acted upon. B (the default) means to take no action. =back Returns a true value if everything went okay, a false value otherwise. =cut sub sync_headers { my $self = shift; my $opts = ((int(@_) % 2 == 0) ? {@_} : shift); my $ENCBODY; ### keep it around until done! ### Get options: my $o_nonstandard = ($opts->{Nonstandard} || 0); my $o_length = ($opts->{Length} || 0); ### Get head: my $head = $self->head; ### What to do with "nonstandard" MIME fields? if ($o_nonstandard eq 'ERASE') { ### Erase them... my $tag; foreach $tag ($head->tags()) { if (($tag =~ /\AContent-/i) && ($tag !~ /\AContent-$StandardFields\Z/io)) { $head->delete($tag); } } } ### What to do with the "Content-Length" MIME field? if ($o_length eq 'COMPUTE') { ### Compute the content length... my $content_length = ''; ### We don't have content-lengths in multiparts... if ($self->is_multipart) { ### multipart... $head->delete('Content-length'); } else { ### singlepart... ### Get the encoded body, if we don't have it already: unless ($ENCBODY) { $ENCBODY = tmpopen() || die "can't open tmpfile"; $self->print_body($ENCBODY); ### write encoded to tmpfile } ### Analyse it: $ENCBODY->seek(0,2); ### fast-forward $content_length = $ENCBODY->tell; ### get encoded length $ENCBODY->seek(0,0); ### rewind ### Remember: $self->head->replace('Content-length', $content_length); } } elsif ($o_length eq 'ERASE') { ### Erase the content-length... $head->delete('Content-length'); } ### Done with everything for us! undef($ENCBODY); ### Recurse: my $part; foreach $part ($self->parts) { $part->sync_headers($opts) or return undef } 1; } #------------------------------ =item tidy_body I Currently unimplemented for MIME messages. Does nothing, returns false. =cut sub tidy_body { usage "MIME::Entity::tidy_body currently does nothing"; 0; } =back =cut #============================== =head2 Output =over 4 =cut #------------------------------ =item dump_skeleton [FILEHANDLE] I Dump the skeleton of the entity to the given FILEHANDLE, or to the currently-selected one if none given. Each entity is output with an appropriate indentation level, the following selection of attributes: Content-type: multipart/mixed Effective-type: multipart/mixed Body-file: NONE Subject: Hey there! Num-parts: 2 This is really just useful for debugging purposes; I make no guarantees about the consistency of the output format over time. =cut sub dump_skeleton { my ($self, $fh, $indent) = @_; $fh or $fh = select; defined($indent) or $indent = 0; my $ind = ' ' x $indent; my $part; no strict 'refs'; ### The content type: print $fh $ind,"Content-type: ", ($self->mime_type||'UNKNOWN'),"\n"; print $fh $ind,"Effective-type: ", ($self->effective_type||'UNKNOWN'),"\n"; ### The name of the file containing the body (if any!): my $path = ($self->bodyhandle ? $self->bodyhandle->path : undef); print $fh $ind, "Body-file: ", ($path || 'NONE'), "\n"; ### The recommended file name (thanks to Allen Campbell): my $filename = $self->head->recommended_filename; print $fh $ind, "Recommended-filename: ", $filename, "\n" if ($filename); ### The subject (note: already a newline if 2.x!) my $subj = $self->head->get('subject',0); defined($subj) or $subj = ''; chomp($subj); print $fh $ind, "Subject: $subj\n" if $subj; ### The parts: my @parts = $self->parts; print $fh $ind, "Num-parts: ", int(@parts), "\n" if @parts; print $fh $ind, "--\n"; foreach $part (@parts) { $part->dump_skeleton($fh, $indent+1); } } #------------------------------ =item print [OUTSTREAM] I Print the entity to the given OUTSTREAM, or to the currently-selected filehandle if none given. OUTSTREAM can be a filehandle, or any object that responds to a print() message. The entity is output as a valid MIME stream! This means that the header is always output first, and the body data (if any) will be encoded if the header says that it should be. For example, your output may look like this: Subject: Greetings Content-transfer-encoding: base64 SGkgdGhlcmUhCkJ5ZSB0aGVyZSEK I the preamble, parts, and epilogue are all output with appropriate boundaries separating each. Any bodyhandle is ignored: Content-type: multipart/mixed; boundary="*----*" Content-transfer-encoding: 7bit [Preamble] --*----* [Entity: Part 0] --*----* [Entity: Part 1] --*----*-- [Epilogue] I then we're looking at a normal singlepart entity: the body is output according to the encoding specified by the header. If no body exists, a warning is output and the body is treated as empty: Content-type: image/gif Content-transfer-encoding: base64 [Encoded body] I then we're probably looking at a "re-parsed" singlepart, usually one of type C (you can get entities like this if you set the C option on the parser to true). In this case, the parts are output with single blank lines separating each, and any bodyhandle is ignored: Content-type: message/rfc822 Content-transfer-encoding: 7bit [Entity: Part 0] [Entity: Part 1] In all cases, when outputting a "part" of the entity, this method is invoked recursively. B the output is very likely I going to be identical to any input you parsed to get this entity. If you're building some sort of email handler, it's up to you to save this information. =cut use Symbol; sub print { my ($self, $out) = @_; my $boundary_delimiter = $MIME::Entity::BOUNDARY_DELIMITER || "\n"; $out = select if @_ < 2; $out = Symbol::qualify($out,scalar(caller)) unless ref($out); $self->print_header($out); ### the header $out->print($boundary_delimiter); $self->print_body($out); ### the "stuff after the header" } #------------------------------ =item print_body [OUTSTREAM] I Print the body of the entity to the given OUTSTREAM, or to the currently-selected filehandle if none given. OUTSTREAM can be a filehandle, or any object that responds to a print() message. The body is output for inclusion in a valid MIME stream; this means that the body data will be encoded if the header says that it should be. B by "body", we mean "the stuff following the header". A printed multipart body includes the printed representations of its subparts. B The body is I in an un-encoded form; however, the idea is that the transfer encoding is used to determine how it should be I This means that the C method is always guaranteed to get you a sendmail-ready stream whose body is consistent with its head. If you want the I to be output, you can either read it from the bodyhandle yourself, or use: $ent->bodyhandle->print($outstream); which uses read() calls to extract the information, and thus will work with both text and binary bodies. B Please supply an OUTSTREAM. This override method differs from Mail::Internet's behavior, which outputs to the STDOUT if no filehandle is given: this may lead to confusion. =cut sub print_body { my ($self, $out) = @_; $out ||= select; my ($type) = split '/', lc($self->mime_type); ### handle by MIME type my $boundary_delimiter = $MIME::Entity::BOUNDARY_DELIMITER || "\n"; ### Multipart... if ($type eq 'multipart') { my $boundary = $self->head->multipart_boundary; ### Preamble: my $plines = $self->preamble; if (defined $plines) { # Defined, so output the preamble if it exists (avoiding additional # newline as per ticket 60931) $out->print( join('', @$plines) . $boundary_delimiter) if (@$plines > 0); } else { # Undefined, so use default preamble $out->print( join('', @$DefPreamble) . $boundary_delimiter . $boundary_delimiter ); } ### Parts: my $part; foreach $part ($self->parts) { $out->print("--$boundary$boundary_delimiter"); $part->print($out); $out->print($boundary_delimiter); ### needed for next delim/close } $out->print("--$boundary--$boundary_delimiter"); ### Epilogue: my $epilogue = join('', @{ $self->epilogue || $DefEpilogue }); if ($epilogue ne '') { $out->print($epilogue); $out->print($boundary_delimiter) if ($epilogue !~ /\n\Z/); ### be nice } } ### Singlepart type with parts... ### This makes $ent->print handle message/rfc822 bodies ### when parse_nested_messages('NEST') is on [idea by Marc Rouleau]. elsif ($self->parts) { my $need_sep = 0; my $part; foreach $part ($self->parts) { $out->print("$boundary_delimiter$boundary_delimiter") if $need_sep++; $part->print($out); } } ### Singlepart type, or no parts: output body... else { $self->bodyhandle ? $self->print_bodyhandle($out) : whine "missing body; treated as empty"; } 1; } #------------------------------ # # print_bodyhandle # # Instance method, unpublicized. Print just the bodyhandle, *encoded*. # # WARNING: $self->print_bodyhandle() != $self->bodyhandle->print()! # The former encodes, and the latter does not! # sub print_bodyhandle { my ($self, $out) = @_; $out ||= select; my $IO = $self->open("r") || die "open body: $!"; if ( $self->bodyhandle->is_encoded ) { ### Transparent mode: data is already encoded, so no ### need to encode it again my $buf; $out->print($buf) while ($IO->read($buf, 8192)); } else { ### Get the encoding, defaulting to "binary" if unsupported: my $encoding = ($self->head->mime_encoding || 'binary'); my $decoder = best MIME::Decoder $encoding; $decoder->head($self->head); ### associate with head, if any $decoder->encode($IO, $out, textual_type($self->head->mime_type) ? 1 : 0) || return error "encoding failed"; } $IO->close; 1; } #------------------------------ =item print_header [OUTSTREAM] I Output the header to the given OUTSTREAM. You really should supply the OUTSTREAM. =cut ### Inherited. #------------------------------ =item stringify I Return the entity as a string, exactly as C would print it. The body will be encoded as necessary, and will contain any subparts. You can also use C. =cut sub stringify { my ($self) = @_; my $output = ''; my $fh = IO::File->new( \$output, '>:' ) or croak("Cannot open in-memory file: $!"); $self->print($fh); $fh->close; return $output; } sub as_string { shift->stringify }; ### silent BC #------------------------------ =item stringify_body I Return the I message body as a string, exactly as C would print it. You can also use C. If you want the I body, and you are dealing with a singlepart message (like a "text/plain"), use C instead: if ($ent->bodyhandle) { $unencoded_data = $ent->bodyhandle->as_string; } else { ### this message has no body data (but it might have parts!) } =cut sub stringify_body { my ($self) = @_; my $output = ''; my $fh = IO::File->new( \$output, '>:' ) or croak("Cannot open in-memory file: $!"); $self->print_body($fh); $fh->close; return $output; } sub body_as_string { shift->stringify_body } #------------------------------ =item stringify_header I Return the header as a string, exactly as C would print it. You can also use C. =cut sub stringify_header { shift->head->stringify; } sub header_as_string { shift->stringify_header } 1; __END__ #------------------------------ =back =head1 NOTES =head2 Under the hood A B is composed of the following elements: =over 4 =item * A I, which is a reference to a MIME::Head object containing the header information. =item * A I, which is a reference to a MIME::Body object containing the decoded body data. This is only defined if the message is a "singlepart" type: application/* audio/* image/* text/* video/* =item * An array of I, where each part is a MIME::Entity object. The number of parts will only be nonzero if the content-type is I one of the "singlepart" types: message/* (should have exactly one part) multipart/* (should have one or more parts) =back =head2 The "two-body problem" MIME::Entity and Mail::Internet see message bodies differently, and this can cause confusion and some inconvenience. Sadly, I can't change the behavior of MIME::Entity without breaking lots of code already out there. But let's open up the floor for a few questions... =over 4 =item What is the difference between a "message" and an "entity"? A B is the actual data being sent or received; usually this means a stream of newline-terminated lines. An B is the representation of a message as an object. This means that you get a "message" when you print an "entity" I a filehandle, and you get an "entity" when you parse a message I a filehandle. =item What is a message body? B The portion of the printed message after the header. B The portion of the printed message after the header. =item How is a message body stored in an entity? B As an array of lines. B It depends on the content-type of the message. For "container" types (C, C), we store the contained entities as an array of "parts", accessed via the C method, where each part is a complete MIME::Entity. For "singlepart" types (C, C, etc.), the unencoded body data is referenced via a MIME::Body object, accessed via the C method: bodyhandle() parts() Content-type: returns: returns: ------------------------------------------------------------ application/* MIME::Body empty audio/* MIME::Body empty image/* MIME::Body empty message/* undef MIME::Entity list (usually 1) multipart/* undef MIME::Entity list (usually >0) text/* MIME::Body empty video/* MIME::Body empty x-*/* MIME::Body empty As a special case, C is currently ambiguous: depending on the parser, a C might be treated as a singlepart, with a MIME::Body and no parts. Use bodyhandle() as the final arbiter. =item What does the body() method return? B As an array of lines, ready for sending. B As an array of lines, ready for sending. =item What's the best way to get at the body data? B Use the body() method. B Depends on what you want... the I data (as it is transported), or the I data? Keep reading... =item How do I get the "encoded" body data? B Use the body() method. B Use the body() method. You can also use: $entity->print_body() $entity->stringify_body() ### a.k.a. $entity->body_as_string() =item How do I get the "unencoded" body data? B Use the body() method. B Use the I method! If bodyhandle() method returns true, then that value is a L which can be used to access the data via its open() method. If bodyhandle() method returns an undefined value, then the entity is probably a "container" that has no real body data of its own (e.g., a "multipart" message): in this case, you should access the components via the parts() method. Like this: if ($bh = $entity->bodyhandle) { $io = $bh->open; ...access unencoded data via $io->getline or $io->read... $io->close; } else { foreach my $part (@parts) { ...do something with the part... } } You can also use: if ($bh = $entity->bodyhandle) { $unencoded_data = $bh->as_string; } else { ...do stuff with the parts... } =item What does the body() method return? B The transport-encoded message body, as an array of lines. B The transport-encoded message body, as an array of lines. =item What does print_body() print? B Exactly what body() would return to you. B Exactly what body() would return to you. =item Say I have an entity which might be either singlepart or multipart. How do I print out just "the stuff after the header"? B Use print_body(). B Use print_body(). =item Why is MIME::Entity so different from Mail::Internet? Because MIME streams are expected to have non-textual data... possibly, quite a lot of it, such as a tar file. Because MIME messages can consist of multiple parts, which are most-easily manipulated as MIME::Entity objects themselves. Because in the simpler world of Mail::Internet, the data of a message and its printed representation are I... and in the MIME world, they're not. Because parsing multipart bodies on-the-fly, or formatting multipart bodies for output, is a non-trivial task. =item This is confusing. Can the two classes be made more compatible? Not easily; their implementations are necessarily quite different. Mail::Internet is a simple, efficient way of dealing with a "black box" mail message... one whose internal data you don't care much about. MIME::Entity, in contrast, cares I about the message contents: that's its job! =back =head2 Design issues =over 4 =item Some things just can't be ignored In multipart messages, the I<"preamble"> is the portion that precedes the first encapsulation boundary, and the I<"epilogue"> is the portion that follows the last encapsulation boundary. According to RFC 2046: There appears to be room for additional information prior to the first encapsulation boundary and following the final boundary. These areas should generally be left blank, and implementations must ignore anything that appears before the first boundary or after the last one. NOTE: These "preamble" and "epilogue" areas are generally not used because of the lack of proper typing of these parts and the lack of clear semantics for handling these areas at gateways, particularly X.400 gateways. However, rather than leaving the preamble area blank, many MIME implementations have found this to be a convenient place to insert an explanatory note for recipients who read the message with pre-MIME software, since such notes will be ignored by MIME-compliant software. In the world of standards-and-practices, that's the standard. Now for the practice: I. Since we have to parse over the stuff I, in the future I I allow the parser option of creating special MIME::Entity objects for the preamble and epilogue, with bogus MIME::Head objects. For now, though, we're MIME-compliant, so I probably won't change how we work. =back =head1 SEE ALSO L, L, L, L, L =head1 AUTHOR Eryq (F), ZeeGee Software Inc (F). Dianne Skoll (dianne@skoll.ca) All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut MIME-tools-5.515/lib/MIME/Head.pm0000644000175000017500000006604514612222720014235 0ustar dfsdfspackage MIME::Head; use MIME::WordDecoder; =head1 NAME MIME::Head - MIME message header (a subclass of Mail::Header) =head1 SYNOPSIS Before reading further, you should see L to make sure that you understand where this module fits into the grand scheme of things. Go on, do it now. I'll wait. Ready? Ok... =head2 Construction ### Create a new, empty header, and populate it manually: $head = MIME::Head->new; $head->replace('content-type', 'text/plain; charset=US-ASCII'); $head->replace('content-length', $len); ### Parse a new header from a filehandle: $head = MIME::Head->read(\*STDIN); ### Parse a new header from a file, or a readable pipe: $testhead = MIME::Head->from_file("/tmp/test.hdr"); $a_b_head = MIME::Head->from_file("cat a.hdr b.hdr |"); =head2 Output ### Output to filehandle: $head->print(\*STDOUT); ### Output as string: print STDOUT $head->as_string; print STDOUT $head->stringify; =head2 Getting field contents ### Is this a reply? $is_reply = 1 if ($head->get('Subject') =~ /^Re: /); ### Get receipt information: print "Last received from: ", $head->get('Received', 0); @all_received = $head->get('Received'); ### Print the subject, or the empty string if none: print "Subject: ", $head->get('Subject',0); ### Too many hops? Count 'em and see! if ($head->count('Received') > 5) { ... ### Test whether a given field exists warn "missing subject!" if (! $head->count('subject')); =head2 Setting field contents ### Declare this to be an HTML header: $head->replace('Content-type', 'text/html'); =head2 Manipulating field contents ### Get rid of internal newlines in fields: $head->unfold; ### Decode any Q- or B-encoded-text in fields (DEPRECATED): $head->decode; =head2 Getting high-level MIME information ### Get/set a given MIME attribute: unless ($charset = $head->mime_attr('content-type.charset')) { $head->mime_attr("content-type.charset" => "US-ASCII"); } ### The content type (e.g., "text/html"): $mime_type = $head->mime_type; ### The content transfer encoding (e.g., "quoted-printable"): $mime_encoding = $head->mime_encoding; ### The recommended name when extracted: $file_name = $head->recommended_filename; ### The boundary text, for multipart messages: $boundary = $head->multipart_boundary; =head1 DESCRIPTION A class for parsing in and manipulating RFC-822 message headers, with some methods geared towards standard (and not so standard) MIME fields as specified in the various I RFCs (starting with RFC 2045) =head1 PUBLIC INTERFACE =cut #------------------------------ require 5.002; ### Pragmas: use strict; use vars qw($VERSION @ISA @EXPORT_OK); ### System modules: use IO::File; ### Other modules: use Mail::Header 1.09 (); use Mail::Field 1.05 (); ### Kit modules: use MIME::Words qw(:all); use MIME::Tools qw(:config :msgs); use MIME::Field::ParamVal; use MIME::Field::ConTraEnc; use MIME::Field::ContDisp; use MIME::Field::ContType; @ISA = qw(Mail::Header); # The presence of more than one of the following headers # in a given MIME entity could indicate an ambiguous parse # and hence a security risk my $singleton_headers = [ 'content-type', 'content-disposition', 'content-transfer-encoding', 'content-id', ]; # The presence of a duplicated parameters in one of the following # headers in a given MIME entity could indicate an ambiguous parse and # hence a security risk my $singleton_parameter_headers = [ 'content-type', 'content-disposition', ]; #------------------------------ # # Public globals... # #------------------------------ ### The package version, both in 1.23 style *and* usable by MakeMaker: $VERSION = "5.515"; ### Sanity (we put this test after our own version, for CPAN::): use Mail::Header 1.06 (); #------------------------------ =head2 Creation, input, and output =over 4 =cut #------------------------------ #------------------------------ =item new [ARG],[OPTIONS] I Creates a new header object. Arguments are the same as those in the superclass. =cut sub new { my $class = shift; bless Mail::Header->new(@_), $class; } =item ambiguous_content I Returns true if this header has any the following properties: =over 4 More than one Content-Type, Content-ID, Content-Transfer-Encoding or Content-Disposition header. A Content-Type or Content-Disposition header contains a repeated parameter. =back Messages with ambiguous content should be treated as a security risk. In particular, if MIME-tools is used in an email security tool, ambiguous messages should not be delivered to end-users. =cut sub ambiguous_content { my ($self) = @_; foreach my $hdr (@$singleton_headers) { if ($self->count($hdr) > 1) { return 1; } } foreach my $hdr (@$singleton_parameter_headers) { if ($self->mime_attr($hdr . '.@duplicate_parameters')) { return 1; } } return 0; } #------------------------------ =item from_file EXPR,OPTIONS I. For convenience, you can use this to parse a header object in from EXPR, which may actually be any expression that can be sent to open() so as to return a readable filehandle. The "file" will be opened, read, and then closed: ### Create a new header by parsing in a file: my $head = MIME::Head->from_file("/tmp/test.hdr"); Since this method can function as either a class constructor I an instance initializer, the above is exactly equivalent to: ### Create a new header by parsing in a file: my $head = MIME::Head->new->from_file("/tmp/test.hdr"); On success, the object will be returned; on failure, the undefined value. The OPTIONS are the same as in new(), and are passed into new() if this is invoked as a class method. B This is really just a convenience front-end onto C, provided mostly for backwards-compatibility with MIME-parser 1.0. =cut sub from_file { my ($self, $file, @opts) = @_; ### at this point, $self is inst. or class! my $class = ref($self) ? ref($self) : $self; ### Parse: my $fh = IO::File->new($file, '<') or return error("open $file: $!"); $fh->binmode() or return error("binmode $file: $!"); # we expect to have \r\n at line ends, and want to keep 'em. $self = $class->new($fh, @opts); ### now, $self is instance or undef $fh->close or return error("close $file: $!"); $self; } #------------------------------ =item read FILEHANDLE I This initializes a header object by reading it in from a FILEHANDLE, until the terminating blank line is encountered. A syntax error or end-of-stream will also halt processing. Supply this routine with a reference to a filehandle glob; e.g., C<\*STDIN>: ### Create a new header by parsing in STDIN: $head->read(\*STDIN); On success, the self object will be returned; on failure, a false value. B in the MIME world, it is perfectly legal for a header to be empty, consisting of nothing but the terminating blank line. Thus, we can't just use the formula that "no tags equals error". B as of the time of this writing, Mail::Header::read did not flag either syntax errors or unexpected end-of-file conditions (an EOF before the terminating blank line). MIME::ParserBase takes this into account. =cut sub read { my $self = shift; ### either instance or class! ref($self) or $self = $self->new; ### if used as class method, make new $self->SUPER::read(@_); } #------------------------------ =back =head2 Getting/setting fields The following are methods related to retrieving and modifying the header fields. Some are inherited from Mail::Header, but I've kept the documentation around for convenience. =over 4 =cut #------------------------------ #------------------------------ =item add TAG,TEXT,[INDEX] I Add a new occurrence of the field named TAG, given by TEXT: ### Add the trace information: $head->add('Received', 'from eryq.pr.mcs.net by gonzo.net with smtp'); Normally, the new occurrence will be I to the existing occurrences. However, if the optional INDEX argument is 0, then the new occurrence will be I. If you want to be I about appending, specify an INDEX of -1. B: this method always adds new occurrences; it doesn't overwrite any existing occurrences... so if you just want to I the value of a field (creating it if necessary), then you probably B want to use this method: consider using C instead. =cut ### Inherited. #------------------------------ # # copy # # Instance method, DEPRECATED. # Duplicate the object. # sub copy { usage "deprecated: use dup() instead."; shift->dup(@_); } #------------------------------ =item count TAG I Returns the number of occurrences of a field; in a boolean context, this tells you whether a given field exists: ### Was a "Subject:" field given? $subject_was_given = $head->count('subject'); The TAG is treated in a case-insensitive manner. This method returns some false value if the field doesn't exist, and some true value if it does. =cut ### Inherited. #------------------------------ =item decode [FORCE] I Go through all the header fields, looking for RFC 1522 / RFC 2047 style "Q" (quoted-printable, sort of) or "B" (base64) encoding, and decode them in-place. Fellow Americans, you probably don't know what the hell I'm talking about. Europeans, Russians, et al, you probably do. C<:-)>. B See L for the full reasons. If you absolutely must use it and don't like the warning, then provide a FORCE: "I_NEED_TO_FIX_THIS" Just shut up and do it. Not recommended. Provided only for those who need to keep old scripts functioning. "I_KNOW_WHAT_I_AM_DOING" Just shut up and do it. Not recommended. Provided for those who REALLY know what they are doing. B For an example, let's consider a valid email header you might get: From: =?US-ASCII?Q?Keith_Moore?= To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= CC: =?ISO-8859-1?Q?Andr=E9_?= Pirard Subject: =?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?= =?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?= =?US-ASCII?Q?.._cool!?= That basically decodes to (sorry, I can only approximate the Latin characters with 7 bit sequences /o and 'e): From: Keith Moore To: Keld J/orn Simonsen CC: Andr'e Pirard Subject: If you can read this you understand the example... cool! B currently, the decodings are done without regard to the character set: thus, the Q-encoding C<=F8> is simply translated to the octet (hexadecimal C), period. For piece-by-piece decoding of a given field, you want the array context of C. B the CRLF+SPACE separator that splits up long encoded words into shorter sequences (see the Subject: example above) gets lost when the field is unfolded, and so decoding after unfolding causes a spurious space to be left in the field. I This method returns the self object. I =cut sub decode { my $self = shift; ### Warn if necessary: my $force = shift || 0; unless (($force eq "I_NEED_TO_FIX_THIS") || ($force eq "I_KNOW_WHAT_I_AM_DOING")) { usage "decode is deprecated for safety"; } my ($tag, $i, @decoded); foreach $tag ($self->tags) { @decoded = map { scalar(decode_mimewords($_, Field=>$tag)) } $self->get_all($tag); for ($i = 0; $i < @decoded; $i++) { $self->replace($tag, $decoded[$i], $i); } } $self->{MH_Decoded} = 1; $self; } #------------------------------ =item delete TAG,[INDEX] I Delete all occurrences of the field named TAG. ### Remove some MIME information: $head->delete('MIME-Version'); $head->delete('Content-type'); =cut ### Inherited #------------------------------ # # exists # sub exists { usage "deprecated; use count() instead"; shift->count(@_); } #------------------------------ # # fields # sub fields { usage "deprecated: use tags() instead", shift->tags(@_); } #------------------------------ =item get TAG,[INDEX] I Get the contents of field TAG. If a B is given, returns the occurrence at that index, or undef if not present: ### Print the first and last 'Received:' entries (explicitly): print "First, or most recent: ", $head->get('received', 0); print "Last, or least recent: ", $head->get('received',-1); If B is given, but invoked in a B context, then INDEX simply defaults to 0: ### Get the first 'Received:' entry (implicitly): my $most_recent = $head->get('received'); If B is given, and invoked in an B context, then I occurrences of the field are returned: ### Get all 'Received:' entries: my @all_received = $head->get('received'); B: The header(s) returned may end with a newline. If you don't want this, then B the return value. =cut ### Inherited. #------------------------------ =item get_all FIELD I Returns the list of I occurrences of the field, or the empty list if the field is not present: ### How did it get here? @history = $head->get_all('Received'); B I had originally experimented with having C return all occurrences when invoked in an array context... but that causes a lot of accidents when you get careless and do stuff like this: print "\u$field: ", $head->get($field); It also made the intuitive behaviour unclear if the INDEX argument was given in an array context. So I opted for an explicit approach to asking for all occurrences. =cut sub get_all { my ($self, $tag) = @_; $self->count($tag) or return (); ### empty if doesn't exist ($self->get($tag)); } #------------------------------ # # original_text # # Instance method, DEPRECATED. # Return an approximation of the original text. # sub original_text { usage "deprecated: use stringify() instead"; shift->stringify(@_); } #------------------------------ =item print [OUTSTREAM] I Print the header out to the given OUTSTREAM, or the currently-selected filehandle if none. The OUTSTREAM may be a filehandle, or any object that responds to a print() message. The override actually lets you print to any object that responds to a print() method. This is vital for outputting MIME entities to scalars. Also, it defaults to the I filehandle if none is given (not STDOUT!), so I supply a filehandle to prevent confusion. =cut sub print { my ($self, $fh) = @_; $fh ||= select; $fh->print($self->as_string); } #------------------------------ # # set TAG,TEXT # # Instance method, DEPRECATED. # Set the field named TAG to [the single occurrence given by the TEXT. # sub set { my $self = shift; usage "deprecated: use the replace() method instead."; $self->replace(@_); } #------------------------------ =item stringify I Return the header as a string. You can also invoke it as C. If you set the variable $MIME::Entity::BOUNDARY_DELIMITER to a string, that string will be used as line-end delimiter. If it is not set, the line ending will be a newline character (\n) =cut sub stringify { my $self = shift; ### build clean header, and output... my @header = grep {defined($_) ? $_ : ()} @{$self->header}; my $header_delimiter = $MIME::Entity::BOUNDARY_DELIMITER || "\n"; join "", map { /\n$/ ? substr($_, 0, -1) . $header_delimiter : $_ . $header_delimiter } @header; } sub as_string { shift->stringify(@_) } #------------------------------ =item unfold [FIELD] I Unfold (remove newlines in) the text of all occurrences of the given FIELD. If the FIELD is omitted, I fields are unfolded. Returns the "self" object. =cut ### Inherited #------------------------------ =back =head2 MIME-specific methods All of the following methods extract information from the following fields: Content-type Content-transfer-encoding Content-disposition Be aware that they do not just return the raw contents of those fields, and in some cases they will fill in sensible (I hope) default values. Use C or C if you need to grab and process the raw field text. B some of these methods are provided both as a convenience and for backwards-compatibility only, while others (like recommended_filename()) I since they look for their value in more than one field. However, if you know that a value is restricted to a single field, you should really use the Mail::Field interface to get it. =over 4 =cut #------------------------------ #------------------------------ # # params TAG # # Instance method, DEPRECATED. # Extract parameter info from a structured field, and return # it as a hash reference. Provided for 1.0 compatibility only! # Use the new MIME::Field interface classes (subclasses of Mail::Field). sub params { my ($self, $tag) = @_; usage "deprecated: use the MIME::Field interface classes from now on!"; return MIME::Field::ParamVal->parse_params($self->get($tag,0)); } #------------------------------ =item mime_attr ATTR,[VALUE] A quick-and-easy interface to set/get the attributes in structured MIME fields: $head->mime_attr("content-type" => "text/html"); $head->mime_attr("content-type.charset" => "US-ASCII"); $head->mime_attr("content-type.name" => "homepage.html"); This would cause the final output to look something like this: Content-type: text/html; charset=US-ASCII; name="homepage.html" Note that the special empty sub-field tag indicates the anonymous first sub-field. B will cause the contents of the named subfield to be deleted: $head->mime_attr("content-type.charset" => undef); B just returns the attribute's value, or undefined if it isn't there: $type = $head->mime_attr("content-type"); ### text/html $name = $head->mime_attr("content-type.name"); ### homepage.html In all cases, the new/current value is returned. The special sub-field tag C<@duplicate_parameters> (which can never be a real tag) returns an arrayref of tags that were duplicated in the header, or C if no such tags were found. For example, given the header: Content-Type: multipart/mixed; boundary="foo"; boundary="bar" Then: $head->mime_attr('content-type.@duplicate_parameters') would return: [ 'boundary' ] A duplicate "boundary" tag should be treated as a security risk, as should duplicate Content-Type headers in a message. Since such messages cannot be parsed unambiguously, we strongly recommend that they never be delivered to end-users. =cut sub mime_attr { my ($self, $attr, $value) = @_; ### Break attribute name up: my ($tag, $subtag) = split /\./, $attr; $subtag ||= '_'; ### Set or get? my $field = MIME::Field::ParamVal->parse($self->get($tag, 0)); if (@_ > 2) { ### set it: $field->param($subtag, $value); ### set subfield $self->replace($tag, $field->stringify); ### replace! return $value; } else { ### get it: return $field->param($subtag); } } #------------------------------ =item mime_encoding I Try I to determine the content transfer encoding (e.g., C<"base64">, C<"binary">), which is returned in all-lowercase. If no encoding could be found, the default of C<"7bit"> is returned I quote from RFC 2045 section 6.1: This is the default value -- that is, "Content-Transfer-Encoding: 7BIT" is assumed if the Content-Transfer-Encoding header field is not present. I do one other form of fixup: "7_bit", "7-bit", and "7 bit" are corrected to "7bit"; likewise for "8bit". =cut sub mime_encoding { my $self = shift; my $enc = lc($self->mime_attr('content-transfer-encoding') || '7bit'); $enc =~ s{^([78])[ _-]bit\Z}{$1bit}; $enc; } #------------------------------ =item mime_type [DEFAULT] I Try C to determine the content type (e.g., C<"text/plain">, C<"image/gif">, C<"x-weird-type">, which is returned in all-lowercase. "Real hard" means that if no content type could be found, the default (usually C<"text/plain">) is returned. From RFC 2045 section 5.2: Default RFC 822 messages without a MIME Content-Type header are taken by this protocol to be plain text in the US-ASCII character set, which can be explicitly specified as: Content-type: text/plain; charset=us-ascii This default is assumed if no Content-Type header field is specified. Unless this is a part of a "multipart/digest", in which case "message/rfc822" is the default. Note that you can also I the default, but you shouldn't: normally only the MIME parser uses this feature. =cut sub mime_type { my ($self, $default) = @_; $self->{MIH_DefaultType} = $default if @_ > 1; my $s = $self->mime_attr('content-type') || $self->{MIH_DefaultType} || 'text/plain'; # avoid [perl #87336] bug, lc laundering tainted data return lc($s) if $] <= 5.008 || $] >= 5.014; $s =~ tr/A-Z/a-z/; $s; } #------------------------------ =item multipart_boundary I If this is a header for a multipart message, return the "encapsulation boundary" used to separate the parts. The boundary is returned exactly as given in the C field; that is, the leading double-hyphen (C<-->) is I prepended. Well, I exactly... this passage from RFC 2046 dictates that we remove any trailing spaces: If a boundary appears to end with white space, the white space must be presumed to have been added by a gateway, and must be deleted. Returns undef (B the empty string) if either the message is not multipart or if there is no specified boundary. =cut sub multipart_boundary { my $self = shift; my $value = $self->mime_attr('content-type.boundary'); (!defined($value)) ? undef : $value; } #------------------------------ =item recommended_filename I Return the recommended external filename. This is used when extracting the data from the MIME stream. The filename is always returned as a string in Perl's internal format (the UTF8 flag may be on!) Returns undef if no filename could be suggested. =cut sub recommended_filename { my $self = shift; # Try these headers in order, taking the first defined, # non-blank one we find. my $wd = supported MIME::WordDecoder 'UTF-8'; foreach my $attr_name ( qw( content-disposition.filename content-type.name ) ) { my $value = $self->mime_attr( $attr_name ); if ( defined $value && $value ne '' && $value =~ /\S/ ) { return $wd->decode($value); } } return undef; } #------------------------------ =back =cut #------------------------------ # # tweak_FROM_parsing # # DEPRECATED. Use the inherited mail_from() class method now. sub tweak_FROM_parsing { my $self = shift; usage "deprecated. Use mail_from() instead."; $self->mail_from(@_); } __END__ #------------------------------ =head1 NOTES =over 4 =item Why have separate objects for the entity, head, and body? See the documentation for the MIME-tools distribution for the rationale behind this decision. =item Why assume that MIME headers are email headers? I quote from Achim Bohnet, who gave feedback on v.1.9 (I think he's using the word "header" where I would use "field"; e.g., to refer to "Subject:", "Content-type:", etc.): There is also IMHO no requirement [for] MIME::Heads to look like [email] headers; so to speak, the MIME::Head [simply stores] the attributes of a complex object, e.g.: new MIME::Head type => "text/plain", charset => ..., disposition => ..., ... ; I agree in principle, but (alas and dammit) RFC 2045 says otherwise. RFC 2045 [MIME] headers are a syntactic subset of RFC-822 [email] headers. In my mind's eye, I see an abstract class, call it MIME::Attrs, which does what Achim suggests... so you could say: my $attrs = new MIME::Attrs type => "text/plain", charset => ..., disposition => ..., ... ; We could even make it a superclass of MIME::Head: that way, MIME::Head would have to implement its interface, I allow itself to be initialized from a MIME::Attrs object. However, when you read RFC 2045, you begin to see how much MIME information is organized by its presence in particular fields. I imagine that we'd begin to mirror the structure of RFC 2045 fields and subfields to such a degree that this might not give us a tremendous gain over just having MIME::Head. =item Why all this "occurrence" and "index" jazz? Isn't every field unique? Aaaaaaaaaahh....no. Looking at a typical mail message header, it is sooooooo tempting to just store the fields as a hash of strings, one string per hash entry. Unfortunately, there's the little matter of the C field, which (unlike C, C, etc.) will often have multiple occurrences; e.g.: Received: from gsfc.nasa.gov by eryq.pr.mcs.net with smtp (Linux Smail3.1.28.1 #5) id m0tStZ7-0007X4C; Thu, 21 Dec 95 16:34 CST Received: from rhine.gsfc.nasa.gov by gsfc.nasa.gov (5.65/Ultrix3.0-C) id AA13596; Thu, 21 Dec 95 17:20:38 -0500 Received: (from eryq@localhost) by rhine.gsfc.nasa.gov (8.6.12/8.6.12) id RAA28069; Thu, 21 Dec 1995 17:27:54 -0500 Date: Thu, 21 Dec 1995 17:27:54 -0500 From: Eryq Message-Id: <199512212227.RAA28069@rhine.gsfc.nasa.gov> To: eryq@eryq.pr.mcs.net Subject: Stuff and things The C field is used for tracing message routes, and although it's not generally used for anything other than human debugging, I didn't want to inconvenience anyone who actually wanted to get at that information. I also didn't want to make this a special case; after all, who knows what other fields could have multiple occurrences in the future? So, clearly, multiple entries had to somehow be stored multiple times... and the different occurrences had to be retrievable. =back =head1 SEE ALSO L, L, L, L =head1 AUTHOR Eryq (F), ZeeGee Software Inc (F). Dianne Skoll (dianne@skoll.ca) All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. The more-comprehensive filename extraction is courtesy of Lee E. Brotzman, Advanced Data Solutions. =cut 1; MIME-tools-5.515/lib/MIME/WordDecoder.pm0000644000175000017500000004146514261313522015575 0ustar dfsdfspackage MIME::WordDecoder; =head1 NAME MIME::WordDecoder - decode RFC 2047 encoded words to a local representation WARNING: Most of this module is deprecated and may disappear. The only function you should use for MIME decoding is "mime_to_perl_string". =head1 SYNOPSIS See L for the basics of encoded words. See L<"DESCRIPTION"> for how this class works. use MIME::WordDecoder; ### Get the default word-decoder (used by unmime()): $wd = default MIME::WordDecoder; ### Get a word-decoder which maps to ISO-8859-1 (Latin1): $wd = supported MIME::WordDecoder "ISO-8859-1"; ### Decode a MIME string (e.g., into Latin1) via the default decoder: $str = $wd->decode('To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= '); ### Decode a string using the default decoder, non-OO style: $str = unmime('To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= '); ### Decode a string to an internal Perl string, non-OO style ### The result is likely to have the UTF8 flag ON. $str = mime_to_perl_string('To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= '); =head1 DESCRIPTION WARNING: Most of this module is deprecated and may disappear. It duplicates (badly) the function of the standard 'Encode' module. The only function you should rely on is mime_to_perl_string. A MIME::WordDecoder consists, fundamentally, of a hash which maps a character set name (US-ASCII, ISO-8859-1, etc.) to a subroutine which knows how to take bytes in that character set and turn them into the target string representation. Ideally, this target representation would be Unicode, but we don't want to overspecify the translation that takes place: if you want to convert MIME strings directly to Big5, that's your own decision. The subroutine will be invoked with two arguments: DATA (the data in the given character set), and CHARSET (the upcased character set name). For example: ### Keep 7-bit characters as-is, convert 8-bit characters to '#': sub keep7bit { local $_ = shift; tr/\x00-\x7F/#/c; $_; } Here's a decoder which uses that: ### Construct a decoder: $wd = MIME::WordDecoder->new({'US-ASCII' => "KEEP", ### sub { $_[0] } 'ISO-8859-1' => \&keep7bit, 'ISO-8859-2' => \&keep7bit, 'Big5' => "WARN", '*' => "DIE"}); ### Convert some MIME text to a pure ASCII string... $ascii = $wd->decode('To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= '); ### ...which will now hold: "To: Keld J#rn Simonsen " The UTF-8 built-in decoder decodes everything into Perl's internal string format, possibly turning on the internal UTF8 flag. Use it like this: $wd = supported MIME::WordDecoder 'UTF-8'; $perl_string = $wd->decode('To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= '); # perl_string will be a valid UTF-8 string with the "UTF8" flag set. Generally, you should use the UTF-8 decoder in preference to "unmime". =head1 PUBLIC INTERFACE =over =cut use strict; use Carp qw( carp croak ); use MIME::Words qw(decode_mimewords); use Exporter; use vars qw(@ISA @EXPORT); @ISA = qw(Exporter); @EXPORT = qw( unmime mime_to_perl_string ); #------------------------------ # # Globals # #------------------------------ ### Decoders. my %DecoderFor = (); ### Standard handlers. my %Handler = ( KEEP => sub {$_[0]}, IGNORE => sub {''}, WARN => sub { carp "ignoring text in character set `$_[1]'\n" }, DIE => sub { croak "can't handle text in character set `$_[1]'\n" }, ); ### Global default decoder. We init it below. my $Default; ### Global UTF8 decoder. my $DefaultUTF8; #------------------------------ =item default [DECODER] I Get/set the default DECODER object. =cut sub default { my $class = shift; if (@_) { $Default = shift; } $Default; } #------------------------------ =item supported CHARSET, [DECODER] I If just CHARSET is given, returns a decoder object which maps data into that character set (the character set is forced to all-uppercase). $wd = supported MIME::WordDecoder "ISO-8859-1"; If DECODER is given, installs such an object: MIME::WordDecoder->supported("ISO-8859-1" => (new MIME::WordDecoder::ISO_8859 "1")); You should not override this method. =cut sub supported { my ($class, $charset, $decoder) = @_; $DecoderFor{uc($charset)} = $decoder if (@_ > 2); $DecoderFor{uc($charset)}; } #------------------------------ =item new [\@HANDLERS] I If \@HANDLERS is given, then @HANDLERS is passed to handler() to initialize the internal map. =cut sub new { my ($class, $h) = @_; my $self = bless { MWD_Map=>{} }, $class; ### Init the map: $self->handler(@$h); ### Add fallbacks: $self->{MWD_Map}{'*'} ||= $Handler{WARN}; $self->{MWD_Map}{'raw'} ||= $self->{MWD_Map}{'US-ASCII'}; $self; } #------------------------------ =item handler CHARSET=>\&SUBREF, ... I Set the handler SUBREF for a given CHARSET, for as many pairs as you care to supply. When performing the translation of a MIME-encoded string, a given SUBREF will be invoked when translating a block of text in character set CHARSET. The subroutine will be invoked with the following arguments: DATA - the data in the given character set. CHARSET - the upcased character set name, which may prove useful if you are using the same SUBREF for multiple CHARSETs. DECODER - the decoder itself, if it contains configuration information that your handler function needs. For example: $wd = new MIME::WordDecoder; $wd->handler('US-ASCII' => "KEEP"); $wd->handler('ISO-8859-1' => \&handle_latin1, 'ISO-8859-2' => \&handle_latin1, '*' => "DIE"); Notice that, much as with %SIG, the SUBREF can also be taken from a set of special keywords: KEEP Pass data through unchanged. IGNORE Ignore data in this character set, without warning. WARN Ignore data in this character set, with warning. DIE Fatal exception with "can't handle character set" message. The subroutine for the special CHARSET of 'raw' is used for raw (non-MIME-encoded) text, which is supposed to be US-ASCII. The handler for 'raw' defaults to whatever was specified for 'US-ASCII' at the time of construction. The subroutine for the special CHARSET of '*' is used for any unrecognized character set. The default action for '*' is WARN. =cut sub handler { my $self = shift; ### Copy the hash, and edit it: while (@_) { my $c = shift; my $sub = shift; $self->{MWD_Map}{$c} = $self->real_handler($sub); } $self; } #------------------------------ =item decode STRING I Decode a STRING which might contain MIME-encoded components into a local representation (e.g., UTF-8, etc.). =cut sub decode { my ($self, $str) = @_; defined($str) or return undef; join('', map { ### Get the data and (upcased) charset: my $data = $_->[0]; my $charset = (defined($_->[1]) ? uc($_->[1]) : 'raw'); $charset =~ s/\*\w+\Z//; ### RFC2184 language suffix ### Get the handler; guess if never seen before: defined($self->{MWD_Map}{$charset}) or $self->{MWD_Map}{$charset} = ($self->real_handler($self->guess_handler($charset)) || 0); my $subr = $self->{MWD_Map}{$charset} || $self->{MWD_Map}{'*'}; ### Map this chunk: &$subr($data, $charset, $self); } decode_mimewords($str)); } #------------------------------ # # guess_handler CHARSET # # Instance method. # An unrecognized charset has been seen. Guess a handler subref # for the given charset, returning false if there is none. # Successful mappings will be cached in the main map. # sub guess_handler { undef; } #------------------------------ # # real_handler HANDLER # # Instance method. # Translate the given handler, which might be a subref or a string. # sub real_handler { my ($self, $sub) = @_; (!$sub) or (ref($sub) eq 'CODE') or $sub = ($Handler{$sub} || croak "bad named handler: $sub\n"); $sub; } #------------------------------ =item unmime STRING I Decode the given STRING using the default() decoder. See L. You should consider using the UTF-8 decoder instead. It decodes MIME strings into Perl's internal string format. =cut sub unmime($) { my $str = shift; $Default->decode($str); } =item mime_to_perl_string I Decode the given STRING into an internal Perl Unicode string. You should use this function in preference to all others. The result of mime_to_perl_string is likely to have Perl's UTF8 flag set. =cut sub mime_to_perl_string($) { my $str = shift; $DecoderFor{'UTF-8'}->decode($str); } =back =cut =head1 SUBCLASSES =over =cut #------------------------------------------------------------ #------------------------------------------------------------ =item MIME::WordDecoder::ISO_8859 A simple decoder which keeps US-ASCII and the 7-bit characters of ISO-8859 character sets and UTF8, and also keeps 8-bit characters from the indicated character set. ### Construct: $wd = new MIME::WordDecoder::ISO_8859 2; ### ISO-8859-2 ### What to translate unknown characters to (can also use empty): ### Default is "?". $wd->unknown("?"); ### Collapse runs of unknown characters to a single unknown()? ### Default is false. $wd->collapse(1); According to B (ca. November 2000): ISO 8859 is a full series of 10 (and soon even more) standardized multilingual single-byte coded (8bit) graphic character sets for writing in alphabetic languages: 1. Latin1 (West European) 2. Latin2 (East European) 3. Latin3 (South European) 4. Latin4 (North European) 5. Cyrillic 6. Arabic 7. Greek 8. Hebrew 9. Latin5 (Turkish) 10. Latin6 (Nordic) The ISO 8859 charsets are not even remotely as complete as the truly great Unicode but they have been around and usable for quite a while (first registered Internet charsets for use with MIME) and have already offered a major improvement over the plain 7bit US-ASCII. Characters 0 to 127 are always identical with US-ASCII and the positions 128 to 159 hold some less used control characters: the so-called C1 set from ISO 6429. =cut package MIME::WordDecoder::ISO_8859; use strict; use vars qw(@ISA); @ISA = qw( MIME::WordDecoder ); #------------------------------ # # HANDLERS # #------------------------------ ### Keep 7bit characters. ### Turn all else to the special \x00. sub h_keep7bit { local $_ = $_[0]; # my $unknown = $_[2]->{MWDI_Unknown}; s{[\x80-\xFF]}{\x00}g; $_; } ### Note: should use Unicode::String, converting/manipulating ### everything into full Unicode form. ### Keep 7bit UTF8 characters (ASCII). ### Keep ISO-8859-1 if this decoder is for Latin-1. ### Turn all else to the special \x00. sub h_utf8 { local $_ = $_[0]; # my $unknown = $_[2]->{MWDI_Unknown}; my $latin1 = ($_[2]->{MWDI_Num} == 1); #print STDERR "UTF8 in: <$_>\n"; local($1,$2,$3); my $tgt = ''; while (m{\G( ([\x00-\x7F]) | # 0xxxxxxx ([\xC0-\xDF] [\x80-\xBF]) | # 110yyyyy 10xxxxxx ([\xE0-\xEF] [\x80-\xBF]{2}) | # 1110zzzz 10yyyyyy 10xxxxxx ([\xF0-\xF7] [\x80-\xBF]{3}) | # 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx . # error; synch )}gcsx and ($1 ne '')) { if (defined($2)) { $tgt .= $2 } elsif (defined($3) && $latin1) { $tgt .= "\x00" } else { $tgt .= "\x00" } } #print STDERR "UTF8 out: <$tgt>\n"; $tgt; } ### Keep characters which are 7bit in UTF8 (ASCII). ### Keep ISO-8859-1 if this decoder is for Latin-1. ### Turn all else to the special \x00. sub h_utf16 { local $_ = $_[0]; # my $unknown = $_[2]->{MWDI_Unknown}; my $latin1 = ($_[2]->{MWDI_Num} == 1); #print STDERR "UTF16 in: <$_>\n"; local($1,$2,$3,$4,$5); my $tgt = ''; while (m{\G( ( \x00 ([\x00-\x7F])) | # 00000000 0xxxxxxx ( \x00 ([\x80-\xFF])) | # 00000000 1xxxxxxx ( [^\x00] [\x00-\xFF]) | # etc ) }gcsx and ($1 ne '')) { if (defined($2)) { $tgt .= $3 } elsif (defined($4) && $latin1) { $tgt .= $5 } else { $tgt .= "\x00" } } #print STDERR "UTF16 out: <$tgt>\n"; $tgt; } #------------------------------ # # PUBLIC INTERFACE # #------------------------------ #------------------------------ # # new NUMBER # sub new { my ($class, $num) = @_; my $self = $class->SUPER::new(); $self->handler('raw' => 'KEEP', 'US-ASCII' => 'KEEP'); $self->{MWDI_Num} = $num; $self->{MWDI_Unknown} = "?"; $self->{MWDI_Collapse} = 0; $self; } #------------------------------ # # guess_handler CHARSET # sub guess_handler { my ($self, $charset) = @_; return 'KEEP' if (($charset =~ /^ISO[-_]?8859[-_](\d+)$/) && ($1 eq $self->{MWDI_Num})); return \&h_keep7bit if ($charset =~ /^ISO[-_]?8859/); return \&h_utf8 if ($charset =~ /^UTF[-_]?8$/); return \&h_utf16 if ($charset =~ /^UTF[-_]?16$/); undef; } #------------------------------ # # unknown [REPLACEMENT] # sub unknown { my $self = shift; $self->{MWDI_Unknown} = shift if @_; $self->{MWDI_Unknown}; } #------------------------------ # # collapse [YESNO] # sub collapse { my $self = shift; $self->{MWDI_Collapse} = shift if @_; $self->{MWDI_Collapse}; } #------------------------------ # # decode STRING # sub decode { my $self = shift; ### Do inherited action: my $basic = $self->SUPER::decode(@_); defined($basic) or return undef; ### Translate/consolidate illegal characters: $basic =~ tr{\x00}{\x00}c if $self->{MWDI_Collapse}; $basic =~ s{\x00}{$self->{MWDI_Unknown}}g; $basic; } #------------------------------------------------------------ #------------------------------------------------------------ =item MIME::WordDecoder::US_ASCII A subclass of the ISO-8859-1 decoder which discards 8-bit characters. You're probably better off using ISO-8859-1. =cut package MIME::WordDecoder::US_ASCII; use strict; use vars qw(@ISA); @ISA = qw( MIME::WordDecoder::ISO_8859 ); sub new { my ($class) = @_; return $class->SUPER::new("1"); } sub decode { my $self = shift; ### Do inherited action: my $basic = $self->SUPER::decode(@_); defined($basic) or return undef; ### Translate/consolidate 8-bit characters: $basic =~ tr{\x80-\xFF}{}c if $self->{MWDI_Collapse}; $basic =~ s{[\x80-\xFF]}{$self->{MWDI_Unknown}}g; $basic; } =back =cut package MIME::WordDecoder::UTF_8; use strict; use Encode qw(); use Carp qw( carp ); use vars qw(@ISA); @ISA = qw( MIME::WordDecoder ); sub h_convert_to_utf8 { my ($data, $charset, $decoder) = @_; $charset = 'US-ASCII' if ($charset eq 'raw'); my $enc = Encode::find_encoding($charset); if (!$enc) { carp "Unable to convert text in character set `$charset' to UTF-8... ignoring\n"; return ''; } my $ans = $enc->decode($data, Encode::FB_PERLQQ); return $ans; } sub new { my ($class) = @_; my $self = $class->SUPER::new(); $self->handler('*' => \&h_convert_to_utf8); } #------------------------------------------------------------ #------------------------------------------------------------ package MIME::WordDecoder; ### Now we can init the default handler. $Default = (MIME::WordDecoder::ISO_8859->new('1')); ### Add US-ASCII handler: $DecoderFor{"US-ASCII"} = MIME::WordDecoder::US_ASCII->new; ### Add ISO-8859-{1..15} handlers: for (1..15) { $DecoderFor{"ISO-8859-$_"} = MIME::WordDecoder::ISO_8859->new($_); } ### UTF-8 $DecoderFor{'UTF-8'} = MIME::WordDecoder::UTF_8->new(); 1; # end the module __END__ =head1 SEE ALSO L =head1 AUTHOR Eryq (F), ZeeGee Software Inc (F). Dianne Skoll (dianne@skoll.ca) =cut BEGIN { unshift @INC, ".", "./etc", "./lib" }; import MIME::WordDecoder; ### Decode a MIME string (e.g., into Latin1) via the default decoder: my $charset = $ARGV[0] || 'ISO-8859-1'; my $wd = MIME::WordDecoder->supported($charset) || die "unsupported charset: $charset\n"; $wd->unknown('#'); my @encs = ( 'ASCII: =?US-ASCII?Q?Keith_Moore?= ', 'Latin1: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= ', 'Latin1: =?ISO-8859-1?Q?Andr=E9_?= Pirard ', 'Latin1: =?ISO-8859-1?Q?Andr=E9_?=Pirard ', ' UTF-8: =?UTF-8?Q?Andr=E9_?=Pirard ', 'UTF-16: =?UTF-16?Q?=00A=00n=00d=00r=00=E9?= Pirard ', ('=?ISO-8859-1?B?SWYgeW91IGNhbiByZWFkIHRoaXMgeW8=?='. '=?ISO-8859-2?B?dSB1bmRlcnN0YW5kIHRoZSBleGFtcGxlLg==?='. '=?US-ASCII?Q?.._cool!?=')); $str = $wd->decode(join "\n", @encs); print "$str\n"; 1; MIME-tools-5.515/lib/MIME/Tools.pm0000644000175000017500000007514114612222714014474 0ustar dfsdfspackage MIME::Tools; #------------------------------ # Because the POD documentation is pretty extensive, it follows # the __END__ statement below... #------------------------------ use strict; use vars (qw(@ISA %CONFIG @EXPORT_OK %EXPORT_TAGS $VERSION $ME $M_DEBUG $M_WARNING $M_ERROR )); require Exporter; use IO::File; use File::Temp 0.18 (); use Carp; $ME = "MIME-tools"; @ISA = qw(Exporter); # Exporting (importing should only be done by modules in this toolkit!): %EXPORT_TAGS = ( 'config' => [qw(%CONFIG)], 'msgs' => [qw(usage debug whine error)], 'msgtypes'=> [qw($M_DEBUG $M_WARNING $M_ERROR)], 'utils' => [qw(textual_type tmpopen )], ); Exporter::export_ok_tags('config', 'msgs', 'msgtypes', 'utils'); # The TOOLKIT version, both in 1.23 style *and* usable by MakeMaker: $VERSION = "5.515"; # Configuration (do NOT alter this directly)... # All legal CONFIG vars *must* be in here, even if only to be set to undef: %CONFIG = ( DEBUGGING => 0, QUIET => 1, ); # Message-logging constants: $M_DEBUG = 'debug'; $M_WARNING = 'warning'; $M_ERROR = 'error'; #------------------------------ # # CONFIGURATION... (see below) # #------------------------------ sub config { my $class = shift; usage("config() is obsolete"); # No args? Just return list: @_ or return keys %CONFIG; my $method = lc(shift); return $class->$method(@_); } sub debugging { my ($class, $value) = @_; $CONFIG{'DEBUGGING'} = $value if (@_ > 1); return $CONFIG{'DEBUGGING'}; } sub quiet { my ($class, $value) = @_; $CONFIG{'QUIET'} = $value if (@_ > 1); return $CONFIG{'QUIET'}; } sub version { my ($class, $value) = @_; return $VERSION; } #------------------------------ # # MESSAGES... # #------------------------------ #------------------------------ # # debug MESSAGE... # # Function, private. # Output a debug message. # sub debug { print STDERR "$ME: $M_DEBUG: ", @_, "\n" if $CONFIG{DEBUGGING}; } #------------------------------ # # whine MESSAGE... # # Function, private. # Something doesn't look right: issue a warning. # Only output if $^W (-w) is true, and we're not being QUIET. # sub whine { my $msg = "$ME: $M_WARNING: ".join('', @_)."\n"; warn $msg if ($^W && !$CONFIG{QUIET}); return (wantarray ? () : undef); } #------------------------------ # # error MESSAGE... # # Function, private. # Something failed, but not so badly that we want to throw an # exception. Just report our general unhappiness. # Only output if $^W (-w) is true, and we're not being QUIET. # sub error { my $msg = "$ME: $M_ERROR: ".join('', @_)."\n"; warn $msg if ($^W && !$CONFIG{QUIET}); return (wantarray ? () : undef); } #------------------------------ # # usage MESSAGE... # # Register unhappiness about usage. # sub usage { my ( $p, $f, $l, $s) = caller(1); my ($cp, $cf, $cl, $cs) = caller(2); my $msg = join('', (($s =~ /::/) ? "$s() " : "${p}::$s() "), @_, "\n"); my $loc = ($cf ? "\tin code called from $cf l.$cl" : ''); warn "$msg$loc\n" if ($^W && !$CONFIG{QUIET}); return (wantarray ? () : undef); } #------------------------------ # # UTILS... # #------------------------------ #------------------------------ # # textual_type MIMETYPE # # Function. Does the given MIME type indicate a textlike document? # sub textual_type { ($_[0] =~ m{^(text|message)(/|\Z)}i); } #------------------------------ # # tmpopen # # sub tmpopen { my ($args) = @_; $args ||= {}; return File::Temp->new( %{$args} ); } #------------------------------ 1; __END__ =head1 NAME MIME-tools - modules for parsing (and creating!) MIME entities =head1 SYNOPSIS Here's some pretty basic code for B and outputting its decoded components to a given directory: use MIME::Parser; ### Create parser, and set some parsing options: my $parser = new MIME::Parser; $parser->output_under("$ENV{HOME}/mimemail"); ### Parse input: $entity = $parser->parse(\*STDIN) or die "parse failed\n"; ### Take a look at the top-level entity (and any parts it has): $entity->dump_skeleton; Here's some code which B containing three parts: a text file, an attached GIF, and some more text: use MIME::Entity; ### Create the top-level, and set up the mail headers: $top = MIME::Entity->build(Type =>"multipart/mixed", From => "me\@myhost.com", To => "you\@yourhost.com", Subject => "Hello, nurse!"); ### Part #1: a simple text document: $top->attach(Path=>"./testin/short.txt"); ### Part #2: a GIF file: $top->attach(Path => "./docs/mime-sm.gif", Type => "image/gif", Encoding => "base64"); ### Part #3: some literal text: $top->attach(Data=>$message); ### Send it: open MAIL, "| /usr/lib/sendmail -t -oi -oem" or die "open: $!"; $top->print(\*MAIL); close MAIL; For more examples, look at the scripts in the B directory of the MIME-tools distribution. =head1 DESCRIPTION MIME-tools is a collection of Perl5 MIME:: modules for parsing, decoding, I single- or multipart (even nested multipart) MIME messages. (Yes, kids, that means you can send messages with attached GIF files). =head1 REQUIREMENTS You will need the following installed on your system: File::Path File::Spec IPC::Open2 (optional) MIME::Base64 MIME::QuotedPrint Net::SMTP Mail::Internet, ... from the MailTools distribution. See the Makefile.PL in your distribution for the most-comprehensive list of prerequisite modules and their version numbers. =head1 A QUICK TOUR =head2 Overview of the classes Here are the classes you'll generally be dealing with directly: (START HERE) results() .-----------------. \ .-------->| MIME:: | .-----------. / | Parser::Results | | MIME:: |--' `-----------------' | Parser |--. .-----------------. `-----------' \ filer() | MIME:: | | parse() `-------->| Parser::Filer | | gives you `-----------------' | a... | output_path() | | determines | | path() of... | head() .--------. | | returns... | MIME:: | get() | V .-------->| Head | etc... | .--------./ `--------' | .---> | MIME:: | | `-----| Entity | .--------. | parts() `--------'\ | MIME:: | / returns `-------->| Body |<---------' sub-entities bodyhandle() `--------' (if any) returns... | open() | returns... | V .--------. read() | IO:: | getline() | Handle | print() `--------' etc... To illustrate, parsing works this way: =over 4 =item * B A parser is an instance of C. You hand it an input stream (like a filehandle) to parse a message from: if the parse is successful, the result is an "entity". =item * B An entity is an instance of C (a subclass of C). If the message had "parts" (e.g., attachments), then those parts are "entities" as well, contained inside the top-level entity. Each entity has a "head" and a "body". =item * B A "head" is an instance of C (a subclass of C). It contains information from the message header: content type, sender, subject line, etc. =item * B You can ask to "open" this data source for I or I, and you will get back an "I/O handle". =item * B This handle is an object that is basically like an IO::Handle... it can be any class, so long as it supports a small, standard set of methods for reading from or writing to the underlying data source. =back A typical multipart message containing two parts -- a textual greeting and an "attached" GIF file -- would be a tree of MIME::Entity objects, each of which would have its own MIME::Head. Like this: .--------. | MIME:: | Content-type: multipart/mixed | Entity | Subject: Happy Samhaine! `--------' | `----. parts | | .--------. |---| MIME:: | Content-type: text/plain; charset=us-ascii | | Entity | Content-transfer-encoding: 7bit | `--------' | .--------. |---| MIME:: | Content-type: image/gif | Entity | Content-transfer-encoding: base64 `--------' Content-disposition: inline; filename="hs.gif" =head2 Parsing messages You usually start by creating an instance of B and setting up certain parsing parameters: what directory to save extracted files to, how to name the files, etc. You then give that instance a readable filehandle on which waits a MIME message. If all goes well, you will get back a B object (a subclass of B), which consists of... =over 4 =item * A B (a subclass of B) which holds the MIME header data. =item * A B, which is a object that knows where the body data is. You ask this object to "open" itself for reading, and it will hand you back an "I/O handle" for reading the data: this could be of any class, so long as it conforms to a subset of the B interface. =back If the original message was a multipart document, the MIME::Entity object will have a non-empty list of "parts", each of which is in turn a MIME::Entity (which might also be a multipart entity, etc, etc...). Internally, the parser (in MIME::Parser) asks for instances of B whenever it needs to decode an encoded file. MIME::Decoder has a mapping from supported encodings (e.g., 'base64') to classes whose instances can decode them. You can add to this mapping to try out new/experiment encodings. You can also use MIME::Decoder by itself. =head2 Composing messages All message composition is done via the B class. For single-part messages, you can use the B constructor to create MIME entities very easily. For multipart messages, you can start by creating a top-level C entity with B, and then use the similar B method to attach parts to that message. I what most people think of as "a text message with an attached GIF file" is I a multipart message with 2 parts: the first being the text message, and the second being the GIF file. When building MIME a entity, you'll have to provide two very important pieces of information: the I and the I. The type is usually easy, as it is directly determined by the file format; e.g., an HTML file is C. The encoding, however, is trickier... for example, some HTML files are C<7bit>-compliant, but others might have very long lines and would need to be sent C for reliability. See the section on encoding/decoding for more details, as well as L<"A MIME PRIMER"> below. =head2 Sending email Since MIME::Entity inherits directly from Mail::Internet, you can use the normal Mail::Internet mechanisms to send email. For example, $entity->smtpsend; =head2 Encoding/decoding support The B class can be used to I as well; this is done when printing MIME entities. All the standard encodings are supported (see L<"A MIME PRIMER"> below for details): Encoding: | Normally used when message contents are: ------------------------------------------------------------------- 7bit | 7-bit data with under 1000 chars/line, or multipart. 8bit | 8-bit data with under 1000 chars/line. binary | 8-bit data with some long lines (or no line breaks). quoted-printable | Text files with some 8-bit chars (e.g., Latin-1 text). base64 | Binary files. Which encoding you choose for a given document depends largely on (1) what you know about the document's contents (text vs binary), and (2) whether you need the resulting message to have a reliable encoding for 7-bit Internet email transport. In general, only C and C guarantee reliable transport of all data; the other three "no-encoding" encodings simply pass the data through, and are only reliable if that data is 7bit ASCII with under 1000 characters per line, and has no conflicts with the multipart boundaries. I've considered making it so that the content-type and encoding can be automatically inferred from the file's path, but that seems to be asking for trouble... or at least, for Mail::Cap... =head2 Message-logging MIME-tools is a large and complex toolkit which tries to deal with a wide variety of external input. It's sometimes helpful to see what's really going on behind the scenes. There are several kinds of messages logged by the toolkit itself: =over 4 =item Debug messages These are printed directly to the STDERR, with a prefix of C<"MIME-tools: debug">. Debug message are only logged if you have turned L on in the MIME::Tools configuration. =item Warning messages These are logged by the standard Perl warn() mechanism to indicate an unusual situation. They all have a prefix of C<"MIME-tools: warning">. Warning messages are only logged if C<$^W> is set true and MIME::Tools is not configured to be L. =item Error messages These are logged by the standard Perl warn() mechanism to indicate that something actually failed. They all have a prefix of C<"MIME-tools: error">. Error messages are only logged if C<$^W> is set true and MIME::Tools is not configured to be L. =item Usage messages Unlike "typical" warnings above, which warn about problems processing data, usage-warnings are for alerting developers of deprecated methods and suspicious invocations. Usage messages are currently only logged if C<$^W> is set true and MIME::Tools is not configured to be L. =back When a MIME::Parser (or one of its internal helper classes) wants to report a message, it generally does so by recording the message to the B object immediately before invoking the appropriate function above. That means each parsing run has its own trace-log which can be examined for problems. =head2 Configuring the toolkit If you want to tweak the way this toolkit works (for example, to turn on debugging), use the routines in the B module. =over =item debugging Turn debugging on or off. Default is false (off). MIME::Tools->debugging(1); =item quiet Turn the reporting of warning/error messages on or off. Default is true, meaning that these message are silenced. MIME::Tools->quiet(1); =item version Return the toolkit version. print MIME::Tools->version, "\n"; =back =head1 THINGS YOU SHOULD DO =head2 Take a look at the examples The MIME-Tools distribution comes with an "examples" directory. The scripts in there are basically just tossed-together, but they'll give you some ideas of how to use the parser. =head2 Run with warnings enabled I run your Perl script with C<-w>. If you see a warning about a deprecated method, change your code ASAP. This will ease upgrades tremendously. =head2 Avoid non-standard encodings Don't try to MIME-encode using the non-standard MIME encodings. It's just not a good practice if you want people to be able to read your messages. =head2 Plan for thrown exceptions For example, if your mail-handling code absolutely must not die, then perform mail parsing like this: $entity = eval { $parser->parse(\*INPUT) }; Parsing is a complex process, and some components may throw exceptions if seriously-bad things happen. Since "seriously-bad" is in the eye of the beholder, you're better off I possible exceptions instead of asking me to propagate C up the stack. Use of exceptions in reusable modules is one of those religious issues we're never all going to agree upon; thankfully, that's what C is good for. =head2 Check the parser results for warnings/errors As of 5.3xx, the parser tries extremely hard to give you a MIME::Entity. If there were any problems, it logs warnings/errors to the underlying "results" object (see L). Look at that object after each parse. Print out the warnings and errors, I if messages don't parse the way you thought they would. =head2 Don't plan on printing exactly what you parsed! I Because of things like ambiguities in base64-encoding, the following is I going to spit out its input unchanged in all cases: $entity = $parser->parse(\*STDIN); $entity->print(\*STDOUT); If you're using MIME::Tools to process email, remember to save the data you parse if you want to send it on unchanged. This is vital for things like PGP-signed email. =head2 Understand how international characters are represented The MIME standard allows for text strings in headers to contain characters from any character set, by using special sequences which look like this: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= To be consistent with the existing Mail::Field classes, MIME::Tools does I automatically unencode these strings, since doing so would lose the character-set information and interfere with the parsing of fields (see L for a full explanation). That means you should be prepared to deal with these encoded strings. The most common question then is, B The answer depends on what you want to decode them I: ASCII, Latin1, UTF-8, etc. Be aware that your "target" representation may not support all possible character sets you might encounter; for example, Latin1 (ISO-8859-1) has no way of representing Big5 (Chinese) characters. A common practice is to represent "untranslateable" characters as "?"s, or to ignore them completely. To unencode the strings into some of the more-popular Western byte representations (e.g., Latin1, Latin2, etc.), you can use the decoders in MIME::WordDecoder (see L). The simplest way is by using C, a function wrapped around your "default" decoder, as follows: use MIME::WordDecoder; ... $subject = unmime $entity->head->get('subject'); One place this I done automatically is in extracting the recommended filename for a part while parsing. That's why you should start by setting up the best "default" decoder if the default target of Latin1 isn't to your liking. =head1 THINGS I DO THAT YOU SHOULD KNOW ABOUT =head2 Fuzzing of CRLF and newline on input RFC 2045 dictates that MIME streams have lines terminated by CRLF (C<"\r\n">). However, it is extremely likely that folks will want to parse MIME streams where each line ends in the local newline character C<"\n"> instead. An attempt has been made to allow the parser to handle both CRLF and newline-terminated input. =head2 Fuzzing of CRLF and newline when decoding The C<"7bit"> and C<"8bit"> decoders will decode both a C<"\n"> and a C<"\r\n"> end-of-line sequence into a C<"\n">. The C<"binary"> decoder (default if no encoding specified) still outputs stuff verbatim... so a MIME message with CRLFs and no explicit encoding will be output as a text file that, on many systems, will have an annoying ^M at the end of each line... I. =head2 Fuzzing of CRLF and newline when encoding/composing TODO FIXME All encoders currently output the end-of-line sequence as a C<"\n">, with the assumption that the local mail agent will perform the conversion from newline to CRLF when sending the mail. However, there probably should be an option to output CRLF as per RFC 2045 =head2 Inability to handle multipart boundaries with embedded newlines Let's get something straight: this is an evil, EVIL practice. If your mailer creates multipart boundary strings that contain newlines, give it two weeks notice and find another one. If your mail robot receives MIME mail like this, regard it as syntactically incorrect, which it is. =head2 Ignoring non-header headers People like to hand the parser raw messages straight from POP3 or from a mailbox. There is often predictable non-header information in front of the real headers; e.g., the initial "From" line in the following message: From - Wed Mar 22 02:13:18 2000 Return-Path: Subject: Hello The parser simply ignores such stuff quietly. Perhaps it shouldn't, but most people seem to want that behavior. =head2 Fuzzing of empty multipart preambles Please note that there is currently an ambiguity in the way preambles are parsed in. The following message fragments I are regarded as having an empty preamble (where C<\n> indicates a newline character): Content-type: multipart/mixed; boundary="xyz"\n Subject: This message (#1) has an empty preamble\n \n --xyz\n ... Content-type: multipart/mixed; boundary="xyz"\n Subject: This message (#2) also has an empty preamble\n \n \n --xyz\n ... In both cases, the I completely-empty line (after the "Subject") marks the end of the header. But we should clearly ignore the I empty line in message #2, since it fills the role of I<"the newline which is only there to make sure that the boundary is at the beginning of a line">. Such newlines are I part of the content preceding the boundary; thus, there is no preamble "content" in message #2. However, it seems clear that message #1 I has no preamble "content", and is in fact merely a compact representation of an empty preamble. =head2 Use of a temp file during parsing I Although the amount of core available on even a modest home system continues to grow, the size of attachments continues to grow with it. I wanted to make sure that even users with small systems could deal with decoding multi-megabyte sounds and movie files. That means not being core-bound. As of the released 5.3xx, MIME::Parser gets by with only one temp file open per parser. This temp file provides a sort of infinite scratch space for dealing with the current message part. It's fast and lightweight, but you should know about it anyway. =head2 Why do I assume that MIME objects are email objects? Achim Bohnet once pointed out that MIME headers do nothing more than store a collection of attributes, and thus could be represented as objects which don't inherit from Mail::Header. I agree in principle, but RFC 2045 says otherwise. RFC 2045 [MIME] headers are a syntactic subset of RFC-822 [email] headers. Perhaps a better name for these modules would have been RFC1521:: instead of MIME::, but we're a little beyond that stage now. When I originally wrote these modules for the CPAN, I agonized for a long time about whether or not they really should subclass from B (then at version 1.17). Thanks to Graham Barr, who graciously evolved MailTools 1.06 to be more MIME-friendly, unification was achieved at MIME-tools release 2.0. The benefits in reuse alone have been substantial. =head1 A MIME PRIMER So you need to parse (or create) MIME, but you're not quite up on the specifics? No problem... =head2 Glossary Here are some definitions adapted from RFC 1521 (predecessor of the current RFC 204[56789] defining MIME) explaining the terminology we use; each is accompanied by the equivalent in MIME:: module terms... =over 4 =item attachment An "attachment" is common slang for any part of a multipart message -- except, perhaps, for the first part, which normally carries a user message describing the attachments that follow (e.g.: "Hey dude, here's that GIF file I promised you."). In our system, an attachment is just a B under the top-level entity, probably one of its L. =item body The "body" of an L is that portion of the entity which follows the L and which contains the real message content. For example, if your MIME message has a GIF file attachment, then the body of that attachment is the base64-encoded GIF file itself. A body is represented by an instance of B. You get the body of an entity by sending it a L message. =item body part One of the parts of the body of a multipart B. A body part has a B and a B, so it makes sense to speak about the body of a body part. Since a body part is just a kind of entity, it's represented by an instance of B. =item entity An "entity" means either a B or a B. All entities have a B and a B. An entity is represented by an instance of B. There are instance methods for recovering the L (a B) and the L (a B). =item header This is the top portion of the MIME message, which contains the "Content-type", "Content-transfer-encoding", etc. Every MIME entity has a header, represented by an instance of B. You get the header of an entity by sending it a head() message. =item message A "message" generally means the complete (or "top-level") message being transferred on a network. There currently is no explicit package for "messages"; under MIME::, messages are streams of data which may be read in from files or filehandles. You can think of the B returned by the B as representing the full message. =back =head2 Content types This indicates what kind of data is in the MIME message, usually as I. The standard major types are shown below. A more-comprehensive listing may be found in RFC-2046. =over 4 =item application Data which does not fit in any of the other categories, particularly data to be processed by some type of application program. C, C, C... =item audio Audio data. C