# # this is a library of perl routines for MIME parsing. # if( $use_mime eq "yes" ){ require MIME::Parser; require Convert::UU; import uudecode; } sub uudecode_text { my $dir = pop( @_ ); my $entity = pop( @_ ); my $type = $entity->mime_type; my $body = $entity->stringify_body; if( $type =~ /^text\// ) { my $filename = $entity->bodyhandle->path; $filename =~ s/.*\///; print TEXT_FILES $filename . "\n" or die $!; my $count = 0; while(1) { last if( $count++ > 15 ); my ($data, $name, $mode ) = &uudecode( $body ); $name =~ s/\//_/g; if( $data && $name ) { $body =~ s/\nbegin.*?\nend\n/((((Encoded File: $name))))\n/s; if( open( FILE, ">$dir/$name" ) ) { print FILE $data or die $!; close FILE or die $!; chmod 0644, $file or die $!; } my $filename = $entity->bodyhandle->path; open( REDUCED, ">$filename" ) or die $!; print REDUCED $body or die $!; close( REDUCED ) or die $!; } else { last; } } } else { $body = ""; } $body =~ s/\n+/\n/gs; return $body; } sub decode_mime_message { my $dir = pop( @_ ); mkdir $dir, 0775; chmod 0755, $dir; #chdir $dir; # Create parser, and set the output directory: my $parser = new MIME::Parser; $parser->output_dir( $dir ); # Parse input: $entity = $parser->read(\*STDIN) or die "couldn't parse MIME stream"; open( FULL, ">$dir/full_message.txt" ) or die $!; print FULL $entity->as_string or die $!; close( FULL ) or die $!; my $RealSubject = "Real-Subject: " . $entity->head->get( "Subject" ); my $prolog = "From: " . $entity->head->get( "From" ) . "$RealSubject\n"; open( SKELETON, ">$dir/skeleton.skeleton" ); $entity->dump_skeleton( \*SKELETON ); close( SKELETON ); open( HEAD, ">$dir/headers.txt" ) or die $!; print HEAD $entity->head->as_string . "\n" or die $!; close( HEAD ) or die $!; open( TEXT_FILES, ">$dir/text.files.lst" ) or die $!; print TEXT_FILES "headers.txt\n" or die $!; my $body = &uudecode_text( $entity, $dir ); $body =~ /(.*\n){0,3}/s; $prolog .= $1; if( $entity->is_multipart ) { foreach( $entity->parts() ) { print $_->mime_type . "\n" or die $!; $body = &uudecode_text( $_, $dir ); $body =~ /(.*\n){0,3}/s; $prolog .= $1; } } close( TEXT_FILES ); $Article_From = $entity->head->get( "From" ); chop $Article_From; $Article_Subject = $entity->head->get( "Subject" ); chop $Article_Subject; $Article_Head = $entity->head->as_string; $Article_Body = $body; chmod $dir, 0755; return ($entity, $prolog); } sub decode_plaintext_message { my $dir = pop( @_ ); $Article_Head = ""; while( ) { $Article_Head .= $_; chomp; if( /^From: / ) { $Article_From = $_; $Article_From =~ s/^From: //; } elsif( /^Subject: / ) { $Article_Subject = $_; $Article_Subject =~ s/^Subject: //; } last if /^$/; } $Article_Body = ""; $Article_Body .= $_ while( ); return &file_plaintext_message( $dir ); } # stores a plaintext message in a fashion similar to a MIME message sub file_plaintext_message { my $dir = pop( @_ ); mkdir $dir, 0775; chmod 0755, $dir; open( FULL, ">$dir/full_message.txt" ) or die $!; print FULL $Article_Body or die $!; close( FULL ) or die $!; my $prolog = "From: " . $Article_From . "\nReal-Subject: $Article_Subject"; # . "Subject: " . $entity->head->get( "Subject" ); $prolog .= "\n\n"; open( SKELETON, ">$dir/skeleton.skeleton" ); close( SKELETON ); open( HEAD, ">$dir/headers.txt" ) or die $!; print HEAD $Article_Head . "\n" or die $!; close( HEAD ) or die $!; open( TEXT_FILES, ">$dir/text.files.lst" ) or die $!; print TEXT_FILES "headers.txt\nfull_message.txt\n" or die $!; my $body = $Article_Body; $body =~ /(.*\n){0,3}/s; $prolog .= $1; close( TEXT_FILES ) or die $!; return $prolog; } 1;