Email-Outlook-Message-0.914000755001750001750 012201632372 15531 5ustar00matijsmatijs000000000000Email-Outlook-Message-0.914/README000444001750001750 202212201632372 16542 0ustar00matijsmatijs000000000000Email-Outlook-Message ===================== This module reads e-mail messages stored as .msg files (such as generated by Outlook), and converts them to Email::MIME objects. It was originally extracted from the msgconvert.pl script (http://www.matijs.net/software/msgconv/). You do not need Outlook installed to use this module. INSTALLATION To install this module type the following: perl Build.PL ./Build ./Build test ./Build install You may have to become root for that final step. DEPENDENCIES This module requires these other modules: Core: Carp POSIX Encode Others: Email::MIME::ContentType - 1.014 or later Email::MIME::Modifier - 1.442 or later Email::MIME::Creator - 1.454 or later Email::Simple - 2.003 or later OLE::Storage_Lite - 0.14 or later For testing: IO::All Test::More COPYRIGHT AND LICENCE Copyright 2002, 2004, 2006--2009 Matijs van Zuijlen. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. Email-Outlook-Message-0.914/Makefile.PL000444001750001750 131312201632372 17636 0ustar00matijsmatijs000000000000# Note: this file was auto-generated by Module::Build::Compat version 0.3800 require 5.006; use ExtUtils::MakeMaker; WriteMakefile ( 'NAME' => 'Email::Outlook::Message', 'VERSION_FROM' => 'lib/Email/Outlook/Message.pm', 'PREREQ_PM' => { 'Carp' => '0', 'Email::MIME' => '1.923', 'Email::MIME::ContentType' => '1.014', 'Email::Simple' => '2.102', 'Encode' => '0', 'IO::All' => '0', 'OLE::Storage_Lite' => '0.14', 'POSIX' => '0', 'Test::More' => '0' }, 'INSTALLDIRS' => 'site', 'EXE_FILES' => [], 'PL_FILES' => {} ) ; Email-Outlook-Message-0.914/META.json000444001750001750 321312201632372 17306 0ustar00matijsmatijs000000000000{ "abstract" : "Read Outlook .msg files", "author" : [ "Matijs van Zuijlen, C" ], "dynamic_config" : 1, "generated_by" : "Module::Build version 0.38, CPAN::Meta::Converter version 2.132140", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Email-Outlook-Message", "prereqs" : { "configure" : { "requires" : { "Module::Build" : "0.38" } }, "runtime" : { "requires" : { "Carp" : "0", "Email::MIME" : "1.923", "Email::MIME::ContentType" : "1.014", "Email::Simple" : "2.102", "Encode" : "0", "IO::All" : "0", "OLE::Storage_Lite" : "0.14", "POSIX" : "0", "Test::More" : "0", "perl" : "5.006" } } }, "provides" : { "Email::Outlook::Message" : { "file" : "lib/Email/Outlook/Message.pm", "version" : "0.914" }, "Email::Outlook::Message::AddressInfo" : { "file" : "lib/Email/Outlook/Message/AddressInfo.pm", "version" : "0.914" }, "Email::Outlook::Message::Attachment" : { "file" : "lib/Email/Outlook/Message/Attachment.pm", "version" : "0.914" }, "Email::Outlook::Message::Base" : { "file" : "lib/Email/Outlook/Message/Base.pm", "version" : "0.914" } }, "release_status" : "stable", "resources" : { "license" : [ "http://dev.perl.org/licenses/" ] }, "version" : "0.914" } Email-Outlook-Message-0.914/META.yml000444001750001750 203612201632372 17140 0ustar00matijsmatijs000000000000--- abstract: 'Read Outlook .msg files' author: - 'Matijs van Zuijlen, C' build_requires: {} configure_requires: Module::Build: 0.38 dynamic_config: 1 generated_by: 'Module::Build version 0.38, CPAN::Meta::Converter version 2.132140' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Email-Outlook-Message provides: Email::Outlook::Message: file: lib/Email/Outlook/Message.pm version: 0.914 Email::Outlook::Message::AddressInfo: file: lib/Email/Outlook/Message/AddressInfo.pm version: 0.914 Email::Outlook::Message::Attachment: file: lib/Email/Outlook/Message/Attachment.pm version: 0.914 Email::Outlook::Message::Base: file: lib/Email/Outlook/Message/Base.pm version: 0.914 requires: Carp: 0 Email::MIME: 1.923 Email::MIME::ContentType: 1.014 Email::Simple: 2.102 Encode: 0 IO::All: 0 OLE::Storage_Lite: 0.14 POSIX: 0 Test::More: 0 perl: 5.006 resources: license: http://dev.perl.org/licenses/ version: 0.914 Email-Outlook-Message-0.914/Build.PL000444001750001750 120712201632372 17162 0ustar00matijsmatijs000000000000use Module::Build; my $build = Module::Build->new ( module_name => 'Email::Outlook::Message', dist_abstract => 'Read Outlook .msg files', license => 'perl', create_makefile_pl => 'traditional', requires => { 'perl' => 5.006, # Core modules 'Carp' => '0', 'Encode' => '0', 'POSIX' => '0', # Others 'Email::MIME::ContentType' => '1.014', 'Email::MIME' => '1.923', 'Email::Simple' => '2.102', 'OLE::Storage_Lite' => '0.14', ## These we need for testing 'IO::All' => '0', 'Test::More' => '0', }, configure_requires => { 'Module::Build' => 0.38 } ); $build->create_build_script; Email-Outlook-Message-0.914/TODO000444001750001750 47112201632372 16340 0ustar00matijsmatijs000000000000TODO - Process applefiles (using Mac::AppleSingleDouble?) - Process gpg-signed mail properly. - Create interface to internal properties. - Allow an output file to be specified on the command line - Make use of more of the items, if possible. - Create more test files - UTF8 text bodies should set encoding = UTF8 Email-Outlook-Message-0.914/Changes000444001750001750 322112201632372 17157 0ustar00matijsmatijs0000000000000.914 2013-08-11 - Add version number to all modules 0.913 2013-08-11 - Update dependency on Email::MIME and fix tests 0.912 2012-07-27 - Fix test cases to deal with changed CRLF handling in Email::Simple 0.911 2012-06-12 - Do not abort on unknown encodings. Warn instead. - Replace deprecated dependencies with Email::MIME 0.910 2010-08-10 - Major refactoring into different packages/classes. - Read all fixed-length properties from all property streams. - Improved logging of used and unused properties. - Use package variables for important data structures for easier extension. - As a result, this module now requires perl 5.6. 0.909 2009-10-11 - Handle (compressed) RTF version of message body. 0.908 2009-09-27 Bugfix release: - Applying patches by Jordan Hrycaj for CPAN bug #49495: - Handle undefined OLE dates properly - Parse root property stream to extract Date - Skip more properties - Actually handle References property 0.907 2009-07-06 - Handle nested OLE files that are not .MSG files 0.906 2009-03-14 - Make sure to_email_mime always returns a mime object, even if email has no body 0.905 2008-11-29 - Handle unicode data 0.904 2008-02-28 - Remove spurious loading of Email::Abstract - Code, comment and pod cleanups - Use Build.PL instead of Makefile.PL for building - Correct, locale independent, date formatting 0.903 2007-10-14 - Dates from OLE and submission_id are GMT, not local time 0.902 2007-10-10 - Fix pod coverage testing 0.901 2007-09-24 - First release as module on CPAN - Extracted main functionality of msgconvert.pl to Email::Outlook::Message Email-Outlook-Message-0.914/MANIFEST000444001750001750 100212201632372 17010 0ustar00matijsmatijs000000000000Build.PL Changes lib/Email/Outlook/Message.pm lib/Email/Outlook/Message/AddressInfo.pm lib/Email/Outlook/Message/Attachment.pm lib/Email/Outlook/Message/Base.pm Makefile.PL MANIFEST This list of files META.json META.yml README t/basics.t t/files/gpg_signed.msg t/files/plain_jpeg_attached.msg t/files/plain_uc_unsent.msg t/files/plain_uc_wc_unsent.msg t/files/plain_unsent.msg t/gpg_signed.t t/internals.t t/plain_jpeg_attached.t t/plain_uc_unsent.t t/plain_uc_wc_unsent.t t/plain_unsent.t t/pod_coverage.t TODO Email-Outlook-Message-0.914/lib000755001750001750 012201632372 16277 5ustar00matijsmatijs000000000000Email-Outlook-Message-0.914/lib/Email000755001750001750 012201632372 17326 5ustar00matijsmatijs000000000000Email-Outlook-Message-0.914/lib/Email/Outlook000755001750001750 012201632372 20762 5ustar00matijsmatijs000000000000Email-Outlook-Message-0.914/lib/Email/Outlook/Message.pm000444001750001750 3125512201632372 23067 0ustar00matijsmatijs000000000000package Email::Outlook::Message; =head1 NAME Email::Outlook::Message.pm - Read Outlook .msg files =head1 SYNOPSIS use Email::Outlook::Message; my $msg = new Email::Outlook::Message $filename, $verbose; my $mime = $msg->to_email_mime; $mime->as_string; =head1 DESCRIPTION Parses .msg message files as produced by Microsoft Outlook. =head1 METHODS =over 8 =item B Parse the file pointed at by $msg. Set $verbose to a true value to print information about skipped parts of the .msg file on STDERR. =item B Output result as an Email::MIME object. =back =head1 BUGS Not all data that is in the .msg file is converted. There are some parts whose meaning escapes me, although more documentation on MIME properties is available these days. Other parts do not make sense outside of Outlook and Exchange. GPG signed mail is not processed correctly. Neither are attachments of type 'appledoublefile'. It would be nice if we could write .MSG files too, but that will require quite a big rewrite. =head1 AUTHOR Matijs van Zuijlen, C =head1 COPYRIGHT AND LICENSE Copyright 2002, 2004, 2006--2010, 2012 by Matijs van Zuijlen This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut use strict; use warnings; use 5.006; use vars qw($VERSION); $VERSION = "0.914"; use Email::Simple; use Email::MIME::Creator; use Email::Outlook::Message::AddressInfo; use Email::Outlook::Message::Attachment; use Carp; use base 'Email::Outlook::Message::Base'; our $skipheaders = { map { uc($_) => 1 } "MIME-Version", "Content-Type", "Content-Transfer-Encoding", "X-Mailer", "X-Msgconvert", "X-MS-Tnef-Correlator", "X-MS-Has-Attach" }; our $MAP_SUBITEM_FILE = { '1000' => "BODY_PLAIN", # Body '1009' => "BODY_RTF", # Compressed-RTF version of body '1013' => "BODY_HTML", # HTML Version of body '0037' => "SUBJECT", # Subject '0047' => "SUBMISSION_ID", # Seems to contain the date '007D' => "HEAD", # Full headers '0C1A' => "FROM", # From: Name '0C1E' => "FROM_ADDR_TYPE", # From: Address type '0C1F' => "FROM_ADDR", # From: Address '0E04' => "TO", # To: Names '0E03' => "CC", # Cc: Names '1035' => "MESSAGEID", # Message-Id '1039' => "REFERENCES", # References: Header '1042' => "INREPLYTO", # In reply to Message-Id '3007' => 'DATE2ND', # Creation Time '0039' => 'DATE1ST', # Outlook sent date }; # # Main body of module # sub new { my $class = shift; my $file = shift or croak "File name is required parameter"; my $verbose = shift; my $self = $class->_empty_new; $self->{EMBEDDED} = 0; my $msg = OLE::Storage_Lite->new($file); my $pps = $msg->getPpsTree(1); $pps or croak "Parsing $file as OLE file failed"; $self->_set_verbosity($verbose); # TODO: Use separate object as parser? $self->_process_pps($pps); return $self; } sub _empty_new { my $class = shift; return bless { ADDRESSES => [], ATTACHMENTS => [], FROM_ADDR_TYPE => "", HAS_UNICODE => 0, VERBOSE => 0, EMBEDDED => 1 }, $class; } sub to_email_mime { my $self = shift; my $bodymime; my $mime; my @parts; if ($self->{BODY_PLAIN}) { push(@parts, $self->_create_mime_plain_body()); } if ($self->{BODY_HTML}) { push(@parts, $self->_create_mime_html_body()); } if ($self->{BODY_RTF}) { push(@parts, $self->_create_mime_rtf_body()); } if ((scalar @parts) > 1) { for (@parts) { $self->_clean_part_header($_) }; $bodymime = Email::MIME->create( attributes => { content_type => "multipart/alternative", encoding => "8bit", }, parts => \@parts ); } elsif ((@parts) == 1) { $bodymime = $parts[0]; } else { $bodymime = $self->_create_mime_plain_body(); } if (@{$self->{ATTACHMENTS}}>0) { $self->_clean_part_header($bodymime); my $mult = Email::MIME->create( attributes => { content_type => "multipart/mixed", encoding => "8bit", }, parts => [$bodymime], ); foreach my $att (@{$self->{ATTACHMENTS}}) { $self->_SaveAttachment($mult, $att); } $mime = $mult; } else { $mime = $bodymime; } #$mime->header_set('Date', undef); $self->_SetHeaderFields($mime); $self->_copy_header_data($mime); return $mime; } # # Below are functions that walk the PPS tree. This is simply a tree walk. # It's not really recursive (except when an attachment contains a .msg # file), since the tree is shallow (max. 1 subdirectory deep). # # The structure is as follows: # # Root # Items with properties of the e-mail # Dirs containting adresses # Items with properties of the address # Dirs containing Attachments # Items with properties of the attachment (including its data) # Dir that is itself a .msg file (if the attachment is an email). # sub _property_map { return $MAP_SUBITEM_FILE; } # # Process a subdirectory. This is either an address or an attachment. # sub _process_subdirectory { my ($self, $pps) = @_; $self->_extract_ole_date($pps); my $name = $self->_get_pps_name($pps); if ($name =~ '__recip_version1 0_ ') { # Address of one recipient $self->_process_address($pps); } elsif ($name =~ '__attach_version1 0_ ') { # Attachment $self->_process_attachment($pps); } else { $self->_warn_about_unknown_directory($pps); } return; } # # Process a subdirectory that contains an email address. # sub _process_address { my ($self, $pps) = @_; my $addr_info = Email::Outlook::Message::AddressInfo->new($pps, $self->{VERBOSE}); push @{$self->{ADDRESSES}}, $addr_info; return; } # # Process a subdirectory that contains an attachment. # sub _process_attachment { my ($self, $pps) = @_; my $attachment = Email::Outlook::Message::Attachment->new($pps, $self->{VERBOSE}); push @{$self->{ATTACHMENTS}}, $attachment; return; } # # Header length of the property stream depends on whether the Message # object is embedded or not. # sub _property_stream_header_length { my $self = shift; return ($self->{EMBEDDED} ? 24 : 32) } # # Helper functions # # # Extract time stamp of this OLE item (this is in GMT) # sub _extract_ole_date { my ($self, $pps) = @_; unless (defined ($self->{OLEDATE})) { # Make Date my $datearr; $datearr = $pps->{Time2nd}; $datearr = $pps->{Time1st} unless $datearr and $datearr->[0]; $self->{OLEDATE} = $self->_format_date($datearr) if $datearr and $datearr->[0]; } return; } # If we didn't get the date from the original header data, we may be able # to get it from the SUBMISSION_ID: # It seems to have the format of a semicolon-separated list of key=value # pairs. The key l has a value with the format: # -Z-, where DATETIME is the date and time (gmt) # in the format YYMMDDHHMMSS. sub _submission_id_date { my $self = shift; my $submission_id = $self->{SUBMISSION_ID} or return; $submission_id =~ m/ l=.*- (\d\d) (\d\d) (\d\d) (\d\d) (\d\d) (\d\d) Z-.* /x or return; my $year = $1; $year += 100 if $year < 20; return $self->_format_date([$6,$5,$4,$3,$2-1,$year]); } sub _SaveAttachment { my ($self, $mime, $att) = @_; my $m = $att->to_email_mime; $self->_clean_part_header($m); $mime->parts_add([$m]); return; } # Set header fields sub _AddHeaderField { my ($self, $mime, $fieldname, $value) = @_; #my $oldvalue = $mime->header($fieldname); #return if $oldvalue; $mime->header_set($fieldname, $value) if $value; return; } sub _Address { my ($self, $tag) = @_; my $result = $self->{$tag} || ""; my $address = $self->{$tag . "_ADDR"} || ""; if ($address) { $result .= " " if $result; $result .= "<$address>"; } return $result; } # Find SMTP addresses for the given list of names sub _expand_address_list { my ($self, $names) = @_; return "" unless defined $names; my @namelist = split / ; [ ]* /x, $names; my @result; name: foreach my $name (@namelist) { my $addresstext = $self->_find_name_in_addresspool($name); if ($addresstext) { push @result, $addresstext; } else { push @result, $name; } } return join ", ", @result; } sub _find_name_in_addresspool { my ($self, $name) = @_; my $addresspool = $self->{ADDRESSES}; foreach my $address (@{$addresspool}) { if ($name eq $address->name) { return $address->display_address; } } return; } # TODO: Don't really want to need this! sub _clean_part_header { my ($self, $part) = @_; $part->header_set('Date'); unless ($part->content_type =~ m{ ^ multipart / }x) { $part->header_set('MIME-Version') }; return; } sub _create_mime_plain_body { my $self = shift; return Email::MIME->create( attributes => { content_type => "text/plain", charset => "ISO-8859-1", disposition => "inline", encoding => "8bit", }, body => $self->{BODY_PLAIN} ); } sub _create_mime_html_body { my $self = shift; my $body = $self->{BODY_HTML}; # FIXME: This makes sure tests succeed for now, but is not really # necessary for correct display in the mail reader. $body =~ s/ \r \n /\n/sgx; return Email::MIME->create( attributes => { content_type => "text/html", disposition => "inline", encoding => "8bit", }, body => $body ); } # Implementation based on the information in # http://www.freeutils.net/source/jtnef/rtfcompressed.jsp, # and the implementation in tnef version 1.4.5. my $MAGIC_COMPRESSED_RTF = 0x75465a4c; my $MAGIC_UNCOMPRESSED_RTF = 0x414c454d; my $BASE_BUFFER = "{\\rtf1\\ansi\\mac\\deff0\\deftab720{\\fonttbl;}{\\f0\\fnil \\froman " . "\\fswiss \\fmodern \\fscript \\fdecor MS Sans SerifSymbolArial" . "Times New RomanCourier{\\colortbl\\red0\\green0\\blue0\n\r\\par " . "\\pard\\plain\\f0\\fs20\\b\\i\\u\\tab\\tx"; sub _create_mime_rtf_body { my $self = shift; my $data = $self->{BODY_RTF}; my ($size, $rawsize, $magic, $crc) = unpack "V4", substr $data, 0, 16; my $buffer; if ($magic == $MAGIC_COMPRESSED_RTF) { $buffer = $BASE_BUFFER; my $output_length = length($buffer) + $rawsize; my @flags; my $in = 16; while (length($buffer) < $output_length) { if (@flags == 0) { @flags = split "", unpack "b8", substr $data, $in++, 1; } my $flag = shift @flags; if ($flag eq "0") { $buffer .= substr $data, $in++, 1; } else { my ($a, $b) = unpack "C2", substr $data, $in, 2; my $offset = ($a << 4) | ($b >> 4); my $length = ($b & 0xf) + 2; my $buflen = length $buffer; my $longoffset = $buflen - ($buflen % 4096) + $offset; if ($longoffset >= $buflen) { $longoffset -= 4096; } while ($length > 0) { $buffer .= substr $buffer, $longoffset, 1; $length--; $longoffset++; } $in += 2; } } $buffer = substr $buffer, length $BASE_BUFFER; } elsif ($magic == $MAGIC_UNCOMPRESSED_RTF) { $buffer = substr $data, length $BASE_BUFFER; } else { carp "Incorrect magic number in RTF body.\n"; } return Email::MIME->create( attributes => { content_type => "application/rtf", disposition => "inline", encoding => "base64", }, body => $buffer ); } # Copy original header data. # Note: This should contain the Date: header. sub _copy_header_data { my ($self, $mime) = @_; defined $self->{HEAD} or return; # The extra \n is neede for Email::Simple to pick up all headers. # This is a change in Email::Simple. my $parsed = Email::Simple->new($self->{HEAD} . "\n"); foreach my $tag (grep { !$skipheaders->{uc $_}} $parsed->header_names) { $mime->header_set($tag, $parsed->header($tag)); } return; } # Set header fields sub _SetHeaderFields { my ($self, $mime) = @_; $self->_AddHeaderField($mime, 'Subject', $self->{SUBJECT}); $self->_AddHeaderField($mime, 'From', $self->_Address("FROM")); #$self->_AddHeaderField($mime, 'Reply-To', $self->_Address("REPLYTO")); $self->_AddHeaderField($mime, 'To', $self->_expand_address_list($self->{TO})); $self->_AddHeaderField($mime, 'Cc', $self->_expand_address_list($self->{CC})); $self->_AddHeaderField($mime, 'Message-Id', $self->{MESSAGEID}); $self->_AddHeaderField($mime, 'In-Reply-To', $self->{INREPLYTO}); $self->_AddHeaderField($mime, 'References', $self->{REFERENCES}); # Least preferred option to set the Date: header; this uses the date the # msg file was saved. $self->_AddHeaderField($mime, 'Date', $self->{OLEDATE}); # Second preferred option: get it from the SUBMISSION_ID: $self->_AddHeaderField($mime, 'Date', $self->_submission_id_date()); # Most prefered option from the property list $self->_AddHeaderField($mime, 'Date', $self->{DATE2ND}); $self->_AddHeaderField($mime, 'Date', $self->{DATE1ST}); # After this, we'll try getting the date from the original headers. return; } 1; Email-Outlook-Message-0.914/lib/Email/Outlook/Message000755001750001750 012201632372 22346 5ustar00matijsmatijs000000000000Email-Outlook-Message-0.914/lib/Email/Outlook/Message/Base.pm000444001750001750 2717312201632372 23745 0ustar00matijsmatijs000000000000package Email::Outlook::Message::Base; =head1 NAME Email::Outlook::Message::Base - Base parser for .msg files. =head1 NAME This is an internal module of Email::Outlook::Message. =head1 METHODS =over 8 =item B =item B =item B =item B =item B =back =head1 AUTHOR Matijs van Zuijlen, C =head1 COPYRIGHT AND LICENSE Copyright 2002, 2004, 2006--2010, 2012 by Matijs van Zuijlen This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut use strict; use warnings; use Encode; use IO::String; use POSIX; use Carp; use OLE::Storage_Lite; use vars qw($VERSION); $VERSION = "0.914"; my $DIR_TYPE = 1; my $FILE_TYPE = 2; # Variable encodings my $ENCODING_UNICODE = '001F'; my $ENCODING_ASCII = '001E'; my $ENCODING_BINARY = '0102'; my $ENCODING_DIRECTORY = '000D'; our $VARIABLE_ENCODINGS = { '000D' => 'Directory', '001F' => 'Unicode', '001E' => 'Ascii?', '0102' => 'Binary', }; # Fixed encodings my $ENCODING_INTEGER16 = '0002'; my $ENCODING_INTEGER32 = '0003'; my $ENCODING_BOOLEAN = '000B'; my $ENCODING_DATE = '0040'; # # Descriptions partially based on mapitags.h # our $skipproperties = { # Envelope properties '0002' => "Alternate Recipient Allowed", '000B' => "Conversation Key", '0017' => "Importance", #TODO: Use this. '001A' => "Message Class", '0023' => "Originator Delivery Report Requested", '0026' => "Priority", #TODO: Use this. '0029' => "Read Receipt Requested", #TODO: Use this. '0036' => "Sensitivity", # As assessed by the Sender '003B' => "Sent Representing Search Key", '003D' => "Subject Prefix", '003F' => "Received By EntryId", '0040' => "Received By Name", # TODO: These two fields are part of the Sender field. '0041' => "Sent Representing EntryId", '0042' => "Sent Representing Name", '0043' => "Received Representing EntryId", '0044' => "Received Representing Name", '0046' => "Read Receipt EntryId", '0051' => "Received By Search Key", '0052' => "Received Representing Search Key", '0053' => "Read Receipt Search Key", # TODO: These two fields are part of the Sender field. '0064' => "Sent Representing Address Type", '0065' => "Sent Representing Email Address", '0070' => "Conversation Topic", '0071' => "Conversation Index", '0075' => "Received By Address Type", '0076' => "Received By Email Address", '0077' => "Received Representing Address Type", '0078' => "Received Representing Email Address", '007F' => "TNEF Correlation Key", # Recipient properties '0C15' => "Recipient Type", # Sender properties '0C19' => "Sender Entry Id", '0C1D' => "Sender Search Key", '0C1E' => "Sender Address Type", # Non-transmittable properties '0E02' => "Display Bcc", '0E06' => "Message Delivery Time", '0E07' => "Message Flags", '0E0A' => "Sent Mail EntryId", '0E0F' => "Responsibility", '0E1B' => "Has Attachments", '0E1D' => "Normalized Subject", '0E1F' => "RTF In Sync", '0E20' => "Attachment Size", '0E21' => "Attachment Number", '0E23' => "Internet Article Number", '0E27' => "Security Descriptor", '0E79' => "Trust Sender", '0FF4' => "Access", '0FF6' => "Instance Key", '0FF7' => "Access Level", '0FF9' => "Record Key", '0FFE' => "Object Type", '0FFF' => "EntryId", # Content properties '1006' => "RTF Sync Body CRC", '1007' => "RTF Sync Body Count", '1008' => "RTF Sync Body Tag", '1010' => "RTF Sync Prefix Count", '1011' => "RTF Sync Trailing Count", '1046' => "Original Message ID", '1080' => "Icon Index", '1081' => "Last Verb Executed", '1082' => "Last Verb Execution Time", '10F3' => "URL Component Name", '10F4' => "Attribute Hidden", '10F5' => "Attribute System", '10F6' => "Attribute Read Only", # 'Common property' '3000' => "Row Id", '3001' => "Display Name", '3002' => "Address Type", '3007' => "Creation Time", '3008' => "Last Modification Time", '300B' => "Search Key", # Message store info '340D' => "Store Support Mask", '3414' => "Message Store Provider", # Attachment properties '3702' => "Attachment Encoding", '3703' => "Attachment Extension", # TODO: Use the following to distinguish between nested msg and other OLE # stores. '3705' => "Attachment Method", '3709' => "Attachment Rendering", # Icon as WMF '370A' => "Tag identifying application that supplied the attachment", '370B' => "Attachment Rendering Position", '3713' => "Attachment Content Location", #TODO: Use this? # 3900 -- 39FF: 'Address book' '3900' => "Address Book Display Type", '39FF' => "Address Book 7 Bit Display Name", # Mail User Object '3A00' => "Account", '3A20' => "Transmittable Display Name", '3A40' => "Send Rich Info", '3FDE' => "Internet Code Page", # TODO: Perhaps use this. # 'Display table properties' '3FF8' => "Creator Name", '3FF9' => "Creator EntryId", '3FFA' => "Last Modifier Name", '3FFB' => "Last Modifier EntryId", '3FFD' => "Message Code Page", # 'Transport-defined envelope property' '4019' => "Sender Flags", '401A' => "Sent Representing Flags", '401B' => "Received By Flags", '401C' => "Received Representing Flags", '4029' => "Read Receipt Address Type", '402A' => "Read Receipt Email Address", '402B' => "Read Receipt Name", '5FF6' => "Recipient Display Name", '5FF7' => "Recipient EntryId", '5FFD' => "Recipient Flags", '5FFF' => "Recipient Track Status", # 'Provider-defined internal non-transmittable property' '664A' => "Has Named Properties", '6740' => "Sent Mail Server EntryId", }; sub new { my ($class, $pps, $verbose) = @_; my $self = bless { _pps_file_entries => {}, _pps => $pps }, $class; $self->_set_verbosity($verbose); $self->_process_pps($pps); return $self; } sub mapi_property_names { my $self = shift; return keys %{$self->{_pps_file_entries}}; } sub get_mapi_property { my ($self, $code) = @_; return $self->{_pps_file_entries}->{$code}; } sub set_mapi_property { my ($self, $code, $data) = @_; $self->{_pps_file_entries}->{$code} = $data; return; } sub property { my ($self, $name) = @_; my $map = $self->_property_map; # TODO: Prepare reverse map instead of doing dumb lookup. foreach my $code (keys %{$map}) { my $key = $map->{$code}; next unless $key eq $name; my $prop = $self->get_mapi_property($code); if ($prop) { my ($encoding, $data) = @{$prop}; return $self->_decode_mapi_property($encoding, $data); } else { return; } } return; } sub _decode_mapi_property { my ($self, $encoding, $data) = @_; if ($encoding eq $ENCODING_ASCII or $encoding eq $ENCODING_UNICODE) { if ($encoding eq $ENCODING_UNICODE) { $data = decode("UTF-16LE", $data); } $data =~ s/ \000 $ //sgx; $data =~ s/ \r \n /\n/sgx; return $data; } if ($encoding eq $ENCODING_BINARY) { return $data; } if ($encoding eq $ENCODING_DATE) { my @a = OLE::Storage_Lite::OLEDate2Local $data; return $self->_format_date(\@a); } if ($encoding eq $ENCODING_INTEGER16) { return unpack("v", substr($data, 0, 2)); } if ($encoding eq $ENCODING_INTEGER32) { return unpack("V", substr($data, 0, 4)); } if ($encoding eq $ENCODING_BOOLEAN) { return unpack("C", substr($data, 0, 1)); } warn "Unhandled encoding $encoding\n"; return $data; } sub _process_pps { my ($self, $pps) = @_; foreach my $child (@{$pps->{Child}}) { if ($child->{Type} == $DIR_TYPE) { $self->_process_subdirectory($child); } elsif ($child->{Type} == $FILE_TYPE) { $self->_process_pps_file_entry($child); } else { carp "Unknown entry type: $child->{Type}"; } } $self->_check_pps_file_entries($self->_property_map); return; } sub _get_pps_name { my ($self, $pps) = @_; my $name = OLE::Storage_Lite::Ucs2Asc($pps->{Name}); $name =~ s/ \W / /gx; return $name; } sub _parse_item_name { my ($self, $name) = @_; if ($name =~ / ^ __substg1 [ ] 0_ (....) (....) $ /x) { my ($property, $encoding) = ($1, $2); if ($encoding eq $ENCODING_UNICODE and not ($self->{HAS_UNICODE})) { $self->{HAS_UNICODE} = 1; } return ($property, $encoding); } else { return (undef, undef); } } sub _warn_about_unknown_directory { my ($self, $pps) = @_; my $name = $self->_get_pps_name($pps); if ($name eq '__nameid_version1 0') { # TODO: Use this data to access so-called named properties. $self->{VERBOSE} and warn "Skipping DIR entry $name (Introductory stuff)\n"; } else { warn "Unknown DIR entry $name\n"; } return; } sub _warn_about_unknown_file { my ($self, $pps) = @_; my $name = $self->_get_pps_name($pps); if ($name eq 'Olk10SideProps_0001') { $self->{VERBOSE} and warn "Skipping FILE entry $name (Properties)\n"; } else { warn "Unknown FILE entry $name\n"; } return; } # # Generic processor for a file entry: Inserts the entry's data into the # $self's mapi property list. # sub _process_pps_file_entry { my ($self, $pps) = @_; my $name = $self->_get_pps_name($pps); my ($property, $encoding) = $self->_parse_item_name($name); if (defined $property) { $self->set_mapi_property($property, [$encoding, $pps->{Data}]); } elsif ($name eq '__properties_version1 0') { $self->_process_property_stream ($pps->{Data}); } else { $self->_warn_about_unknown_file($pps); } return; } sub _process_property_stream { my ($self, $data) = @_; my ($n, $len) = ($self->_property_stream_header_length, length $data) ; while ($n + 16 <= $len) { my @f = unpack "v4", substr $data, $n, 8; my $encoding = sprintf("%04X", $f[0]); unless ($VARIABLE_ENCODINGS->{$encoding}) { my $property = sprintf("%04X", $f[1]); my $propdata = substr $data, $n+8, 8; $self->set_mapi_property($property, [$encoding, $propdata]); } } continue { $n += 16 ; } return; } sub _check_pps_file_entries { my ($self, $map) = @_; foreach my $property ($self->mapi_property_names) { if (my $key = $map->{$property}) { $self->_use_property($key, $property); } else { $self->_warn_about_skipped_property($property); } } return; } sub _use_property { my ($self, $key, $property) = @_; my ($encoding, $data) = @{$self->get_mapi_property($property)}; $self->{$key} = $self->_decode_mapi_property($encoding, $data); $self->{VERBOSE} and $self->_log_property("Using ", $property, $key); return; } sub _warn_about_skipped_property { my ($self, $property) = @_; return unless $self->{VERBOSE}; my $meaning = $skipproperties->{$property} || "UNKNOWN"; $self->_log_property("Skipping", $property, $meaning); return; } sub _log_property { my ($self, $message, $property, $meaning) = @_; my ($encoding, $data) = @{$self->get_mapi_property($property)}; my $value = $self->_decode_mapi_property($encoding, $data); $value = substr($value, 0, 50); if ($encoding eq $ENCODING_BINARY) { if ($value =~ / [[:print:]] /x) { $value =~ s/ [^[:print:]] /./gx; } else { $value =~ s/ . / sprintf("%02x ", ord($&)) /sgex; } } if (length($value) > 45) { $value = substr($value, 0, 41) . " ..."; } warn "$message property $encoding:$property ($meaning): $value\n"; return; } sub _set_verbosity { my ($self, $verbosity) = @_; $self->{VERBOSE} = $verbosity ? 1 : 0; return; } # # Format a gmt date according to RFC822 # sub _format_date { my ($self, $datearr) = @_; my $day = qw(Sun Mon Tue Wed Thu Fri Sat)[strftime("%w", @{$datearr})]; my $month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)[strftime("%m", @{$datearr}) - 1]; return strftime("$day, %d $month %Y %H:%M:%S +0000", @{$datearr}); } 1; Email-Outlook-Message-0.914/lib/Email/Outlook/Message/Attachment.pm000444001750001750 654512201632372 25143 0ustar00matijsmatijs000000000000package Email::Outlook::Message::Attachment; =head1 NAME Email::Outlook::Message::Attachment - Handle attachment data in .msg files =head1 NAME This is an internal module of Email::Outlook::Message. It is a subclass of Email::Outlook::Message::Base. =head1 METHODS =over 8 =item B Create a new attachment object, using $pps as data source. Overrides the base method by setting some default values. =item B Convert the attachment to an Email::MIME object. =back =head1 AUTHOR Matijs van Zuijlen, C =head1 COPYRIGHT AND LICENSE Copyright 2002, 2004, 2006--2010, 2012 by Matijs van Zuijlen This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut use strict; use warnings; use Carp; use vars qw($VERSION); $VERSION = "0.914"; use Email::MIME::ContentType; use base 'Email::Outlook::Message::Base'; our $MAP_ATTACHMENT_FILE = { '3701' => "DATA", # Data '3704' => "SHORTNAME", # Short file name '3707' => "LONGNAME", # Long file name '370E' => "MIMETYPE", # mime type '3712' => "CONTENTID", # content-id '3716' => "DISPOSITION", # disposition }; sub new { my ($class, $pps, $verbosity) = @_; my $self = $class->SUPER::new($pps, $verbosity); bless $self, $class; $self->{MIMETYPE} ||= 'application/octet-stream'; $self->{ENCODING} ||= 'base64'; $self->{DISPOSITION} ||= 'attachment'; if ($self->{MIMETYPE} eq 'multipart/signed') { $self->{ENCODING} = '8bit'; } return $self; } sub to_email_mime { my $self = shift; my $mt = parse_content_type($self->{MIMETYPE}); my $m = Email::MIME->create( attributes => { content_type => "$mt->{discrete}/$mt->{composite}", %{$mt->{attributes}}, encoding => $self->{ENCODING}, filename => $self->{LONGNAME} || $self->{SHORTNAME}, name => $self->{LONGNAME} || $self->{LONGNAME}, disposition => $self->{DISPOSITION}, }, header => [ 'Content-ID' => $self->{CONTENTID} ], body => $self->{DATA}); return $m } sub _property_map { return $MAP_ATTACHMENT_FILE; } sub _process_subdirectory { my ($self, $pps) = @_; my $name = $self->_get_pps_name($pps); my ($property, $encoding) = $self->_parse_item_name($name); if ($property eq '3701') { # Nested msg file my $is_msg = 1; foreach my $child (@{$pps->{Child}}) { unless ($self->_get_pps_name($child) =~ / ^ ( __recip | __attach | __substg1 | __nameid | __properties ) /x ) { $is_msg = 0; last; } } if ($is_msg) { my $msgp = Email::Outlook::Message->_empty_new(); $msgp->_set_verbosity($self->{VERBOSE}); $msgp->_process_pps($pps); $self->{DATA} = $msgp->to_email_mime->as_string; $self->{MIMETYPE} = 'message/rfc822'; $self->{ENCODING} = '8bit'; } else { foreach my $child (@{$pps->{Child}}) { if (eval { $child->isa('OLE::Storage_Lite::PPS::File')}) { foreach my $prop ("Time1st", "Time2nd") { $child->{$prop} = undef; } } } my $nPps = OLE::Storage_Lite::PPS::Root->new( $pps->{Time1st}, $pps->{Time2nd}, $pps->{Child}); my $data; my $io = IO::String->new($data); binmode($io); $nPps->save($io, 1); $self->{DATA} = $data; } } else { $self->_warn_about_unknown_directory($pps); } return; } sub _property_stream_header_length { return 8; } 1; Email-Outlook-Message-0.914/lib/Email/Outlook/Message/AddressInfo.pm000444001750001750 362112201632372 25244 0ustar00matijsmatijs000000000000package Email::Outlook::Message::AddressInfo; =head1 NAME Email::Outlook::Message::AddressInfo - Handle addres data in .msg files =head1 NAME This is an internal module of Email::Outlook::Message. It is a subclass of Email::Outlook::Message::Base. =head1 METHODS =over 8 =item B =item B =item B =item B =item B =back =head1 AUTHOR Matijs van Zuijlen, C =head1 COPYRIGHT AND LICENSE Copyright 2002, 2004, 2006--2010, 2012 by Matijs van Zuijlen This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut use strict; use warnings; use vars qw($VERSION); $VERSION = "0.914"; use Carp; use base 'Email::Outlook::Message::Base'; our $MAP_ADDRESSITEM_FILE = { '3001' => "NAME", # Real name '3002' => "TYPE", # Address type '403D' => "TYPE2", # Address type TODO: Not used '3003' => "ADDRESS", # Address '403E' => "ADDRESS2", # Address TODO: Not used '39FE' => "SMTPADDRESS", # SMTP Address variant }; sub _property_map { return $MAP_ADDRESSITEM_FILE; } # DIR Entries: There should be none. sub _process_subdirectory { my ($self, $pps) = @_; $self->_warn_about_unknown_directory($pps); return; } sub name { my $self = shift; return $self->property('NAME') } sub address_type { my $self = shift; return $self->property('TYPE') } sub address { my $self = shift; return $self->property('ADDRESS') } sub smtp_address { my $self = shift; return $self->property('SMTPADDRESS') } sub display_address { my $self = shift; my $addresstext = $self->name . " <"; if (defined ($self->smtp_address)) { $addresstext .= $self->smtp_address; } elsif ($self->address_type eq "SMTP") { $addresstext .= $self->address; } $addresstext .= ">"; return $addresstext; } sub _property_stream_header_length { return 8; } 1; Email-Outlook-Message-0.914/t000755001750001750 012201632372 15774 5ustar00matijsmatijs000000000000Email-Outlook-Message-0.914/t/plain_uc_wc_unsent.t000444001750001750 254412201632372 22202 0ustar00matijsmatijs000000000000# Test unsent plain text message, unicode encoded, with a non-ascii # codepoint ('wide character') in the body. use strict; use warnings; # Needed to recoginize UTF8 string literal for comparing the body. use utf8; use Test::More tests => 14; use Email::Outlook::Message; my $p = new Email::Outlook::Message('t/files/plain_uc_wc_unsent.msg'); ok($p, "Parsing succeeded"); my $m = $p->to_email_mime; is(scalar($m->header_names), 6, "Six headers"); is($m->header("Subject"), "Test for MSGConvert -- plain text", "Testing subject"); is($m->header("Date"), "Mon, 26 Feb 2007 22:57:01 +0000", "Testing date"); is($m->header("From"), undef, "No from specified"); is($m->header("To"), "Someone Else ", "Testing to"); like($m->content_type, qr{^multipart/alternative}, "Content type should be multipart/alternative"); my @parts = $m->subparts; is(scalar(@parts), 2, "Two sub-parts"); my $text = $parts[0]; like($text->content_type, qr{^text/plain}, "Content type should be text/plain"); is($text->body, "This is a test\nThe body is in pцБЌain text", "Check body"); is(scalar($text->subparts), 0, "No sub-parts"); my $rtf = $parts[1]; like($rtf->content_type, qr{^application/rtf}, "Content type should be application/rtf"); is($rtf->header("Content-Disposition"), "inline", "Testing content disposition"); is(scalar($rtf->subparts), 0, "No sub-parts"); Email-Outlook-Message-0.914/t/plain_unsent.t000444001750001750 245712201632372 21025 0ustar00matijsmatijs000000000000# Test unsent plain text message, single-byte encoded. use strict; use warnings; use Test::More tests => 15; use Email::Outlook::Message; my $p = new Email::Outlook::Message('t/files/plain_unsent.msg'); ok($p, "Parsing succeeded"); like($p->get_mapi_property('1000')->[1], qr/This is a test..The body is in plain text/s); my $m = $p->to_email_mime; is(scalar($m->header_names), 6, "Six headers"); is($m->header("Subject"), "Test for MSGConvert -- plain text", "Testing subject"); is($m->header("Date"), "Mon, 26 Feb 2007 22:56:40 +0000", "Testing date"); is($m->header("From"), undef, "No from specified"); is($m->header("To"), "Someone Else ", "Testing to"); like($m->content_type, qr{^multipart/alternative}, "Content type should be multipart/alternative"); my @parts = $m->subparts; is(scalar(@parts), 2, "Two sub-parts"); my $text = $parts[0]; like($text->content_type, qr{^text/plain}, "Content type should be text/plain"); is($text->body, "This is a test\nThe body is in plain text", "Check body"); is(scalar($text->subparts), 0, "No sub-parts"); my $rtf = $parts[1]; like($rtf->content_type, qr{^application/rtf}, "Content type should be application/rtf"); is($rtf->header("Content-Disposition"), "inline", "Testing content disposition"); is(scalar($rtf->subparts), 0, "No sub-parts"); Email-Outlook-Message-0.914/t/plain_uc_unsent.t000444001750001750 321712201632372 21507 0ustar00matijsmatijs000000000000# Test unsent plain text message, unicode encoded. use strict; use warnings; use Test::More tests => 15; use Email::Outlook::Message; my $p = new Email::Outlook::Message('t/files/plain_uc_unsent.msg'); ok($p, "Parsing succeeded"); my $m = $p->to_email_mime; is(scalar($m->header_names), 6, "Six headers"); is($m->header("Subject"), "Test for MSGConvert -- plain text", "Testing subject"); is($m->header("Date"), "Mon, 26 Feb 2007 22:57:01 +0000", "Testing date"); is($m->header("From"), undef, "No from specified"); is($m->header("To"), "Someone Else ", "Testing to"); like($m->content_type, qr{^multipart/alternative}, "Content type should be multipart/alternative"); my @parts = $m->subparts; is(scalar(@parts), 2, "Two sub-parts"); my $text = $parts[0]; like($text->content_type, qr{^text/plain}, "Content type should be text/plain"); is($text->body, "This is a test\nThe body is in plain text", "Check body"); is(scalar($text->subparts), 0, "No sub-parts"); my $rtf = $parts[1]; like($rtf->content_type, qr{^application/rtf}, "Content type should be application/rtf"); is($rtf->header("Content-Disposition"), "inline", "Testing content disposition"); is($rtf->body, "{\\rtf1\\ansi\\ansicpg1252\\fromtext \\deff0{\\fonttbl\n\r" . "{\\f0\\fswiss Arial;}\n\r" . "{\\f1\\fmodern Courier New;}\n\r" . "{\\f2\\fnil\\fcharset2 Symbol;}\n\r" . "{\\f3\\fmodern\\fcharset0 Courier New;}}\n\r" . "{\\colortbl\\red0\\green0\\blue0;\\red0\\green0\\blue255;}\n\r" . "\\uc1\\pard\\plain\\deftab360 \\f0\\fs20 This is a test\\par\n\r" . "The body is in plain text\\par\n\r" . "}", "Check RTF"); is(scalar($rtf->subparts), 0, "No sub-parts"); Email-Outlook-Message-0.914/t/gpg_signed.t000444001750001750 54612201632372 20411 0ustar00matijsmatijs000000000000use strict; use warnings; use Test::More tests => 2; use Email::Outlook::Message; my $p = new Email::Outlook::Message('t/files/gpg_signed.msg'); ok($p, "Parsing succeeded"); TODO: { local $TODO = "GPG Parsing doesn't work yet"; my $m = $p->to_email_mime; like($m->content_type, qr{^multipart/signed}, "Content type should be multipart/signed"); } Email-Outlook-Message-0.914/t/internals.t000444001750001750 414712201632372 20323 0ustar00matijsmatijs000000000000use strict; use warnings; use Test::More tests => 17; use Email::Outlook::Message; #use MIME::Entity; use Email::MIME::Creator; my $p = Email::Outlook::Message->_empty_new(); ok($p, 'Checking internal new'); test_copy_header_data($p); test_submission_id_date($p); test_to_email_mime_with_no_parts($p); test_to_email_mime_with_plain_part($p); test_to_email_mime_with_html_part($p); test_to_email_mime_with_two_parts($p); # DONE sub test_copy_header_data { my $p = shift; my $mime = Email::MIME->create(body => "Hello!"); $p->{HEAD} = <_copy_header_data($mime); my @new_tags = $mime->header_names; is_deeply([sort @new_tags], [sort @expected_tags], 'Are the right headers inserted?'); isnt($mime->header('MIME-Version'), 'ignore'); } sub test_submission_id_date { my $p = shift; $p->{SUBMISSION_ID} = "c=us;a=;p=Something;l=ABCDEFGH1-030728080154Z-268."; is($p->_submission_id_date, "Mon, 28 Jul 2003 08:01:54 +0000"); } sub test_to_email_mime_with_no_parts { my $p = shift; $p->{BODY_PLAIN} = undef; $p->{BODY_HTML} = undef; ok(defined $p->to_email_mime); } sub test_to_email_mime_with_plain_part { my $p = shift; $p->{BODY_PLAIN} = "plain"; $p->{BODY_HTML} = undef; my $m = $p->to_email_mime; ok(defined $m); ok(($m->parts) == 1); is($m->body, "plain"); is($m->content_type, "text/plain; charset=\"ISO-8859-1\""); } sub test_to_email_mime_with_html_part { my $p = shift; $p->{BODY_PLAIN} = undef; $p->{BODY_HTML} = "html"; my $m = $p->to_email_mime; ok(defined $m); ok(($m->parts) == 1); is($m->body, "html"); is($m->content_type, "text/html"); } sub test_to_email_mime_with_two_parts { my $p = shift; $p->{BODY_PLAIN} = "plain"; $p->{BODY_HTML} = "html"; my $m = $p->to_email_mime; ok(defined $m); ok(($m->parts) == 2); is(($m->parts)[0]->body, "plain"); is(($m->parts)[1]->body, "html"); } Email-Outlook-Message-0.914/t/pod_coverage.t000444001750001750 57212201632372 20737 0ustar00matijsmatijs000000000000use strict; use warnings; use Test::More; eval "use Test::Pod::Coverage"; plan skip_all => "Test::Pod::Coverage required for testing pod coverage" if $@; plan tests => 4; pod_coverage_ok("Email::Outlook::Message"); pod_coverage_ok("Email::Outlook::Message::AddressInfo"); pod_coverage_ok("Email::Outlook::Message::Attachment"); pod_coverage_ok("Email::Outlook::Message::Base"); Email-Outlook-Message-0.914/t/basics.t000444001750001750 25612201632372 17545 0ustar00matijsmatijs000000000000use strict; use warnings; use Test::More tests => 1; use Email::Outlook::Message; eval { my $p = Email::Outlook::Message->new(); }; like($@, qr/^File name is required/); Email-Outlook-Message-0.914/t/plain_jpeg_attached.t000444001750001750 356012201632372 22267 0ustar00matijsmatijs000000000000# Test plain text message, jpeg attached. use strict; use warnings; use Test::More tests => 23; use Email::Outlook::Message; my $p = new Email::Outlook::Message('t/files/plain_jpeg_attached.msg'); ok($p, "Parsing succeeded"); my $m = $p->to_email_mime; is(scalar($m->header_names), 14, "Fourteen headers"); like($m->content_type, qr{^multipart/mixed}, "Content type should be multipart/mixed"); is($m->header("Content-Disposition"), "inline", "Testing content disposition"); is($m->header("Subject"), "test", "Testing subject"); is($m->header("Date"), "Mon, 24 Sep 2007 15:28:03 +0200", "Testing date"); is($m->header("From"), "Matijs van Zuijlen ", "From header"); is($m->header("To"), "matijs\@xxxxxx.nl", "Testing to"); is($m->body, "\r\n", "No body"); my @parts = $m->subparts; is(scalar(@parts), 2, "Two sub-parts"); my $text = $parts[0]; like($text->content_type, qr{^multipart/alternative}, "Content type should be multipart/alternative"); my @textparts = $text->subparts; is(scalar(@textparts), 2, "Two alternatives"); my $plain = $textparts[0]; like($plain->content_type, qr{^text/plain}, "Content type should be text/plain"); is($plain->header("Content-Disposition"), "inline", "Testing content disposition"); is($plain->body, "test\n", "Testing body"); is(scalar($plain->subparts), 0, "No sub-parts"); my $rtf = $textparts[1]; like($rtf->content_type, qr{^application/rtf}, "Content type should be application/rtf"); is($rtf->header("Content-Disposition"), "inline", "Testing content disposition"); is(scalar($rtf->subparts), 0, "No sub-parts"); my $jpg = $parts[1]; like($jpg->content_type, qr{^image/jpeg}, "Content type should be image/jpeg"); is($jpg->header("Content-Disposition"), "attachment; filename=\"test.jpg\"", "Testing content disposition"); is(scalar($jpg->subparts), 0, "No sub-parts"); is(length($jpg->body), 7681, "Correct jpeg size"); Email-Outlook-Message-0.914/t/files000755001750001750 012201632372 17076 5ustar00matijsmatijs000000000000Email-Outlook-Message-0.914/t/files/plain_uc_unsent.msg000444001750001750 2600012201632372 23147 0ustar00matijsmatijs000000000000аЯрЁБс>ўџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ`вlљYЧ @ __properties_version1.00џџџџ __nameid_version1.0(џџџџџџџџ!`вlљYЧ`вlљYЧ__substg1.0_0E04001F*џџџџџџџџ§џџџџџџџџџџџ ўџџџ  ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РFP/йlљYЧ @ __properties_version1.00џџџџ __nameid_version1.0(џџџџџџџџ!`вlљYЧ`вlљYЧ__substg1.0_0E04001F*џџџџџџџџџџџџџџџџ§џџџ ўџџџ  ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ__substg1.0_0E03001F* џџџџўџџџ__substg1.0_0E02001F*џџџџџџџџџџџџўџџџ__recip_version1.0_#00000000:џџџџџџџџ`вlљYЧ`вlљYЧ__substg1.0_001A001F*џџџџ__substg1.0_0037001F*џџџџџџџџB__substg1.0_00410102* џџџџ 8__substg1.0_0042001F*џџџџџџџџџџџџ __substg1.0_0064001F* џџџџўџџџ__substg1.0_0065001F*џџџџџџџџџџџџўџџџ__substg1.0_0070001F* џџџџ B__substg1.0_0E1D001F*џџџџџџџџџџџџB__substg1.0_1000001F*џџџџR__substg1.0_10090102*џџџџџџџџџџџџЋ__substg1.0_300B0102*џџџџ__substg1.0_8003001F*џџџџџџџџџџџџ__substg1.0_003D001F*џџџџџџџџџџџџўџџџўџџџўџџџўџџџўџџџўџџџ ўџџџ ўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџ,-.ўџџџўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџTest for MSGConvert -- plain textSomeone Else11.0Vš… тH/IЁЊАУ„ГЇ4LZFuкЕ rcpg125т2CtexAїџ €Єф€ѓPV?UВ%Qchс Рset2У%і3FЗ0,3я їЖ;05" `cP3 d36P І TJh a АsNt Ђ €№e рdіy2 € Sад} 0This is a test The body is in plain textTest for MSGConvert -- plain textTest User+ЄОЃnнTTest UserSMTPtest@example.comTest for MSGConvert -- plain textIPM.Note@0`вlљYЧ@0`вlљYЧїє 4y  #& )67DA8ѓBdepD @0$А/љYЧ T ЋH__properties_version1.00џџџџџџџџ+ш__substg1.0_0FFF0102*џџџџџџџџ*@__substg1.0_3001001F*џџџџ)__substg1.0_3002001F*џџџџџџџџџџџџ(__substg1.0_3003001F*џџџџ'*__substg1.0_300B0102*џџџџџџџџџџџџ&__substg1.0_5FF6001F*џџџџ%__substg1.0_5FF70102*џџџџџџџџџџџџ$@__substg1.0_0FF60102*џџџџџџџџџџџџ#__substg1.0_00020102*џџџџџџџџџџџџ0__substg1.0_00030102*џџџџ/@__substg1.0_00040102*џџџџџџџџџџџџўџџџ__substg1.0_100F0102*#%џџџџ"__substg1.0_10010102* џџџџ!__substg1.0_101E0102*џџџџџџџџџџџџ __substg1.0_100A0102*&џџџџџџџџ__substg1.0_10110102*џџџџџџџџџџџџ__substg1.0_10120102*$"џџџџ__substg1.0_10090102*џџџџџџџџџџџџџџџџџџџџџџџџ€џџџџ 0ёо?щ§ €€€˜У€  €€ €€= D…………T……R……|у+ЄОЃnнTSomeone ElseSMTPsomeone@somewhere.comSomeone ElseSMTP:SOMEONE@SOMEWHERE.COMsomeone@somewhere.comSMTPSomeone Else+ЄОЃnнTSomeone ElseSMTPsomeone@somewhere.com ўџ@щ00 0, 0щ9і_ї_@щ§_џ_іщ004……R…T…………… РFEmail-Outlook-Message-0.914/t/files/plain_jpeg_attached.msg000444001750001750 6400012201632372 23730 0ustar00matijsmatijs000000000000аЯрЁБс>ўџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot EntryџџџџџџџџАР!jЎўЧ__properties_version1.00џџџџџџџџџџџџA __nameid_version1.0(џџџџџџџџ?рjЎўЧаЛjЎўЧ__substg1.0_0E04001E*џџџџ*џџџџ§џџџџџџџџџџџ ўџџџўџџџ0!"#$%&'()*+,-./ўџџџ12ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РF‰2jЎўЧ__properties_version1.00џџџџџџџџџџџџA __nameid_version1.0(џџџџџџџџ?рjЎўЧаЛjЎўЧ__substg1.0_0E04001E*џџџџ*џџџџџџџџџџџџ§џџџ ўџџџўџџџ0!"#$%&'()*+,-./ўџџџ12ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ__substg1.0_0E03001E*џџџџўџџџ__substg1.0_0E02001E*џџџџџџџџџџџџўџџџ__recip_version1.0_#00000000:'4айjЎўЧайjЎўЧ__attach_version1.0_#00000000<џџџџџџџџ-аJjЎўЧаЛjЎўЧ__substg1.0_001A001E* џџџџ@__substg1.0_0037001E*џџџџџџџџџџџџ?__substg1.0_003B0102* џџџџ>"__substg1.0_003F0102*(џџџџџџџџ<A__substg1.0_0040001E* џџџџ;__substg1.0_00410102*џџџџџџџџџџџџ8‚__substg1.0_0042001E* џџџџ7__substg1.0_00510102*џџџџџџџџџџџџ6__substg1.0_0064001E*џџџџ5__substg1.0_0065001E*џџџџџџџџџџџџ4__substg1.0_0070001E*џџџџ3__substg1.0_00710102*џџџџџџџџџџџџ2__substg1.0_0075001E*џџџџ1__substg1.0_0076001E*џџџџџџџџџџџџ0__substg1.0_007D001E*џџџџš__substg1.0_0C190102*џџџџџџџџџџџџ‚__substg1.0_0C1A001E*џџџџ__substg1.0_0C1D0102*џџџџџџџџџџџџ"__substg1.0_0C1E001E*џџџџ__substg1.0_0C1F001E*џџџџџџџџ__substg1.0_0E28001E*џџџџџџџџ/__substg1.0_0E29001E*!џџџџ/__substg1.0_1000001E*џџџџ)џџџџ__substg1.0_1035001E* џџџџ#__substg1.0_1046001E*џџџџџџџџџџџџ __substg1.0_300B0102*%џџџџ __substg1.0_8000001E*џџџџџџџџџџџџ __substg1.0_8001001E*"$џџџџ __substg1.0_80020102*џџџџџџџџџџџџz__substg1.0_8003001E*#џџџџ<__substg1.0_80040102*џџџџџџџџџџџџ__substg1.0_8005001E*&џџџџ__substg1.0_003D001E*џџџџџџџџџџџџўџџџ__substg1.0_10090102*џџџџџџџџџџџџŠ__substg1.0_0E1D001E*џџџџџџџџџџџџ__properties_version1.00џџџџџџџџџџџџYиўџџџўџџџўџџџўџџџўџџџўџџџ ўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџ !"#$%&'()*+,-./ўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџ9:ўџџџўџџџ=ўџџџўџџџўџџџўџџџBCDEFGHIJKLMўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџZ[\ўџџџўџџџўџџџўџџџўџџџўџџџcўџџџefўџџџhiўџџџўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџtestmatijs@xxxxxx.nl† LZFuЕйд rcpg125т2CtexAїџ €Єф€ѓPV?UВ%Qchс Рset2У%і3FЗ0,3я їЖ;05" `cPГ d36P І А,st Ђ €} by XS4ALL Virus Scannertest 24 Sep 2007 13:25:29.0021 (UTC) FILETIME=[5FE8DED0:01C7FEAE]POP://pop.xxxxxxxxxxxxxx.nl/AAgALyMAAAwLIlF0KxIrx6070KeHud2Z00000004matijs@xxxxxx.nlpop.xxxxxxxxxxxxxx.nlЋєƒz.УEЎц5РB‘Зяmatijs@matijs.net<20070924132803.GB10141@matijs.net>test 00000004matijs@xxxxxx.nlpop.xxxxxxxxxxxxxx.nl00000004matijs@xxxxxx.nlpop.xxxxxxxxxxxxxx.nlMatijs.van.Zuijlen@xs4all.nlSMTPSMTP:MATIJS.VAN.ZUIJLEN@XS4ALL.NLMatijs van Zuijlen+ЄОЃnнT€Matijs van ZuijlenSMTPMatijs.van.Zuijlen@xs4all.nlReceived: from XXXXXXXXX.XXX.XX.NL ([111.111.111.111]) by XXXXXXXXX.XXX.XX.NL with Microsoft SMTPSVC(6.0.3790.1830); Mon, 24 Sep 2007 15:25:28 +0200 Received: from xxxxxxxxx.xx.nl ([11.111.11.11]) by XXXXXXXXX.XXX.XX.NL with Microsoft SMTPSVC(6.0.3790.1830); Mon, 24 Sep 2007 15:25:28 +0200 Received: from smtp-vbr14.xs4all.nl ([194.109.24.34]) by xxxxxxxxx.xx.nl with esmtp (Exim 4.68 (FreeBSD)) (envelope-from ) id 1IZnw9-000CV8-75 for matijs@xxxxxx.nl; Mon, 24 Sep 2007 15:25:28 +0200 Received: from apricot.matijs.net (mvz.xs4all.nl [80.126.4.68]) by smtp-vbr14.xs4all.nl (8.13.8/8.13.8) with ESMTP id l8ODPKnc051489 for ; Mon, 24 Sep 2007 15:25:20 +0200 (CEST) (envelope-from matijs@matijs.net) Received: from matijs by apricot.matijs.net with local (Exim 4.67) (envelope-from ) id 1IZnyl-000622-Ij for matijs@xxxxxx.nl; Mon, 24 Sep 2007 15:28:03 +0200 Date: Mon, 24 Sep 2007 15:28:03 +0200 From: Matijs van Zuijlen To: matijs@xxxxxx.nl Subject: test Message-ID: <20070924132803.GB10141@matijs.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="BwCQnh7xodEAoBMC" Content-Disposition: inline User-Agent: Mutt/1.5.16 (2007-06-11) X-Virus-Scanned: by XS4ALL Virus Scanner Return-Path: matijs@matijs.net X-OriginalArrivalTime: 24 Sep 2007 13:25:29.0021 (UTC) FILETIME=[5FE8DED0:01C7FEAE] matijs@xxxxxx.nlSMTPЧўЎ_MjbА%ˆM-­\иив-2testMatijs.van.Zuijlen@xs4all.nlSMTPSMTP:MATIJS@XXXXXX.NLMatijs van Zuijlen+ЄОЃnнT€Matijs van ZuijlenSMTPMatijs.van.Zuijlen@xs4all.nlMatijs van Zuijlen+ЄОЃnнTMatijs van ZuijlenSMTPmatijs@xxxxxx.nlSMTP:MATIJS.VAN.ZUIJLEN@XS4ALL.NLtestIPM.Note@0рjЎўЧ@0рjЎўЧїє 7@9€3АЛЎўЧ;"š?Aš@A‚ѓBQšdepqšuv}› ‚š  "˜__substg1.0_0FF90102*џџџџџџџџџџџџX__substg1.0_37010102*,/џџџџ __substg1.0_3704001E*џџџџџџџџџџџџW__substg1.0_3707001E*.1џџџџV__substg1.0_370A0102*џџџџџџџџџџџџU __substg1.0_370E001E*0+џџџџT __properties_version1.007џџџџџџџџdˆ__substg1.0_0FFF0102*8џџџџџџџџbf__substg1.0_3001001E*36џџџџa__substg1.0_3002001E*џџџџџџџџџџџџ`__substg1.0_3003001E*52џџџџ___substg1.0_300B0102*џџџџџџџџџџџџ^__substg1.0_0FF60102*џџџџџџџџџџџџ]__substg1.0_00020102*џџџџџџџџџџџџk@__substg1.0_00030102*9;џџџџj0__substg1.0_00040102*џџџџџџџџџџџџg‚__substg1.0_10140102*>=џџџџS__substg1.0_10150102*џџџџAџџџџR__substg1.0_10060102*џџџџ@џџџџQ__substg1.0_10010102*:<џџџџP__substg1.0_10080102*џџџџџџџџџџџџO__substg1.0_101D0102*џџџџџџџџџџџџNџџџџџџџџџџџџџџџџџџџџџџџџ  @M_ЎўЧ(0)05$F 0šо?ŸN€€€zš€=€š€=  Šte є ˜—фЩ ‹[Ъ †AЌƒ …€…image/jpeg*†H†ї test.jpgtest.jpgџиџрJFIFHHџсExifMM*џўCreated with GIMPџлC  !"$"$џлCџРр€"џФ џФ!a1џФџФџк ?јШO=ш8МI"Z34g lхЃ>%|фœДg$ЮWЮ@љЪљ№‘-Ш9^$™ЫDH%Ђ$™ёЃ9DДg$‰_9ФДg$‰_9ч+Ф“>4g xтљЩ"Z36rбLхЂ$ бœ“9^$dqlф‘Хт@љЪљЩ3уFrЮWЯ„‰hЮ@б-$‰_9ч-Щ"W‰ч+ч%‰_9ч+ч$‰h‰g-Щ3•ѓ>rбLх|фŸ‰.rМH%|фБ+ФтWЮIœДg h–Œф™ЪљШ9hЮIœЏœтWЮKœЏœтW‰$KDpœЏH•ѓтW‰,JљШ%|фЙЪљШ%|ф™ЫFr‰hЮIœЏœѓ–Œф‘+ч x•ѓ’ч+ФтWЮIбœтWЮIОrЮZ3’DЏœѓ•тKœЏœѓ•ѓс"Z3rО|.rМH9^$‘- ђдyї ьsеѓ’DДDѓ•ѓ’DЏœтZ"I_9ФЏX•т@ё+ч%‰_9ФЏœ’%Ѓ9DДG Оr‰_9.rМH%x’DДg |х|ф‘- lхЂ$™ЫFr‰hЮIœЏ‰_>%Ѓ9ч+ч$ЮZ3rОrH–ŒфV)YчН[9ч+Ч œДg x•ѓ’g- x•ѓ’DЏœѓ–Œф‘+Фѓ–ˆ’DЏŸёХѓ’g- lхЂ$‘+ч |хЃ9$Jё x•у…‰_9ч+чТчХѓ>rМI"Z"@йЫFrLхx>rб&rОrЮW‰.|_>ѓ•тIбŸб-№™Ъё |јбH•ѓrОr\хx>rОrH•т@љЫFrLх|фœДD’%|фœЏLхЂ$Q€ЧйЫDI"WЮ@ё+ч%‰^8ЮW‰$KDH9_9$KDH9hЮIМH9hЮIœЏœѓ•ѓ’ч+ч |хx’DДg lхЂ$™ЫFrЮZ3’DЏœѓ–Œф™ЪљШ9^$Б+ФтWЮIœДg lхЂ$™ЪљШ9hЮI^$ОrH–Œф_9$KDp œДg$‰^$Ÿ"IОrЮWЯ…ЮW‰ФЏLхЂ$œЏœ“9hЮ@йЫFrH•ѓр9_9,JљШ<šГЯzЖrLјбœГ–ˆс3–ˆ4KDp™ЪљШ9^$ЙЪё x•ѓ’g- x•ѓ’DДg hуFrLх|фœЏ\х|фœЏœ“9h‰ФЏœ“9^$œДg$‰_9ФДD“9_9ч+ч%‰^$œЏœ“9h‰ФЏœ“9hЮ@б-Щ3•ѓ>rМIs•ѓ>rМI"Z36rбLхЃ9DДD“9_9ФДg$‰^$œЏX•ѓр9_9$KFr‰_9$JљШ)œЏH•ѓy"iчНsŸеb@љЪё%‰_9ч+Ф“9hЯ€h–Œф‘+ч x–ˆ’g+Фѓ•ѓ’g-Ш9^$™ЫFr‰h‰&rбœГ–Œф™ЪљШ9^$ЙЪёР>rОrH–ŒфœЏœ’%Ђ$ œДg$ЮW‰ч-№™ЪљШ>/œ’%Ѓ9ч+ч$‰hЮ@йЫFrLхxр9h‰$Jё |хx’ч+Фѓ•тIœДg |хx’g- lхЂ$™Ъё x–Œф™ЪљШ>/œ’%Ђ$œЏLхЃ>ЂZ3’g+ФƒШ€ž{а4KDI"W‰ФЏ\хxrбH•ѓр%x’G3>rОrLх|фЮWЮIбЮZ"IœЏœѓтљЩbWЮ@љЪё$ЮZ"@йЫFrLх|фœДg$ЮW‰ч+ч%ЮW‰ч+ч%ЮWЮ@љЪљЩ"Z36rбœ“9_9ФЏX•ѓ>rМp™ЫFr‰_9$KFr‰^$™Ъё xуFrLхxrМI3тљШ9hЮIОrЮW‰.rМH%|ф‘- lхЃ9&rб‰h‰&rОr‰_9,JљШ%|ф™ёЃ9ч+Ф“9hЮ@љЪљЩ"W‰ч+ч%ЮWЮ@ё+ч%ЮWЮ@ё+Ф’%Ѓ9g-ТDДg lхЂ$™Ъё |јМIs•ѓ/œ“9hЮ@б-Щ3•ѓrОrH–Œф бœ’%|фОr\х|фœЏH–ŒфŸ‰&rбgЦŒф™ЫFr‰hЮIОrЮW‰$KFr‰_9&rб‰hЮIŸ34KDI"W‰ФДg$ЮWЮ@ё+ч$‰hЮ@йЫFrLхЃ9DДg$ЮW‰Ч3’DЏЮWЯ…ЮW‰ч+Ф“9h‰g-$ЮW‰ч-$ЮWЮ@љЫDI"WŽѓ•тKОrЮWЮIœДg h–Œф™Ъё x•чž$рёœёТЯ=ъљШ9hЮIОrЯЩ3•т@љЪљЩs•ѓ>rМI3–Œф œДD“9_9Ч3’DЏœтWЮKМH%|ф‘-Ш%xс3–Œф бœ“9_9Ч3’g+ФтWЯ„‰h‰ФЏLхЂ$ бLх|фœЏœ–%|фœЏ\хx>rОrLхЂ$œЏœ“9h‰g-$ЮW‰ч+ч%ЮW‰ч+ч$‰hЮ@ёХтIœДg lхЃ>9^$_9.rМH9_9.rМH9_9&rб‰_9&rМsР79чёœG=ч+ч$ЮZ"@б-Щ"Z"@б-Щ"WЮ@ё+Ф–%|фŸЯ„‰hЮ@ё+Ф“9hЮ@йёЃ9$JљШ9hЮIœЏœтW‰ќ.rОrЮZ"IœДDѓ•тIœЏЮZ3’DЏœтWЮKМH8МI3–ˆrМI"Z"@ё+Ф“9hЯ€h–Œф™ЪљШ%x’ч+Фѓ•тIœДDтTryчŒрwœѕh’GЮ@ё+ч%Я‹ФтWЮIœДg |х|ф™ЪљШ%Ђ$™Ъё |х|фБ+ФтWЮIœДGё+ч$ЮWЮ@љЫFrLх|фœЏ\х|фœЏH–ˆrОrLхЃ9g-$ЮWЮ@ё-$ЮWЮ@љЪё%ЮW‰ч+чТg-Ш8ОrH•т@љёЃ9&rМH%x’чХѓ>rОrLхЃ9чХѓ’DДg |х|ф‘+ч |хЃ9&rОrЮW‰.rОrЮWЮIœДg x•ѓ’DЏЮZ"IœЏЮZ3’DЏœѓ•тKОrЮWЮIœДDГ–ˆ’G‰ФДg$ЮW‰ФЏœ—9_9ФЏœ’%Ѓ>Г–ˆ’DЏЯ<у Цpž{а4sъљЩ3–ŒфМI3–ˆ4KDI"W‰ч+Ф—9^$МI3–ŒфМI"Z"@б-Щ3тљШ9_9.rОr‰^$ЙЪё |х|ф‘-Ш%Ђ$™ЪљШ%Ѓ9&rОrЮW‰,JљШ%x’DДg |хx’g-№ œДg$‰h‰g-Щ"W‰ФЏŸ бœтWЮIбœГ–ˆ’gХѓр9h‰&rМH9^$ЙЪљШ9^$‘-Ш%|ф™Ъё |хЃ>9_9чЦŒф™ЪљШ%x’gЦˆ>rЗ9ч 0rбœ“9_>у‹ч$‰^yчаrбœ“9^$œЏœ“9hЮ@ё+ч$ЮZ34KFrLхx/LхЂ$œЏœ“9hЯ€|хx’g- x•тIŸ‰ч-Щ3тё x•ѓ’ФЏЯ‹Ф’%Ѓ9чХѓ’DЏœѓуDI3•ѓ>rОr\х|фœЏLхЂ$О|$JљШ9h‰&rМpœЏœ—9_9чХтIœДg |х|јH•ѓ>rбœ“9_>тW‰,qxrОrLхЃ9ФЏœ“9hЮ@йЫDI"WЮ@љЫDI3•т@љЪё%Я‹ЧмчœЦp є œДD’%|фœЏ\хxтW‰$KDH9hЮIО|ч-Щ3•ѓ>rМIc‹ч |х|ф™ЫDH9hЮIœДg h–Œф™ЪљШ9_9.rОr‰^$™ЫDH9_9$KF|g-$‰_>ѓ•xфѓЮ:Ря>Ћœ’8бœЂZ3’g+ч |хЃ9&rОrЮWЮKœЏœтWЮIœДg |х|ф‘-Ш%Ѓ9$Jё |х|фЙЪљШ9_9$KFrЮW‰$KDH9hЮIОrЮZ3’g+ч |х|фБ+ч |х|ф™ЫDH9h‰&rбЮZ3’g+ч |хЂ$™ЪљШ>/œ’%Ђ$МI"Z"@б-Щ3•ѓ>rОrX•ѓrОrH–Œф œДg$‰_9ч-Щ3•ѓ>rМIbWЮ@љЪё%Я‹ч x•тIœДDЂZ3’g+ФтWЮKМH8О|.rОrЮW‰$KFr‰hЮIœЏ‰h‰$JљШ9^$™ЫDH9_9&rбŸйёЃ9&rОr‰hЮIОrЮZ"IœЏœтW‰&rбœѓ•тIб‰hЮIœЏŸљЪљЩs•т@ё+ч%‰_9G<0ёœyЯzЧ"IМpОr\хx>rОrH–ˆrМI3–ŒфОrH–Œф бœ“9_9ч+ч%ЮWЯ€|х|фБ+Фѓ•тIœДg lхЃ9$KFrЮZ"IœЏœтWЯ…‰^$œЏœ’%Ѓ9ФЏœ’%Ђ$ОrLх|фœДD’%x>rОr\х|фœЏH–ˆ>rОrLх|фœДg$Я‹Фѓ•тKМH9^$™ЫDH9h‰&rбœЂZ3’g+ФтVžyТФœ3€)YчН_9DДg$ЮW‰ч-$ЮWЮ@ё+Ф–8Оr‰^$‘-Ш%|ф‘- h•ѓ’ФЏœтZ3’DЏЮWЮIœДg |хx’g-Ш%Ѓ9&rМH9h‰&rОr‰_9&rб‰^$™ЪљШ%Ђ$‘+ч |хЃ9$JљШ9^$БХт@љЪё$Ž4g lјбœ’%Ѓ9g-Щ"WЮ@ё-Щ3•т@ё+Ф“9hЮ@љЪё$‰hЮ@йёЂ$™Ъё |х|фЙЪё |х|фЙЪљШ9_9&rбЮZ3’g+Я<р:Œр€ё |х|ф™ЫFrЮWЮIhЮ@йЫFrH•т@ё+Ф–%|фŸ‰,JљШ9^$‘-Ш9^$™ЪљШ9hЮIМH9_9.rОrЮW‰&rбœѓ•ѓ’g+чРrМp‘-Ш8ОrLхЂ$ œДD“9^$œДD“>/œтWЮKОrЮW‰$KDH%x’g+Фѓ–Œф‘+Фѓ•тKОrЮWЮIœДDтW‰$KFrЮZ"IœЏЮZ3’DЏœѓ•тIбœтN9Я8у8ž{еѓ’DЏœтWЮKО|чХтIбЮWЮIМH9_9,JљШ9h‰&rМH9_9$KFrЮZ"IбœГ–Œф‘+Фѓ–ˆ’g+Фѓ•тIбŸйЫDI"Z36rбLх|фœДg$‰_9ч+ч%ЮWЮ@ёХѓ’g-Ш9_9$KFr‰hЮIœЏЮZ"IОr‰^$™ЫF|ФЏœ“9hЮ@б-Тg+чР9hЮ@йЫDI3•ѓrбH•ѓrМI"Z"@йЫFrLхxр9hЯ„ЮWЮ@ё+Ф–%xр8Оr\хx>rЏ>9ўџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ€аs`љYЧ @ __properties_version1.00џџџџ __nameid_version1.0(џџџџџџџџ!€аs`љYЧ€аs`љYЧ__substg1.0_0E04001E*џџџџџџџџ §џџџџџџџџџџџ ўџџџ  ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РF`F}`љYЧ @ __properties_version1.00џџџџ __nameid_version1.0(џџџџџџџџ!€аs`љYЧ€аs`љYЧ__substg1.0_0E04001E*џџџџџџџџ џџџџџџџџ§џџџ ўџџџ  ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ__substg1.0_0E03001E* џџџџўџџџ__substg1.0_0E02001E*џџџџџџџџџџџџўџџџ__recip_version1.0_#00000000:џџџџџџџџ€аs`љYЧ€аs`љYЧ__substg1.0_001A001E*џџџџ __substg1.0_0037001E*џџџџџџџџ !__substg1.0_00410102* џџџџ 8__substg1.0_0042001E*џџџџџџџџџџџџ __substg1.0_0064001E* џџџџўџџџ__substg1.0_0065001E*џџџџџџџџџџџџўџџџ__substg1.0_0070001E* џџџџ!__substg1.0_0E1D001E*џџџџџџџџџџџџ!__substg1.0_1000001E*џџџџ)__substg1.0_300B0102*џџџџ__substg1.0_8003001E*џџџџџџџџџџџџ__substg1.0_003D001E*џџџџџџџџџџџџўџџџ__substg1.0_10090102*џџџџџџџџџџџџЋўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџ()*ўџџџўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџTest for MSGConvert -- plain textSomeone ElseЇ4LZFuкЕ rcpg125т2CtexAїџ €Єф€ѓPV?UВ%Qchс Рset2У%і3FЗ0,3я їЖ;05" `cP3 d36P І TJh a АsNt Ђ €№e рdіy2 € Sад} 011.0Vš… тH/IЁЊАУ„ГThis is a test The body is in plain textTest for MSGConvert -- plain textTest User+ЄОЃnнTTest UserSMTPtest@example.comTest for MSGConvert -- plain textIPM.Note@0€аs`љYЧ@0€аs`љYЧїє  __properties_version1.00џџџџџџџџ'ш__substg1.0_0FFF0102*џџџџџџџџ&@__substg1.0_3001001E*џџџџ% __substg1.0_3002001E*џџџџџџџџџџџџ$__substg1.0_3003001E*џџџџ#__substg1.0_300B0102*џџџџџџџџџџџџ"__substg1.0_5FF6001E*џџџџ! __substg1.0_5FF70102*џџџџџџџџџџџџ @__substg1.0_0FF60102*џџџџџџџџџџџџ__substg1.0_00020102*џџџџџџџџџџџџ,__substg1.0_00030102*џџџџ+@__substg1.0_00040102*џџџџџџџџџџџџўџџџ__substg1.0_100F0102*#%џџџџ__substg1.0_10010102* џџџџ__substg1.0_101E0102*џџџџџџџџџџџџ__substg1.0_100A0102*&џџџџџџџџ__substg1.0_10110102*џџџџџџџџџџџџ__substg1.0_10120102*$"џџџџ__substg1.0_10090102*џџџџџџџџџџџџџџџџџџџџџџџџ #& )67"A8ѓB dep" @0$А/љYЧ *€џџџџ 0№о?щ§ €€€˜У€ €€ €€=  Ћe"№…………T……R……|у+ЄОЃnнTSomeone ElseSMTPsomeone@somewhere.comSomeone ElseSMTP:SOMEONE@SOMEWHERE.COMsomeone@somewhere.comSMTPSomeone Else+ЄОЃnнTSomeone ElseSMTPsomeone@somewhere.com ўџ@ђ0 00 0№9і_ ї_@ѓ§_џ_і№06E……R…T…………… РFEmail-Outlook-Message-0.914/t/files/plain_uc_wc_unsent.msg000444001750001750 2600112201632372 23641 0ustar00matijsmatijs000000000000аЯрЁБс>ўџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ`вlљYЧ @ __properties_version1.00џџџџ __nameid_version1.0(џџџџџџџџ!`вlљYЧ`вlљYЧ__substg1.0_0E04001F*џџџџџџџџ§џџџџџџџџџџџ ўџџџ  ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РFP/йlљYЧ @ __properties_version1.00џџџџ __nameid_version1.0(џџџџџџџџ!`вlљYЧ`вlљYЧ__substg1.0_0E04001F*џџџџџџџџџџџџџџџџ§џџџ ўџџџ  ўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ__substg1.0_0E03001F* џџџџўџџџ__substg1.0_0E02001F*џџџџџџџџџџџџўџџџ__recip_version1.0_#00000000:џџџџџџџџ`вlљYЧ`вlљYЧ__substg1.0_001A001F*џџџџ__substg1.0_0037001F*џџџџџџџџB__substg1.0_00410102* џџџџ 8__substg1.0_0042001F*џџџџџџџџџџџџ __substg1.0_0064001F* џџџџўџџџ__substg1.0_0065001F*џџџџџџџџџџџџўџџџ__substg1.0_0070001F* џџџџ B__substg1.0_0E1D001F*џџџџџџџџџџџџB__substg1.0_1000001F*џџџџR__substg1.0_10090102*џџџџџџџџџџџџЋ__substg1.0_300B0102*џџџџ__substg1.0_8003001F*џџџџџџџџџџџџ__substg1.0_003D001F*џџџџџџџџџџџџўџџџўџџџўџџџўџџџўџџџўџџџ ўџџџ ўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџ,-.ўџџџўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџTest for MSGConvert -- plain textSomeone Else11.0Vš… тH/IЁЊАУ„ГЇ4LZFuкЕ rcpg125т2CtexAїџ €Єф€ѓPV?UВ%Qchс Рset2У%і3FЗ0,3я їЖ;05" `cP3 d36P І TJh a АsNt Ђ €№e рdіy2 € Sад} 0This is a test The body is in pllain textTest for MSGConvert -- plain textTest User+ЄОЃnнTTest UserSMTPtest@example.comTest for MSGConvert -- plain textIPM.Note@0`вlљYЧ@0`вlљYЧїє 4y  #& )67DA8ѓBdepD @0$А/љYЧ T ЋH__properties_version1.00џџџџџџџџ+ш__substg1.0_0FFF0102*џџџџџџџџ*@__substg1.0_3001001F*џџџџ)__substg1.0_3002001F*џџџџџџџџџџџџ(__substg1.0_3003001F*џџџџ'*__substg1.0_300B0102*џџџџџџџџџџџџ&__substg1.0_5FF6001F*џџџџ%__substg1.0_5FF70102*џџџџџџџџџџџџ$@__substg1.0_0FF60102*џџџџџџџџџџџџ#__substg1.0_00020102*џџџџџџџџџџџџ0__substg1.0_00030102*џџџџ/@__substg1.0_00040102*џџџџџџџџџџџџўџџџ__substg1.0_100F0102*#%џџџџ"__substg1.0_10010102* џџџџ!__substg1.0_101E0102*џџџџџџџџџџџџ __substg1.0_100A0102*&џџџџџџџџ__substg1.0_10110102*џџџџџџџџџџџџ__substg1.0_10120102*$"џџџџ__substg1.0_10090102*џџџџџџџџџџџџџџџџџџџџџџџџ€џџџџ 0ёо?щ§ €€€˜У€  €€ €€= D…………T……R……|у+ЄОЃnнTSomeone ElseSMTPsomeone@somewhere.comSomeone ElseSMTP:SOMEONE@SOMEWHERE.COMsomeone@somewhere.comSMTPSomeone Else+ЄОЃnнTSomeone ElseSMTPsomeone@somewhere.com ўџ@щ00 0, 0щ9і_ї_@щ§_џ_іщ004……R…T…………… РF Email-Outlook-Message-0.914/t/files/gpg_signed.msg000444001750001750 5400012201632372 22070 0ustar00matijsmatijs000000000000аЯрЁБс>ўџ ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ`Jй§YЧ€$__properties_version1.00.џџџџџџџџQ __nameid_version1.0(џџџџџџџџC`Jй§YЧ`Jй§YЧ__substg1.0_0E04001E*џџџџ1џџџџ§џџџџџџџџџџџ '" !ўџџџ#$%&(ўџџџ)*ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџRoot Entryџџџџџџџџ РFP-Vй§YЧ€$__properties_version1.00.џџџџџџџџQ __nameid_version1.0(џџџџџџџџC`Jй§YЧ`Jй§YЧ__substg1.0_0E04001E*џџџџ1џџџџџџџџџџџџ§џџџ '" !ўџџџ#$%&(ўџџџ)*ўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ__substg1.0_0E03001E*џџџџўџџџ__substg1.0_0E02001E*џџџџџџџџџџџџўџџџ__recip_version1.0_#00000000:8`Jй§YЧ`Jй§YЧ__attach_version1.0_#00000000<џџџџџџџџ4`Jй§YЧ`Jй§YЧ__substg1.0_001A001E* џџџџP__substg1.0_0037001E*џџџџџџџџџџџџO__substg1.0_003B0102* џџџџN"__substg1.0_003F0102*/џџџџџџџџLA__substg1.0_0040001E* џџџџK__substg1.0_00410102*џџџџџџџџџџџџH‚__substg1.0_0042001E* џџџџG__substg1.0_00510102*џџџџџџџџџџџџF__substg1.0_0064001E*џџџџE__substg1.0_0065001E*џџџџџџџџџџџџD__substg1.0_0070001E*џџџџC__substg1.0_00710102*џџџџџџџџџџџџB__substg1.0_0075001E*џџџџA__substg1.0_0076001E*џџџџџџџџџџџџ@__substg1.0_007D001E*џџџџ# __substg1.0_0C190102*џџџџџџџџџџџџ ‚__substg1.0_0C1A001E*џџџџ__substg1.0_0C1D0102*џџџџџџџџџџџџ"__substg1.0_0C1E001E*џџџџ__substg1.0_0C1F001E*џџџџџџџџ__substg1.0_0E28001E*џџџџџџџџ/__substg1.0_0E29001E*%џџџџ/__substg1.0_1000001E*џџџџ0џџџџO__substg1.0_1035001E* џџџџ"__substg1.0_1046001E*џџџџџџџџџџџџ__substg1.0_300B0102*#џџџџ__substg1.0_8000001E*џџџџџџџџџџџџ__substg1.0_8001001E*"$џџџџ__substg1.0_80020102*џџџџџџџџџџџџz__substg1.0_8003001E*!)џџџџ<__substg1.0_80040102*џџџџџџџџџџџџO__substg1.0_8005001E*&(џџџџ 2__substg1.0_8006001E*џџџџџџџџџџџџ Q__substg1.0_8007001E*'-џџџџ __substg1.0_8008001E*џџџџџџџџџџџџўџџџ__substg1.0_8009001E**,џџџџ __substg1.0_800A001E*џџџџџџџџџџџџ __substg1.0_800B001E*+џџџџ__substg1.0_800C001E*џџџџџџџџџџџџ__substg1.0_003D001E*џџџџџџџџџџџџўџџџ__substg1.0_10090102*џџџџџџџџџџџџй__substg1.0_0E1D001E*џџџџџџџџџџџџ__properties_version1.005џџџџџџџџ{˜__substg1.0_0FF90102*џџџџџџџџџџџџzўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџ ўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџ!"ўџџџ$%&'()*+,-./0123456789:;<=>?ўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџIJўџџџўџџџMўџџџўџџџўџџџўџџџRSTUVWXYZ[\]^_ўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџўџџџnopqrstuvwxyўџџџўџџџ|}ўџџџўџџџўџџџTest for MSGConvertmatijs@matijs.netеpLZFuЃSz rcpg125т2CtexAїџ €Єф€ѓPV?UВ%Qchс Рset2У%і3FЗ0,3я їЖ;05" `cP3 d36P І TЊh y pothАst.3 Ђ €-- у €Ma(tij v‘Zu} l № ‚0 Џ!hA@p://w".SР’.n /„}#№4.2Yes (on xxxx.xxxxxxx.nl)194.109.24.33matijs@matijs.netby XS4ALL Virus ScannerNo, score=-1.7 required=5.0 tests=AWL,BAYES_00autolearn=unavailable version=3.1.8SpamAssassin 3.1.8 (2007-02-13) on xxxx.xxxxxxx.nlThis is yet another test. -- Matijs van Zuijlen http://www.matijs.net/ 26 Feb 2007 23:14:28.0715 (UTC) FILETIME=[DD42BBB0:01C759FB]POP://pop.xxxxxxxxxxxxxx.nl/AAgtJyMAAAwLIlF0KxIrx6070KeHud2Z00000004matijs@xxxxxx.nlpop.xxxxxxxxxxxxxx.nl ]А8р FŽ–Х;ћЙ&matijs@matijs.net<20070226231209.GD1841@matijs.net>This is yet another test. -- Matijs van Zuijlen http://www.matijs.net/ 00000004matijs@xxxxxx.nlpop.xxxxxxxxxxxxxx.nl00000004matijs@xxxxxx.nlpop.xxxxxxxxxxxxxx.nlMatijs.van.Zuijlen@xs4all.nlSMTPSMTP:MATIJS.VAN.ZUIJLEN@XS4ALL.NLMatijs van Zuijlen+ЄОЃnнT€Matijs van ZuijlenSMTPMatijs.van.Zuijlen@xs4all.nlReceived: from XXXXXXXXX.XXX.XX.NL ([111.111.111.111]) by XXXXXXXXX.XXX.XX.NL with Microsoft SMTPSVC(6.0.3790.1830); Tue, 27 Feb 2007 00:14:28 +0100 Received: from xxxx.xxxxxxx.nl ([11.111.11.11]) by XXXXXXXXX.XXX.XX.NL with Microsoft SMTPSVC(6.0.3790.1830); Tue, 27 Feb 2007 00:14:28 +0100 Received: from smtp-vbr13.xs4all.nl ([194.109.24.33]) by xxxx.xxxxxxx.nl with esmtp (Exim 4.66 (FreeBSD)) (envelope-from ) id 1HLp12-0000il-T7 for matijs@xxxxxx.nl; Tue, 27 Feb 2007 00:14:28 +0100 Received: from localhost (mvz.xs4all.nl [80.126.4.68]) by smtp-vbr13.xs4all.nl (8.13.8/8.13.8) with ESMTP id l1QNCFIW093173 for ; Tue, 27 Feb 2007 00:12:20 +0100 (CET) (envelope-from matijs@matijs.net) Received: from matijs by localhost with local (Exim 4.63) (envelope-from ) id 1HLp0s-0005Jg-49; Tue, 27 Feb 2007 00:12:10 +0100 Date: Tue, 27 Feb 2007 00:12:10 +0100 From: Matijs van Zuijlen To: matijs@matijs.net Message-ID: <20070226231209.GD1841@matijs.net> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.13 (2006-08-11) X-Virus-Scanned: by XS4ALL Virus Scanner X-SA-Exim-Connect-IP: 194.109.24.33 X-SA-Exim-Mail-From: matijs@matijs.net X-Spam-Checker-Version: SpamAssassin 3.1.8 (2007-02-13) on xxxx.xxxxxxx.nl X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00 autolearn=unavailable version=3.1.8 Subject: Test for MSGConvert Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="cHMo6Wbp1wrKhbfi" X-SA-Exim-Version: 4.2 X-SA-Exim-Scanned: Yes (on xxxx.xxxxxxx.nl) Return-Path: matijs@matijs.net X-OriginalArrivalTime: 26 Feb 2007 23:14:28.0715 (UTC) FILETIME=[DD42BBB0:01C759FB] matijs@xxxxxx.nlSMTPЧYћмеi6RЯD\C5ŠsŠб›ЕЄTest for MSGConvertMatijs.van.Zuijlen@xs4all.nlSMTPSMTP:MATIJS@XXXXXX.NLMatijs van Zuijlen+ЄОЃnнT€Matijs van ZuijlenSMTPMatijs.van.Zuijlen@xs4all.nlMatijs van Zuijlen+ЄОЃnнTMatijs van ZuijlenSMTPmatijs@xxxxxx.nlSMTP:MATIJS.VAN.ZUIJLEN@XS4ALL.NLTest for MSGConvertIPM.Note.SMIME.MultipartSigned@0`Jй§YЧ@0`Jй§YЧїє7@9”ŠћYЧ;"ѓ?Aѓ@A‚ѓBQѓdepqЋ uv}  ‚ѓ  "Ћ __substg1.0_37010102*32џџџџm;__substg1.0_370E001E*џџџџџџџџџџџџl__properties_version1.00;џџџџџџџџ…ˆ__substg1.0_0FFF0102*<џџџџџџџџƒj__substg1.0_3001001E*7:џџџџ‚__substg1.0_3002001E*џџџџџџџџџџџџ__substg1.0_3003001E*96џџџџ€__substg1.0_300B0102*џџџџџџџџџџџџ__substg1.0_0FF60102*џџџџџџџџџџџџ~__substg1.0_00020102*џџџџџџџџџџџџ‘@__substg1.0_00030102*=?џџџџh__substg1.0_00040102*џџџџKџџџџˆ–__substg1.0_10140102*DEџџџџk__substg1.0_10150102*џџџџџџџџџџџџj__substg1.0_10060102*џџџџџџџџџџџџi__substg1.0_10010102*>@џџџџh__substg1.0_10080102*HFџџџџg__substg1.0_10180102*AGџџџџf__substg1.0_100C0102*џџџџџџџџџџџџe__substg1.0_101D0102*Jџџџџџџџџd__substg1.0_10050102*IBџџџџc__substg1.0_10040102*џџџџџџџџџџџџb__substg1.0_101C0102*џџџџџџџџџџџџa__substg1.0_10000102*џџџџџџџџџџџџ`  @ЂемћYЧ(0)0P5#F’ 0ѓо?ŸN€€€zѓ€=€Oѓ€3€R€€ € € € €=  й Шѓэ%3l УJi  +X р8БЧ —фЩ 'ШнЄ ДЯkW Ѓ3ж” ‹[Ъ †AЌƒ …€…multipart/signedMIME-Version: 1.0 Content-Disposition: inline X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2900.3028 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="cHMo6Wbp1wrKhbfi" --cHMo6Wbp1wrKhbfi Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable This is yet another test. --=20 Matijs van Zuijlen http://www.matijs.net/ --cHMo6Wbp1wrKhbfi Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.6 (GNU/Linux) iD8DBQFF42lJh3TgaXYDPEERAoDrAJ9RGi0X4EtYw/fkgKxmiWLrqgc1FgCfcaCw kJeEQM9ww/GKJQ1VGoPjODM= =CprJ -----END PGP SIGNATURE----- --cHMo6Wbp1wrKhbfi--!ў№єї7 7џџџџљд7;Ћ 7}.SMTP:MATIJS@MATIJS.NETўџџџўџџџўџџџ„ўџџџ†‡ўџџџ‰Š‹ŒŽўџџџўџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџmatijs@matijs.netSMTPmatijs@matijs.net+ЄОЃnнT€matijs@matijs.netSMTPmatijs@matijs.net џj№000 0ѓіѓ0p*x-originalarrivaltime*Internet Charset Body,x-spam-checker-versionx-spam-statusx-virus-scannedx-spam-level&x-sa-exim-mail-from(x-sa-exim-connect-ip"x-sa-exim-scanned"x-sa-exim-version€…… 0 `  А д №  H p  РF РF†РF€v:NzЗаЅРOжV