MIME-tools-5.509/ 0000755 0000764 0000764 00000000000 13071231525 011542 5 ustar dfs dfs MIME-tools-5.509/ChangeLog 0000644 0000764 0000764 00000131354 13071225105 013320 0 ustar dfs dfs 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.509/t/ 0000755 0000764 0000764 00000000000 13071231525 012005 5 ustar dfs dfs MIME-tools-5.509/t/Ref.t 0000644 0000764 0000764 00000014672 12775011742 012727 0 ustar dfs dfs #!/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.509/t/ticket-22684.t 0000644 0000764 0000764 00000002565 12541013575 014154 0 ustar dfs dfs #!/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.509/t/ticket-60931.t 0000644 0000764 0000764 00000001616 12541013575 014145 0 ustar dfs dfs #!/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.509/t/ticket-43439.t 0000644 0000764 0000764 00000001046 12541013575 014146 0 ustar dfs dfs use 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.509/t/attachment-filename-encoding.t 0000644 0000764 0000764 00000005226 12541013575 017675 0 ustar dfs dfs #!/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.509/t/ticket-119568.t 0000644 0000764 0000764 00000011550 13071230463 014232 0 ustar dfs dfs #!/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 => 'dfs@roaringpenguin.com',
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.509 (Entity 5.509)\nFrom: dfs\@roaringpenguin.com\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 => 'dfs@roaringpenguin.com',
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.509 (Entity 5.509)${delim}From: dfs\@roaringpenguin.com${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 => 'dfs@roaringpenguin.com',
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.509 (Entity 5.509)${delim}From: dfs\@roaringpenguin.com${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 => 'dfs@roaringpenguin.com',
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.509 (Entity 5.509)${delim}From: dfs\@roaringpenguin.com${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}TW9yZSBUZXh0CkxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9u${delim}Z0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5l${delim}TG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdM${delim}aW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxv${delim}bmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25n${delim}TGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVM${delim}b25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xp${delim}bmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9u${delim}Z0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5l${delim}TG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdM${delim}aW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxv${delim}bmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25n${delim}TGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVM${delim}b25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xp${delim}bmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9u${delim}Z0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5l${delim}TG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdM${delim}aW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxv${delim}bmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZQ==${delim}${delim}--foo--${delim}", 'Got expected line endings for Base64 encoding');
MIME-tools-5.509/t/Smtpsend.t 0000644 0000764 0000764 00000004206 12541013575 013775 0 ustar dfs dfs #!/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.509/t/ticket-11901.t 0000644 0000764 0000764 00000007205 12541013575 014136 0 ustar dfs dfs #!/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.509/t/Entity.t 0000644 0000764 0000764 00000022630 12541013575 013455 0 ustar dfs dfs #!/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.509/t/Gauntlet.t 0000644 0000764 0000764 00000005435 12541013575 013770 0 ustar dfs dfs #!/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.509/t/02-pod-coverage.t 0000644 0000764 0000764 00000000427 12541013575 014773 0 ustar dfs dfs use 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.509/t/obfuscated-zip.t 0000644 0000764 0000764 00000000753 12225564741 015127 0 ustar dfs dfs use 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.509/t/ParserPreamble.t 0000644 0000764 0000764 00000001724 12541013575 015106 0 ustar dfs dfs #!/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.509/t/ticket-66025.t 0000644 0000764 0000764 00000000241 12541013575 014136 0 ustar dfs dfs use 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.509/t/99-prepare.t 0000644 0000764 0000764 00000000467 12541013575 014102 0 ustar dfs dfs #!/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.509/t/ParserEncoded.t 0000644 0000764 0000764 00000003521 12541013575 014715 0 ustar dfs dfs #!/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.509/t/ticket-71041.t 0000644 0000764 0000764 00000001010 12541013575 014123 0 ustar dfs dfs use 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.509/t/02-kwalitee.t 0000644 0000764 0000764 00000000446 12541013575 014226 0 ustar dfs dfs BEGIN {
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.509/t/Body.t 0000644 0000764 0000764 00000004453 12541013575 013101 0 ustar dfs dfs #!/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();
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.509/t/02-pod.t 0000644 0000764 0000764 00000000337 12541013575 013202 0 ustar dfs dfs use 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.509/t/Head.t 0000644 0000764 0000764 00000013540 12541013575 013042 0 ustar dfs dfs #!/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.509/t/Filer.t 0000644 0000764 0000764 00000002144 12541013575 013240 0 ustar dfs dfs #!/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.509/t/ticket-65681.t 0000644 0000764 0000764 00000001410 12541013575 014144 0 ustar dfs dfs #!/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.509/t/ticket-37139.t 0000644 0000764 0000764 00000006026 12541013575 014151 0 ustar dfs dfs use 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.509/t/ParamVal.t 0000644 0000764 0000764 00000003551 12543007422 013701 0 ustar dfs dfs use 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.509/t/WordEncoder.t 0000644 0000764 0000764 00000005137 12541013575 014417 0 ustar dfs dfs use 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.509/t/ticket-5462.t 0000644 0000764 0000764 00000000717 12541013575 014064 0 ustar dfs dfs use 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.509/t/ticket-41632.t 0000644 0000764 0000764 00000002466 12541013575 014146 0 ustar dfs dfs use 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.509/t/ticket-52924.t 0000644 0000764 0000764 00000001104 12541013575 014140 0 ustar dfs dfs use 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.509/t/Decoder.t 0000644 0000764 0000764 00000004263 12541013575 013550 0 ustar dfs dfs #!/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.509/t/BodyPrint.t 0000644 0000764 0000764 00000001074 12541013575 014112 0 ustar dfs dfs #!/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.509/t/ticket-80433.t 0000644 0000764 0000764 00000000514 12541013575 014140 0 ustar dfs dfs use 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.509/t/EmptyPart.t 0000644 0000764 0000764 00000001346 12541013575 014127 0 ustar dfs dfs #!/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.509/t/Words.t 0000644 0000764 0000764 00000002367 12541013575 013304 0 ustar dfs dfs #!/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.509/t/WordDecoder.t 0000644 0000764 0000764 00000002256 12541013575 014404 0 ustar dfs dfs #!/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.509/t/Globby.pm 0000644 0000764 0000764 00000001242 12541013575 013564 0 ustar dfs dfs package 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.509/t/Misc.t 0000644 0000764 0000764 00000010110 12541013575 013062 0 ustar dfs dfs #!/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.509/t/ticket-71677.t 0000644 0000764 0000764 00000001157 12541013575 014156 0 ustar dfs dfs #!/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.509/t/Parser.t 0000644 0000764 0000764 00000011736 12541013575 013442 0 ustar dfs dfs #!/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.509/examples/ 0000755 0000764 0000764 00000000000 13071231525 013360 5 ustar dfs dfs MIME-tools-5.509/examples/mimeprint 0000755 0000764 0000764 00000004032 12541013575 015315 0 ustar dfs dfs #!/usr/bin/perl -w
=head1 NAME
mimeprint - parse a MIME stream, and print the parsed entity
=head1 SYNOPSIS
mimeprint
Give usage.
mimeprint [options] infile
Parse a MIME stream from infile (- means stdin), and print
entity to stdout.
=head1 DESCRIPTION
Parse a MIME stream, and output the resulting entity. This is
a nice way of eyeballing whether or not MIME-tools "understood"
your MIME message.
Due to nonuniqueness of MIME encodings, there is a very good chance
that your output will not I resemble your input.
=head1 AUTHOR
Eryq, eryq@zeegee.com
=cut
use lib "./lib";
use strict;
use Getopt::Std;
use vars qw($opt_d $opt_e $opt_h $opt_n $opt_v $opt_s $opt_u);
use MIME::Parser;
# Usage?
$ARGV[0] or die <debugging($opt_v);
# Set up parser:
my $parser = new MIME::Parser;
if ($opt_d) {
$parser->output_to_core(0);
$parser->output_under($opt_d);
}
else {
$parser->output_to_core('ALL');
}
$parser->extract_nested_messages($opt_n) if defined($opt_n);
$parser->extract_uuencode($opt_u || 0);
$parser->decode_headers($opt_h || 0);
$parser->ignore_errors(1);
# Parse:
my $ent = $parser->parse_open($ARGV[0]);
$ent or die "MIME parsing failed!\n";
print STDERR $parser->results->msgs;
if ($opt_e and !$ent->is_multipart) {
supported MIME::Decoder $opt_e or die "unsupported encoding: $opt_e\n";
$ent->head->mime_attr("Content-transfer-encoding" => $opt_e);
}
($opt_s ? $ent->dump_skeleton(\*STDOUT) : $ent->print(\*STDOUT));
1;
MIME-tools-5.509/examples/mimeencode 0000755 0000764 0000764 00000001521 12541013575 015416 0 ustar dfs dfs #!/usr/bin/perl -w
=head1 NAME
mimeencode - encode a file
=head1 SYNOPSIS
mimeencode
Give usage.
mimeencode [-d] encoding outfile
Encode/decode stdin to stdout.
=head1 DESCRIPTION
Encode (or, with -d, decode) stdin with the given encoding,
writing results to stdout.
This does not do MIME parsing; it merely exercises the decoder
modules.
=head1 AUTHOR
Eryq, eryq@zeegee.com
=cut
use lib "./lib";
use strict;
use Getopt::Std;
use vars qw($opt_d);
use MIME::Decoder;
# Usage?
$ARGV[0] or die <outfile
EOF
# Args:
getopts("d");
my $enc = shift @ARGV;
# Get decoder:
my $decoder = new MIME::Decoder $enc or die "unsupported encoding ($enc)\n";
# Do it!
my $action = ($opt_d ? 'decode' : 'encode');
$decoder->$action(\*STDIN, \*STDOUT);
1;
MIME-tools-5.509/examples/mimedump 0000755 0000764 0000764 00000004456 12541013575 015140 0 ustar dfs dfs #!/usr/bin/perl -w
=head1 NAME
mimedump - dump out the contents of a parsed MIME message
=head1 DESCRIPTION
Read a MIME stream from the stdin, and dump its contents to the stdout.
=head1 SYNOPSIS
mimedump < mime.msg
=head1 AUTHOR
Andreas Koenig suggested this, and wrote the original code.
Eryq perverted the hell out of it.
=cut
use MIME::Parser;
#------------------------------
#
# dump_entity ENTITY, NAME
#
# Recursive routine for dumping an entity.
#
sub dump_entity {
my ($entity, $name) = @_;
defined($name) or $name = "'anonymous'";
my $IO;
# Output the head:
print "\n", '=' x 60, "\n";
print "Message $name: ";
print "\n", '=' x 60, "\n\n";
print $entity->head->original_text;
print "\n";
# Output the body:
my @parts = $entity->parts;
if (@parts) { # multipart...
my $i;
foreach $i (0 .. $#parts) { # dump each part...
dump_entity($parts[$i], ("$name, part ".(1+$i)));
}
}
else { # single part...
# Get MIME type, and display accordingly...
my ($type, $subtype) = split('/', $entity->head->mime_type);
my $body = $entity->bodyhandle;
if ($type =~ /^(text|message)$/) { # text: display it...
if ($IO = $body->open("r")) {
print $_ while (defined($_ = $IO->getline));
$IO->close;
}
else { # d'oh!
print "$0: couldn't find/open '$name': $!";
}
}
else { # binary: just summarize it...
my $path = $body->path;
my $size = ($path ? (-s $path) : '???');
print ">>> This is a non-text message, $size bytes long.\n";
print ">>> It is stored in ", ($path ? "'$path'" : 'core'),".\n\n";
}
}
1;
}
#------------------------------
#
# main
#
sub main {
print STDERR "(reading from stdin)\n" if (-t STDIN);
# Create a new MIME parser:
my $parser = new MIME::Parser;
# Create and set the output directory:
(-d "mimedump-tmp") or mkdir "mimedump-tmp",0755 or die "mkdir: $!";
(-w "mimedump-tmp") or die "can't write to directory";
$parser->output_dir("mimedump-tmp");
# Read the MIME message:
$entity = $parser->read(\*STDIN) or die "couldn't parse MIME stream";
# Dump it out:
dump_entity($entity);
}
exit(&main ? 0 : -1);
#------------------------------
1;
MIME-tools-5.509/examples/mimeref 0000755 0000764 0000764 00000006064 12541013575 014744 0 ustar dfs dfs #!/usr/bin/perl -w
=head1 NAME
mimeref - create a .ref file for a message
=head1 SYNOPSIS
Usage:
mimeref [-options] *.msg
Options:
-d DIR Output directory for parser (default is ./testout/mimeref)
-w Write the .ref file
=head1 DESCRIPTION
Parse a message file, and spit out a .ref file.
The .ref files are not really useful; they're just used by
the t/Ref.t test.
=head1 AUTHOR
Eryq, eryq@zeegee.com
=cut
use strict;
use lib "./lib";
use MIME::Parser;
use File::Path;
use Getopt::Std;
use Data::Dumper;
### Get options:
my %opts;
getopts("d:wv", \%opts) || die "usage error ($!)\n";
my (@msgs) = @ARGV; @msgs or die "missing message\n";
### Get path to output space:
my $output_base = $opts{'d'} || "./testout/mimeref";
(-d $output_base) or mkdir($output_base, 0777) or die "mkdir $output_base: $!\n";
MIME::Tools->debugging($opts{'v'});
$Data::Dumper::Terse = 1;
$Data::Dumper::Indent = 1;
$Data::Dumper::Useqq = 1;
foreach my $msg (@msgs) {
do_msg($msg);
}
exit 0;
#------------------------------
sub do_msg {
my $msg = shift;
### Create a parser:
my $parser = new MIME::Parser;
$parser->output_under($output_base);
$parser->extract_nested_messages(1);
### Parse:
my $ent = eval { $parser->parse_open($msg) || die "parse failed: $!\n"; };
if (!$ent) {
rmtree $parser->output_dir;
die $@;
}
### Decompose:
my $ref = {};
$ref->{Parser} = {
Name => "anonymous",
Message => $msg,
OutputToCore => $parser->output_to_core,
ExtractNested => $parser->extract_nested_messages,
};
summarize($ref, $ent);
$ent->dump_skeleton() if $opts{'v'};
if ($opts{'w'}) {
my $refpath = $msg;
$refpath =~ s/\.msg$//; $refpath .= ".ref";
open OUT, ">$refpath" or die "$refpath: $!\n";
print OUT Dumper($ref);
close OUT;
print STDERR "Wrote: $refpath\n";
}
else {
print Dumper($ref);
}
rmtree $parser->output_dir;
}
#------------------------------
sub set {
my ($hash, $param, $val) = @_;
if (defined($val)) {
$hash->{$param} = $val;
}
}
sub c {
my $x = shift;
$x =~ s/\r?\n$// if defined($x);
$x;
}
#------------------------------
sub summarize {
my ($ref, $ent, $name) = @_;
$name ||= "Msg";
my $head = $ent->head;
$head->unfold;
my $body = $ent->bodyhandle;
my $sum = {};
set($sum, From => c($head->get("From", 0)));
set($sum, To => c($head->get("To", 0)));
set($sum, Subject => c($head->get("Subject", 0)));
set($sum, Type => $head->mime_type);
set($sum, Encoding=> $head->mime_encoding);
set($sum, Charset => $head->mime_attr("content-type.charset"));
set($sum, Boundary => $head->multipart_boundary);
set($sum, Disposition => $head->mime_attr("content-disposition"));
set($sum, Filename => $head->recommended_filename);
if ($body and $body->path) {
set($sum, Size => (-s $body->path));
}
$ref->{$name} = $sum;
my $root = (($name eq 'Msg') ? 'Part' : $name);
for (1 .. $ent->parts) {
summarize($ref, $ent->parts($_ - 1), "${root}_$_");
}
}
1;
MIME-tools-5.509/examples/mimetour 0000755 0000764 0000764 00000001474 12541013575 015161 0 ustar dfs dfs #!/usr/bin/perl -w
=head1 NAME
mimetour - tour the possible encodings
=head1 SYNOPSIS
mimetour
Just run it.
=head1 DESCRIPTION
Parse a message into core, and output it in all supported encodings.
=head1 AUTHOR
Eryq, eryq@zeegee.com
=cut
use strict;
use lib "./lib";
use MIME::Parser;
# The message:
my $msg = <
Hello world!
EOF
# Parse:
my $parser = new MIME::Parser;
$parser->output_to_core('ALL');
my $entity = $parser->parse_data($msg);
# Tour:
my $enc;
foreach $enc (sort (keys %{supported MIME::Decoder})) {
print '-'x60, "\n";
$entity->head->replace('Content-transfer-encoding', $enc);
$entity->print(\*STDOUT);
print '-'x60, "\n\n";
}
1;
MIME-tools-5.509/examples/mimesender 0000755 0000764 0000764 00000001717 12541013575 015450 0 ustar dfs dfs #!/usr/bin/perl
=head1 NAME
mimesender - an example of integrating MIME-tools with Mail::Send.
=head1 SYNOPSIS
Usage:
mimesender YOU@YOUR.HOST
=head1 DESCRIPTION
This just fakes up a little message and sends it by using Mail::Send
and the 'sendmail' handler.
=head1 AUTHOR
Eryq, eryq@zeegee.com.
=cut
use Mail::Send;
use MIME::Entity 4.113;
use File::Spec;
### Args?
my ($to) = @ARGV;
$to or die "Usage: mimesender toaddr\n";
### Create MIME entity, with attachment, sent to us:
my $ent = MIME::Entity->build(From => "secret\@admirer.net",
To => $to,
Subject => 'Hello there!',
Data => "Saluations...");
$ent->attach(Type => 'text/plain',
Data => "...and Felicitations!");
### Send it:
$sender = new Mail::Send;
foreach ($ent->head->tags) { # give the sender our headers
$sender->set($_, map {chomp $_; $_} $ent->head->get($_));
}
$fh = $sender->open('sendmail');
$ent->print_body($fh);
$fh->close;
MIME-tools-5.509/examples/README 0000644 0000764 0000764 00000000457 12541013575 014252 0 ustar dfs dfs THE PROGRAMS IN THIS DIRECTORY ARE CURRENTLY UNSUPPORTED EXAMPLES.
Examine them, hack them up, learn from them, etc. They'll be
nicer in the future, I promise...
Many of these example programs will only work under Unix.
If you are a Win32 user, stick to examples shown in the modules
themselves.
MIME-tools-5.509/examples/mimeabuse 0000755 0000764 0000764 00000002312 12541013575 015257 0 ustar dfs dfs #!/usr/bin/perl -w
=head1 NAME
mimeabuse - try hard to break MIME parsing
=head1 DESCRIPTION
This is meant to be run from the MIME-tools distribution directory
as a test. It will attempt to parse the same several messages 1000
times each. It does a purge after each parse, so it shouldn't fill up
your disk; however, it should be a good test for hitting resource
limits.
I wrote this after I discovered that, under Perl 5.002 at least,
FileHandle->new_tmpfile returned an object that did not get
destructed automatically when it exited scope. :-(
=head1 AUTHOR
Eryq, eryq@zeegee.com
=cut
use MIME::Parser;
my $parser = new MIME::Parser;
((-d "./testin") && (-d "./testout")) or
die "run this from the MIME-tools distribution directory";
$parser->output_dir("./testout");
$parser->output_to_core("NONE");
foreach $input (
'multi-simple.msg',
'multi-nested3.msg',
'mp-msg-rfc822.msg'
) {
$parser->parse_nested_messages($input eq 'mp-msg-rfc822.msg');
for ($i = 0; $i < 1000; $i++) {
print STDERR "$input: i = $i\n";
open IN, "testin/$input" or die "open testin/$input: $!";
$entity = $parser->read(\*IN) or die "MIME error";
close IN;
$entity->purge;
}
}
print "Who-hooo! Done!\n";
MIME-tools-5.509/examples/mimesend 0000755 0000764 0000764 00000006100 12541013575 015110 0 ustar dfs dfs #!/usr/bin/perl -w
=head1 NAME
mimesend - send files via MIME mail, from the command line
=head1 USAGE
Pretty basic:
mimesend [-n] [-t to] [-s subj] (-f file [-m type])+
-n Don't actually send it; just print it to stdout.
-t to The "to" address.
-s subj The subject of the message.
-f file Path to attached file, or - for STDIN.
-m type MIME type of previous -f; therefore -m must follow -f.
For example:
mimesend -t you@yourhost.com -s "Hello, nurse!"
-f greetings.htm -f foo.gif
=head1 AUTHOR
Eryq, eryq@zeegee.com
8 Jan 1997
=cut
use lib "./lib";
use MIME::Entity;
# Lookup table:
my %TypeFor = qw(
txt text/plain
sh text/x-sh
csh text/x-csh
pm text/x-perl
pl text/x-perl
jpg image/jpeg
jpeg image/jpeg
gif image/gif
tif image/tiff
tiff image/tiff
xbm image/xbm
pdf application/pdf
);
# Usage:
@ARGV or die <.\n";
}
# Verify destination:
$to or die "$0: missing [-t to]\n";
# Verify subject:
$subj or die "$0: missing [-s subject]\n";
# Start with top-level entity:
my $top;
if (!@files) {
die "$0: no files specified!\n";
}
elsif (@files == 1) {
my ($path, $type) = @{$files[0]};
# Build:
$top = build MIME::Entity
Type => ($type || type_for($path)),
$path eq '-' ? (Data => [<>]) : (Path => $path),
Encoding => '-SUGGEST';
$top->head->add('To', $to);
$top->head->add('Subject', $subj);
}
else {
# Start with top:
$top = build MIME::Entity Type=>"multipart/mixed";
$top->head->add('To', $to);
$top->head->add('Subject', $subj);
# Attach files:
foreach (@files) {
my ($path, $type) = @{$_};
$top->attach(Type => ($type || type_for($path)),
Path => $path,
Encoding => '-SUGGEST');
}
}
# Launch mailer and send message?
if (!$nosend) {
open SENDMAIL, "|/usr/lib/sendmail -t -oi -oem"
or die "$0: open sendmail: $!\n";
$top->print(\*SENDMAIL);
close SENDMAIL;
die "sendmail failed" if ($? >> 255);
}
else {
$top->print(\*STDOUT);
}
1;
MIME-tools-5.509/examples/mimeexplode 0000755 0000764 0000764 00000006433 12541013575 015630 0 ustar dfs dfs #!/usr/bin/perl -w
=head1 NAME
mimeexplode - explode one or more MIME messages
=head1 SYNOPSIS
mimeexplode ...
someprocess | mimeexplode -
=head1 DESCRIPTION
Takes one or more files from the command line that contain MIME
messages, and explodes their contents out into subdirectories
of the current working directory. The subdirectories are
just called C, C, C, etc. Existing directories are
skipped over.
The message information is output to the stdout, like this:
Message: msg3 (inputfile1.msg)
Part: msg3/filename-1.dat (text/plain)
Part: msg3/filename-2.dat (text/plain)
Message: msg5 (input-file2.msg)
Part: msg5/dir.gif (image/gif)
Part: msg5/face.jpg (image/jpeg)
Message: msg6 (infile3)
Part: msg6/filename-1.dat (text/plain)
This was written as an example of the MIME:: modules in the
MIME-parser package I wrote. It may prove useful as a quick-and-dirty
way of splitting a MIME message if you need to decode something, and
you don't have a MIME mail reader on hand.
=head1 COMMAND LINE OPTIONS
None yet.
=head1 AUTHOR
Eryq C, in a big hurry...
=cut
BEGIN { unshift @INC, ".." } # to test MIME:: stuff before installing it!
require 5.001;
use strict;
use vars qw($Msgno);
use MIME::Parser;
use Getopt::Std;
#------------------------------------------------------------
# make_msg - make and return the name of a msgXXX directory
#------------------------------------------------------------
$Msgno = 0;
sub make_msg {
while (-d "msg$Msgno") {
++$Msgno;
die "self-imposed limit reached" if $Msgno == 256;
}
mkdir "msg$Msgno",0755 or die "couldn't make msg$Msgno: $!";
"msg$Msgno";
}
#------------------------------------------------------------
# dump_entity - dump an entity's file info
#------------------------------------------------------------
sub dump_entity {
my $ent = shift;
my @parts = $ent->parts;
if (@parts) { # multipart...
map { dump_entity($_) } @parts;
}
else { # single part...
print " Part: ", $ent->bodyhandle->path,
" (", scalar($ent->head->mime_type), ")\n";
}
}
#------------------------------------------------------------
# main
#------------------------------------------------------------
sub main {
my $file;
my $entity;
# Sanity:
(-w ".") or die "cwd not writable, you naughty boy...";
# Go through messages:
@ARGV or unshift @ARGV, "-";
while (defined($file = shift @ARGV)) {
my $msgdir = make_msg();
print "Message: $msgdir ($file)\n";
# Create a new parser object:
my $parser = new MIME::Parser;
### $parser->parse_nested_messages('REPLACE');
# Optional: set up parameters that will affect how it extracts
# documents from the input stream:
$parser->output_dir($msgdir);
# Parse an input stream:
open FILE, $file or die "couldn't open $file";
$entity = $parser->read(\*FILE) or
print STDERR "Couldn't parse MIME in $file; continuing...\n";
close FILE;
# Congratulations: you now have a (possibly multipart) MIME entity!
dump_entity($entity) if $entity;
### $entity->dump_skeleton if $entity;
}
1;
}
exit (&main ? 0 : -1);
#------------------------------------------------------------
1;
MIME-tools-5.509/examples/mimepostcard 0000755 0000764 0000764 00000005264 12541013575 016010 0 ustar dfs dfs #!/usr/bin/perl -w
=head1 NAME
mimepostcard - send/output a multipart/alternative message
=head1 SYNOPSIS
Usage:
mimepostcard /path/to/some/graphic.jpg to@addr.com
You can point it at a .gif file as well.
The special address "-" just causes the message to go to STDOUT.
=head1 DESCRIPTION
This sends a mesasge both as HTML and plain text.
I use "Data"; you would probably use "Path".
=head1 AUTHOR
Eryq, eryq@zeegee.com
=cut
use MIME::Entity;
use strict;
use Getopt::Std;
$SIG{__DIE__} = sub { die "mime_postcard: $_[0]\n" };
#------------------------------
# usage
#------------------------------
sub usage {
my $problem = join '',@_;
print STDERR "\n";
print STDERR "Error: $problem\n" if $problem;
my @usage;
if (open O, '<'.$0){
local($/) = "\n";
1 while (defined($_ = ) and !/^=head1\s+SYNOPSIS/);
push @usage, $_ while (defined($_ = ) and !/^=/);
close O;
}
my $u = join '', @usage; $u =~ s/\A\n+//;
$u =~ s{\n\n+(\s+)}{\n$1}g;
print STDERR $u, "\n";
exit -1;
}
#------------------------------
# main
#------------------------------
sub main {
### Get options:
my %opts;
getopts("", \%opts);
### Get graphic:
my $graphic = shift @ARGV || usage "missing path to graphic\n";
(-r $graphic) or die "$graphic unreadable\n";
my $graphic_type;
if ($graphic =~ /\.gif$/i) { $graphic_type = "image/gif" }
elsif ($graphic =~ /\.jpe?g$/i) { $graphic_type = "image/jpeg" }
elsif ($graphic =~ /\.png$/i) { $graphic_type = "image/png" }
else { die "unknown type for: $graphic\n"; }
my $gid = "my-graphic";
### Get destination:
my $dest = shift @ARGV || usage "missing destination\n";
### The top-level message:
my $msg = MIME::Entity->build(To => $dest,
Subject => 'A postcard for you',
Type => 'multipart/alternative');
### Alternative #1 is the plain text:
my $plain = $msg->attach(Type => 'text/plain',
Data => ["Having a wonderful time... \n",
"wish you were looking at HTML \n",
"instead of this boring text!\n"]);
### Alternative #2 is the HTML-with-content:
my $fancy = $msg->attach(Type => 'multipart/related');
$fancy->attach(Type => 'text/html',
Data => [qq< Hey there!
\n>,
qq< Having a wonderful time... \n>,
qq< take a look!\n >,
qq<

>
]);
$fancy->attach(Type => $graphic_type,
Path => $graphic,
Id => $gid);
### Print or send:
if ($dest eq '-') {
$msg->print;
}
else {
$msg->smtpsend();
}
}
eval { main() }; die "$0: $@" if $@;
MIME-tools-5.509/testmsgs/ 0000755 0000764 0000764 00000000000 13071231525 013413 5 ustar dfs dfs MIME-tools-5.509/testmsgs/uu-junk-extracted.ref 0000644 0000764 0000764 00000002011 12541013575 017466 0 ustar dfs dfs {
"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.509/testmsgs/multi-2evil.ref 0000644 0000764 0000764 00000001630 12541013575 016266 0 ustar dfs dfs {
"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.509/testmsgs/multi-nested2.msg 0000644 0000764 0000764 00000006201 12541013575 016622 0 ustar dfs dfs MIME-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.509/testmsgs/multi-clen.ref 0000644 0000764 0000764 00000001350 12541013575 016165 0 ustar dfs dfs {
"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.509/testmsgs/ticket-60931.msg 0000644 0000764 0000764 00000000566 12541013575 016101 0 ustar dfs dfs 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.509/testmsgs/bluedot-simple.ref 0000644 0000764 0000764 00000000475 12541013575 017050 0 ustar dfs dfs {
"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.509/testmsgs/hdr-fakeout-newmailtools-ref 0000644 0000764 0000764 00000000557 12706225305 021046 0 ustar dfs dfs {
"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.509/testmsgs/multi-digest.msg 0000644 0000764 0000764 00000001400 12541013575 016531 0 ustar dfs dfs From: 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.509/testmsgs/multi-frag.msg 0000644 0000764 0000764 00000006252 12541013575 016203 0 ustar dfs dfs MIME-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.509/testmsgs/ak-0696-nest.ref 0000644 0000764 0000764 00000001652 12541013575 016065 0 ustar dfs dfs {
"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.509/testmsgs/multi-weirdspace.ref 0000644 0000764 0000764 00000001503 12541013575 017372 0 ustar dfs dfs {
"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.509/testmsgs/multi-igor.msg 0000644 0000764 0000764 00000024514 12541013575 016225 0 ustar dfs dfs Date: 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.509/testmsgs/re-fwd.msg 0000644 0000764 0000764 00000001413 12541013575 015312 0 ustar dfs dfs 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: 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.509/testmsgs/double-semicolon2.msg 0000644 0000764 0000764 00000000360 12541013575 017450 0 ustar dfs dfs Mime-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.509/testmsgs/multi-igor.ref 0000644 0000764 0000764 00000001765 12541013575 016216 0 ustar dfs dfs {
"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.509/testmsgs/attachment-filename-encoding-Latin1.msg 0000644 0000764 0000764 00000001070 12541013575 022745 0 ustar dfs dfs MIME-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.509/testmsgs/hdr-fakeout.ref 0000644 0000764 0000764 00000000267 12541013575 016333 0 ustar dfs dfs {
"Parser" => {
"Message" => "testmsgs/hdr-fakeout.msg",
"ExtractNested" => 1,
"OutputToCore" => "0",
"Name" => "anonymous"
},
"Msg" => {
Fail => 1,
}
}
MIME-tools-5.509/testmsgs/multi-nested2.ref 0000644 0000764 0000764 00000003376 12541013575 016622 0 ustar dfs dfs {
"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.509/testmsgs/dup-names.ref 0000644 0000764 0000764 00000002001 12541013575 015777 0 ustar dfs dfs {
"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.509/testmsgs/simple.ref 0000644 0000764 0000764 00000000541 12541013575 015406 0 ustar dfs dfs {
"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.509/testmsgs/russian.ref 0000644 0000764 0000764 00000000410 12541013575 015574 0 ustar dfs dfs {
"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.509/testmsgs/bluedot-postcard.ref 0000644 0000764 0000764 00000001576 12541013575 017401 0 ustar dfs dfs {
"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.509/testmsgs/ak-0696-replace.ref 0000644 0000764 0000764 00000001503 12541013575 016522 0 ustar dfs dfs {
"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.509/testmsgs/multi-nested3.ref 0000644 0000764 0000764 00000003371 12541013575 016616 0 ustar dfs dfs {
"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.509/testmsgs/multi-clen.msg 0000644 0000764 0000764 00000002431 12541013575 016200 0 ustar dfs dfs From: 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.509/testmsgs/ak-0696-none.ref 0000644 0000764 0000764 00000001233 12541013575 016046 0 ustar dfs dfs {
"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.509/testmsgs/multi-simple.ref 0000644 0000764 0000764 00000001146 12541013575 016540 0 ustar dfs dfs {
"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.509/testmsgs/multi-nested.msg 0000644 0000764 0000764 00000006201 12541013575 016540 0 ustar dfs dfs MIME-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.509/testmsgs/german.ref 0000644 0000764 0000764 00000000631 12541013575 015366 0 ustar dfs dfs {
"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.509/testmsgs/uu-junk-target.msg 0000644 0000764 0000764 00000021611 12541013575 017012 0 ustar dfs dfs 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
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.509/testmsgs/double-semicolon.msg 0000644 0000764 0000764 00000000340 12541013575 017364 0 ustar dfs dfs Mime-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.509/testmsgs/uu-zeegee.msg 0000644 0000764 0000764 00000015470 12541013575 016031 0 ustar dfs dfs From: 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;8`"!A"A0?"#P2<0\[`$ZUD!?%D0\Q`$&;JA$J&.
M&HB7"=&$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.509/testmsgs/attachment-filename-encoding-UTF8.msg 0000644 0000764 0000764 00000001073 12541013575 022346 0 ustar dfs dfs MIME-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.509/testmsgs/malformed-content-type-zip.msg 0000644 0000764 0000764 00000001200 12541013575 021315 0 ustar dfs dfs MIME-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.509/testmsgs/hdr-fakeout.msg 0000644 0000764 0000764 00000000776 12541013575 016352 0 ustar dfs dfs Received: (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.509/testmsgs/bluedot-simple.msg 0000644 0000764 0000764 00000013472 12541013575 017063 0 ustar dfs dfs 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
MIME-tools-5.509/testmsgs/german.msg 0000644 0000764 0000764 00000007601 12541013575 015404 0 ustar dfs dfs 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
MIME-tools-5.509/testmsgs/multi-nested.ref 0000644 0000764 0000764 00000003375 12541013575 016537 0 ustar dfs dfs {
"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.509/testmsgs/uu-junk.ref 0000644 0000764 0000764 00000001142 12541013575 015511 0 ustar dfs dfs {
"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.509/testmsgs/russian.msg 0000644 0000764 0000764 00000000273 12541013575 015615 0 ustar dfs dfs Content-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.509/testmsgs/multi-simple.msg 0000644 0000764 0000764 00000001175 12541013575 016554 0 ustar dfs dfs From: 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.509/testmsgs/german-qp.msg 0000644 0000764 0000764 00000001231 12541013575 016013 0 ustar dfs dfs Content-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.509/testmsgs/multi-weirdspace.msg 0000644 0000764 0000764 00000004375 12541013575 017416 0 ustar dfs dfs Return-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.509/testmsgs/uu-zeegee.ref 0000644 0000764 0000764 00000001302 12541013575 016004 0 ustar dfs dfs {
"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.509/testmsgs/bluedot-postcard.msg 0000644 0000764 0000764 00000015434 12541013575 017411 0 ustar dfs dfs Content-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!

------------=_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.509/testmsgs/dup-names.msg 0000644 0000764 0000764 00000007333 12541013575 016026 0 ustar dfs dfs Return-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.509/testmsgs/re-fwd.ref 0000644 0000764 0000764 00000001334 12541013575 015302 0 ustar dfs dfs {
"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.509/testmsgs/frag.msg 0000644 0000764 0000764 00000252776 12541013575 015071 0 ustar dfs dfs From - 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.509/testmsgs/multi-igor2.ref 0000644 0000764 0000764 00000001766 12541013575 016301 0 ustar dfs dfs {
"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.509/testmsgs/multi-2gifs.ref 0000644 0000764 0000764 00000002025 12541013575 016256 0 ustar dfs dfs {
"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.509/testmsgs/uu-junk.msg 0000644 0000764 0000764 00000020621 12541013575 015526 0 ustar dfs dfs From - 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;8`"!A"A0?"#P2<0\[`$ZUD!?%D0\Q`$&;JA$J&.
M&HB7"=&$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.509/testmsgs/empty-preamble.msg 0000644 0000764 0000764 00000001642 12541013575 017055 0 ustar dfs dfs Content-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.509/testmsgs/multi-2evil.msg 0000644 0000764 0000764 00000005004 12541013575 016277 0 ustar dfs dfs Return-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.509/testmsgs/multi-digest.ref 0000644 0000764 0000764 00000001636 12541013575 016532 0 ustar dfs dfs {
"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.509/testmsgs/simple.msg 0000644 0000764 0000764 00000001235 12541013575 015421 0 ustar dfs dfs Return-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.509/testmsgs/multi-2gifs.msg 0000644 0000764 0000764 00000004506 12541013575 016276 0 ustar dfs dfs Return-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.509/testmsgs/multi-nested3.msg 0000644 0000764 0000764 00000006174 12541013575 016634 0 ustar dfs dfs MIME-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.509/testmsgs/multi-igor2.msg 0000644 0000764 0000764 00000024514 12541013575 016307 0 ustar dfs dfs Date: 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.509/testmsgs/ak-0696.msg 0000644 0000764 0000764 00000011212 12541013575 015121 0 ustar dfs dfs From 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.509/MYMETA.json 0000644 0000764 0000764 00000003063 13071220710 013425 0 ustar dfs dfs {
"abstract" : "Tools to manipulate MIME messages",
"author" : [
"Eryq , Dianne Skoll , Dave O'Neill "
],
"dynamic_config" : 0,
"generated_by" : "Module::Install version 1.14, CPAN::Meta::Converter version 2.142690",
"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.508",
"x_module_name" : "MIME::Tools"
}
MIME-tools-5.509/lib/ 0000755 0000764 0000764 00000000000 13071231525 012310 5 ustar dfs dfs MIME-tools-5.509/lib/MIME/ 0000755 0000764 0000764 00000000000 13071231525 013037 5 ustar dfs dfs MIME-tools-5.509/lib/MIME/Body.pm 0000644 0000764 0000764 00000037426 13071220635 014306 0 ustar dfs dfs package MIME::Body;
=head1 NAME
MIME::Body - the body of a 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...
=head2 Obtaining bodies
### Get the bodyhandle of a MIME::Entity object:
$body = $entity->bodyhandle;
### Create a body which stores data in a disk file:
$body = new MIME::Body::File "/path/to/file";
### Create a body which stores data in an in-core array:
$body = new MIME::Body::InCore \@strings;
=head2 Opening, closing, and using IO handles
### Write data to the body:
$IO = $body->open("w") || die "open body: $!";
$IO->print($message);
$IO->close || die "close I/O handle: $!";
### Read data from the body (in this case, line by line):
$IO = $body->open("r") || die "open body: $!";
while (defined($_ = $IO->getline)) {
### do stuff
}
$IO->close || die "close I/O handle: $!";
=head2 Other I/O
### Dump the ENCODED body data to a filehandle:
$body->print(\*STDOUT);
### Slurp all the UNENCODED data in, and put it in a scalar:
$string = $body->as_string;
### Slurp all the UNENCODED data in, and put it in an array of lines:
@lines = $body->as_lines;
=head2 Working directly with paths to underlying files
### Where's the data?
if (defined($body->path)) { ### data is on disk:
print "data is stored externally, in ", $body->path;
}
else { ### data is in core:
print "data is already in core, and is...\n", $body->as_string;
}
### Get rid of anything on disk:
$body->purge;
=head1 DESCRIPTION
MIME messages can be very long (e.g., tar files, MPEGs, etc.) or very
short (short textual notes, as in ordinary mail). Long messages
are best stored in files, while short ones are perhaps best stored
in core.
This class is an attempt to define a common interface for objects
which contain message data, regardless of how the data is
physically stored. The lifespan of a "body" object
usually looks like this:
=over 4
=item 1.
B
It's at this point that the actual MIME::Body subclass is chosen,
and new() is invoked. (For example: if the body data is going to
a file, then it is at this point that the class MIME::Body::File,
and the filename, is chosen).
=item 2.
B (usually by the MIME parser) like this:
The body is opened for writing, via C. This will trash any
previous contents, and return an "I/O handle" opened for writing.
Data is written to this I/O handle, via print().
Then the I/O handle is closed, via close().
=item 3.
B (usually by the user application) like this:
The body is opened for reading by a user application, via C.
This will return an "I/O handle" opened for reading.
Data is read from the I/O handle, via read(), getline(), or getlines().
Then the I/O handle is closed, via close().
=item 4.
B
=back
You can write your own subclasses, as long as they follow the
interface described below. Implementers of subclasses should assume
that steps 2 and 3 may be repeated any number of times, and in
different orders (e.g., 1-2-2-3-2-3-3-3-3-3-2-4).
In any case, once a MIME::Body has been created, you ask to open it
for reading or writing, which gets you an "i/o handle": you then use
the same mechanisms for reading from or writing to that handle, no matter
what class it is.
Beware: unless you know for certain what kind of body you have, you
should I assume that the body has an underlying filehandle.
=head1 PUBLIC INTERFACE
=over 4
=cut
### Pragmas:
use strict;
use vars qw($VERSION);
### System modules:
use Carp;
use IO::File;
### The package version, both in 1.23 style *and* usable by MakeMaker:
$VERSION = "5.509";
#------------------------------
=item new ARGS...
I
Create a new body. Any ARGS are sent to init().
=cut
sub new {
my $self = bless {}, shift;
$self->init(@_);
$self;
}
#------------------------------
=item init ARGS...
I
This is called automatically by C, with the arguments given
to C. The arguments are optional, and entirely up to the
subclass. The default method does nothing,
=cut
sub init { 1 }
#------------------------------
=item as_lines
I
Return the contents of the body as an array of lines (each terminated
by a newline, with the possible exception of the final one).
Returns empty on failure (NB: indistinguishable from an empty body!).
Note: the default method gets the data via
repeated getline() calls; your subclass might wish to override this.
=cut
sub as_lines {
my $self = shift;
my @lines;
my $io = $self->open("r") || return ();
local $_;
push @lines, $_ while (defined($_ = $io->getline()));
$io->close;
@lines;
}
#------------------------------
=item as_string
I
Return the body data as a string (slurping it into core if necessary).
Best not to do this unless you're I that the body is reasonably small!
Returns empty string for an empty body, and undef on failure.
Note: the default method uses print(), which gets the data via
repeated read() calls; your subclass might wish to override this.
=cut
sub as_string {
my $self = shift;
my $str = '';
my $fh = IO::File->new(\$str, '>:') or croak("Cannot open in-memory file: $!");
$self->print($fh);
close($fh);
return $str;
}
*data = \&as_string; ### silently invoke preferred usage
#------------------------------
=item binmode [ONOFF]
I
With argument, flags whether or not open() should return an I/O handle
which has binmode() activated. With no argument, just returns the
current value.
=cut
sub binmode {
my ($self, $onoff) = @_;
$self->{MB_Binmode} = $onoff if (@_ > 1);
$self->{MB_Binmode};
}
#------------------------------
=item is_encoded [ONOFF]
I
If set to yes, no decoding is applied on output. This flag is set
by MIME::Parser, if the parser runs in decode_bodies(0) mode, so the
content is handled unmodified.
=cut
sub is_encoded {
my ($self, $yesno) = @_;
$self->{MB_IsEncoded} = $yesno if (@_ > 1);
$self->{MB_IsEncoded};
}
#------------------------------
=item dup
I
Duplicate the bodyhandle.
I external data in bodyhandles is I copied to new files!
Changing the data in one body's data file, or purging that body,
I affect its duplicate. Bodies with in-core data probably need
not worry.
=cut
sub dup {
my $self = shift;
bless { %$self }, ref($self); ### shallow copy ok for ::File and ::Scalar
}
#------------------------------
=item open READWRITE
I
This should do whatever is necessary to open the body for either
writing (if READWRITE is "w") or reading (if mode is "r").
This method is expected to return an "I/O handle" object on success,
and undef on error. An I/O handle can be any object that supports a
small set of standard methods for reading/writing data.
See the IO::Handle class for an example.
=cut
sub open {
undef;
}
#------------------------------
=item path [PATH]
I
If you're storing the body data externally (e.g., in a disk file), you'll
want to give applications the ability to get at that data, for cleanup.
This method should return the path to the data, or undef if there is none.
Where appropriate, the path I be a simple string, like a filename.
With argument, sets the PATH, which should be undef if there is none.
=cut
sub path {
my $self = shift;
$self->{MB_Path} = shift if @_;
$self->{MB_Path};
}
#------------------------------
=item print FILEHANDLE
I
Output the body data to the given filehandle, or to the currently-selected
one if none is given.
=cut
sub print {
my ($self, $fh) = @_;
my $nread;
### Get output filehandle, and ensure that it's a printable object:
$fh ||= select;
### Write it:
my $buf = '';
my $io = $self->open("r") || return undef;
$fh->print($buf) while ($nread = $io->read($buf, 8192));
$io->close;
return defined($nread); ### how'd we do?
}
#------------------------------
=item purge
I
Remove any data which resides external to the program (e.g., in disk files).
Immediately after a purge(), the path() should return undef to indicate
that the external data is no longer available.
=cut
sub purge {
1;
}
=back
=head1 SUBCLASSES
The following built-in classes are provided:
Body Stores body When open()ed,
class: data in: returns:
--------------------------------------------------------
MIME::Body::File disk file IO::Handle
MIME::Body::Scalar scalar IO::Handle
MIME::Body::InCore scalar array IO::Handle
=cut
#------------------------------------------------------------
package MIME::Body::File;
#------------------------------------------------------------
=head2 MIME::Body::File
A body class that stores the data in a disk file. Invoke the
constructor as:
$body = new MIME::Body::File "/path/to/file";
In this case, the C method would return the given path,
so you I say:
if (defined($body->path)) {
open BODY, $body->path or die "open: $!";
while () {
### do stuff
}
close BODY;
}
But you're best off not doing this.
=cut
### Pragmas:
use vars qw(@ISA);
use strict;
### System modules:
use IO::File;
### Kit modules:
use MIME::Tools qw(whine);
@ISA = qw(MIME::Body);
#------------------------------
# init PATH
#------------------------------
sub init {
my ($self, $path) = @_;
$self->path($path); ### use it as-is
$self;
}
#------------------------------
# open READWRITE
#------------------------------
sub open {
my ($self, $mode) = @_;
my $path = $self->path;
if( $mode ne 'r' && $mode ne 'w' ) {
die "bad mode: '$mode'";
}
my $IO = IO::File->new($path, $mode) || die "MIME::Body::File->open $path: $!";
$IO->binmode() if $self->binmode;
return $IO;
}
#------------------------------
# purge
#------------------------------
# Unlink the path (and undefine it).
#
sub purge {
my $self = shift;
if (defined($self->path)) {
unlink $self->path or whine "couldn't unlink ".$self->path.": $!";
$self->path(undef);
}
1;
}
#------------------------------------------------------------
package MIME::Body::Scalar;
#------------------------------------------------------------
=head2 MIME::Body::Scalar
A body class that stores the data in-core, in a simple scalar.
Invoke the constructor as:
$body = new MIME::Body::Scalar \$string;
A single scalar argument sets the body to that value, exactly as though
you'd opened for the body for writing, written the value,
and closed the body again:
$body = new MIME::Body::Scalar "Line 1\nLine 2\nLine 3";
A single array reference sets the body to the result of joining all the
elements of that array together:
$body = new MIME::Body::Scalar ["Line 1\n",
"Line 2\n",
"Line 3"];
=cut
use vars qw(@ISA);
use strict;
use Carp;
@ISA = qw(MIME::Body);
#------------------------------
# init DATA
#------------------------------
sub init {
my ($self, $data) = @_;
$data = join('', @$data) if (ref($data) && (ref($data) eq 'ARRAY'));
$self->{MBS_Data} = (defined($data) ? $data : '');
$self;
}
#------------------------------
# as_string
#------------------------------
sub as_string {
shift->{MBS_Data};
}
#------------------------------
# open READWRITE
#------------------------------
sub open {
my ($self, $mode) = @_;
$self->{MBS_Data} = '' if ($mode eq 'w'); ### writing
if ($mode eq 'w') {
$mode = '>:';
} elsif ($mode eq 'r') {
$mode = '<:';
} else {
die "bad mode: $mode";
}
return IO::File->new(\ $self->{MBS_Data}, $mode);
}
#------------------------------------------------------------
package MIME::Body::InCore;
#------------------------------------------------------------
=head2 MIME::Body::InCore
A body class that stores the data in-core.
Invoke the constructor as:
$body = new MIME::Body::InCore \$string;
$body = new MIME::Body::InCore $string;
$body = new MIME::Body::InCore \@stringarray
A simple scalar argument sets the body to that value, exactly as though
you'd opened for the body for writing, written the value,
and closed the body again:
$body = new MIME::Body::InCore "Line 1\nLine 2\nLine 3";
A single array reference sets the body to the concatenation of all
scalars that it holds:
$body = new MIME::Body::InCore ["Line 1\n",
"Line 2\n",
"Line 3"];
=cut
use vars qw(@ISA);
use strict;
use Carp;
@ISA = qw(MIME::Body::Scalar);
#------------------------------
# init DATA
#------------------------------
sub init {
my ($self, $data) = @_;
if (!defined($data)) { ### nothing
$self->{MBS_Data} = '';
}
elsif (!ref($data)) { ### simple scalar
$self->{MBS_Data} = $data;
}
elsif (ref($data) eq 'SCALAR') {
$self->{MBS_Data} = $$data;
}
elsif (ref($data) eq 'ARRAY') {
$self->{MBS_Data} = join('', @$data);
}
else {
croak "I can't handle DATA which is a ".ref($data)."\n";
}
$self;
}
1;
__END__
#------------------------------
=head2 Defining your own subclasses
So you're not happy with files and scalar-arrays?
No problem: just define your own MIME::Body subclass, and make a subclass
of MIME::Parser or MIME::ParserBase which returns an instance of your
body class whenever appropriate in the C method.
Your "body" class must inherit from MIME::Body (or some subclass of it),
and it must either provide (or inherit the default for) the following
methods...
The default inherited method I for all these:
new
binmode [ONOFF]
path
The default inherited method I for these, but perhaps
there's a better implementation for your subclass.
init ARGS...
as_lines
as_string
dup
print
purge
The default inherited method I for these:
open
=head1 NOTES
One reason I didn't just use IO::Handle objects for message bodies was
that I wanted a "body" object to be a form of completely encapsulated
program-persistent storage; that is, I wanted users to be able to write
code like this...
### Get body handle from this MIME message, and read its data:
$body = $entity->bodyhandle;
$IO = $body->open("r");
while (defined($_ = $IO->getline)) {
print STDOUT $_;
}
$IO->close;
...without requiring that they know anything more about how the
$body object is actually storing its data (disk file, scalar variable,
array variable, or whatever).
Storing the body of each MIME message in a persistently-open
IO::Handle was a possibility, but it seemed like a bad idea,
considering that a single multipart MIME message could easily suck up
all the available file descriptors on some systems. This risk increases
if the user application is processing more than one MIME entity at a time.
=head1 SEE ALSO
L
=head1 AUTHOR
Eryq (F), ZeeGee Software Inc (F).
David F. Skoll (dfs@roaringpenguin.com) http://www.roaringpenguin.com
All rights reserved. This program is free software; you can redistribute
it and/or modify it under the same terms as Perl itself.
Thanks to Achim Bohnet for suggesting that MIME::Parser not be restricted
to the use of FileHandles.
#------------------------------
1;
MIME-tools-5.509/lib/MIME/Head.pm 0000644 0000764 0000764 00000062162 13071225410 014241 0 ustar dfs dfs package 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);
#------------------------------
#
# Public globals...
#
#------------------------------
### The package version, both in 1.23 style *and* usable by MakeMaker:
$VERSION = "5.509";
### 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 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