in reply to PPM3 and MIME::Tools
You are probably using 5.8. On my Win32 5.6 system:
C:\>ppm instal Mime::Base64 Version 2.11 of 'MIME-Base64' is already installed. Remove it, or use 'verify --upgrade MIME-Base64'. C:\>
C modules need recompiling for 5.8 and Base64 is normally an XS implementation. You will find that Mime-Base64 exists as both a Pure Perl and a C base XS version. Without a C compiler you probably won't be able to do a source install. See A Guide to Installing Modules and Practical Guide to Compiling C-based modules under Win32 for details. The Base64 source contains the old (pre XS version) of the 2 routines which will run fine. To save your reading the source just save this code as (probably - assuming a default install) C:/Perl/site/lib/Mime/Base64.pm and you will have it installed. 20 times slower than the C code but it will work. If you ask PodMaster nicely he will probably compile Base64 for 5.8 for you, he maintains a repository and takes requests. He is very community spirited.
# # $Id: Base64.pm,v 2.29 2003/05/13 18:22:09 gisle Exp $ package MIME::Base64; use strict; use vars qw(@ISA @EXPORT $VERSION $OLD_CODE); require Exporter; @ISA = qw(Exporter); @EXPORT = qw(encode_base64 decode_base64); $VERSION = '2.20'; use integer; sub encode_base64 ($;$) { my $eol = $_[1]; $eol = "\n" unless defined $eol; my $res = pack("u", $_[0]); # Remove first character of each line, remove newlines $res =~ s/^.//mg; $res =~ s/\n//g; $res =~ tr|` -_|AA-Za-z0-9+/|; # `# help emacs # fix padding at the end my $padding = (3 - length($_[0]) % 3) % 3; $res =~ s/.{$padding}$/'=' x $padding/e if $padding; # break encoded string into lines of no more than 76 characters ea +ch if (length $eol) { $res =~ s/(.{1,76})/$1$eol/g; } return $res; } sub decode_base64 ($) { local($^W) = 0; # unpack("u",...) gives bogus warning in 5.00[123] my $str = shift; $str =~ tr|A-Za-z0-9+=/||cd; # remove non-base64 chars if (length($str) % 4) { require Carp; Carp::carp("Length of base64 data not a multiple of 4") } $str =~ s/=+$//; # remove padding $str =~ tr|A-Za-z0-9+/| -_|; # convert to uuencoded for +mat return "" unless length $str; ## I guess this could be written as #return unpack("u", join('', map( chr(32 + length($_)*3/4) . $_, # $str =~ /(.{1,60})/gs) ) ); ## but I do not like that... my $uustr = ''; my ($i, $l); $l = length($str) - 60; for ($i = 0; $i <= $l; $i += 60) { $uustr .= "M" . substr($str, $i, 60); } $str = substr($str, $i); # and any leftover chars if ($str ne "") { $uustr .= chr(32 + length($str)*3/4) . $str; } return unpack ("u", $uustr); } 1;
Did you think to Google for eml to html cause there are plenty of tools that already do this.
As to your request the images will be base64 encoded so you will have to base64 decode them. All you need to do is run Mime::Parser to get the bits and display as desired.
cheers
tachyon
s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print
|
|---|