X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=Debbugs%2FMIME.pm;h=f114c680ba1a5b1d42639f71ce726d5a83b41a6d;hb=1a1fa6f0af2be9d4076d9aad5f5a84c5fb3d9a8a;hp=3719d2e23f304f6659a33825aab6a3051b873ffe;hpb=1b96ee16e68b3978c752257ace938f3021670ed8;p=debbugs.git diff --git a/Debbugs/MIME.pm b/Debbugs/MIME.pm index 3719d2e..f114c68 100644 --- a/Debbugs/MIME.pm +++ b/Debbugs/MIME.pm @@ -10,6 +10,8 @@ package Debbugs::MIME; +=encoding utf8 + =head1 NAME Debbugs::MIME -- Mime handling routines for debbugs @@ -30,7 +32,7 @@ None known. use warnings; use strict; -use base qw(Exporter); +use Exporter qw(import); use vars qw($DEBUG $VERSION @EXPORT_OK %EXPORT_TAGS @EXPORT); BEGIN { @@ -47,8 +49,8 @@ BEGIN { $EXPORT_TAGS{all} = [@EXPORT_OK]; } -use File::Path; -use File::Temp qw(); +use File::Path qw(remove_tree); +use File::Temp qw(tempdir); use MIME::Parser; use POSIX qw(strftime); @@ -92,7 +94,7 @@ sub parse my (@headerlines, @bodylines); my $parser = MIME::Parser->new(); - my $tempdir = File::Temp::tempdir(); + my $tempdir = tempdir(CLEANUP => 1); $parser->output_under($tempdir); my $entity = eval { $parser->parse_data($_[0]) }; @@ -115,6 +117,9 @@ sub parse my @msg = split /\n/, $_[0]; my $i; + # assume us-ascii unless charset is set; probably bad, but we + # really shouldn't get to this point anyway + my $charset = 'us-ascii'; for ($i = 0; $i <= $#msg; ++$i) { $_ = $msg[$i]; last unless length; @@ -122,13 +127,15 @@ sub parse ++$i; $_ .= "\n" . $msg[$i]; } + if (/charset=\"([^\"]+)\"/) { + $charset = $1; + } push @headerlines, $_; } - - @bodylines = @msg[$i .. $#msg]; + @bodylines = map {convert_to_utf8($_,$charset)} @msg[$i .. $#msg]; } - rmtree $tempdir, 0, 1; + remove_tree($tempdir,{verbose => 0, safe => 1}); # Remove blank lines. shift @bodylines while @bodylines and $bodylines[0] !~ /\S/; @@ -186,7 +193,7 @@ sub create_mime_message{ die "The third argument to create_mime_message must be an arrayref" unless ref($attachments) eq 'ARRAY'; if ($include_date) { - my %headers = apply {lc($_)} @{$headers}; + my %headers = apply {defined $_ ? lc($_) : ''} @{$headers}; if (not exists $headers{date}) { push @{$headers}, ('Date', @@ -199,7 +206,7 @@ sub create_mime_message{ # MIME::Entity is stupid, and doesn't rfc1522 encode its headers, so we do it for it. my $msg = MIME::Entity->build('Content-Type' => 'text/plain; charset=utf-8', 'Encoding' => 'quoted-printable', - (map{encode_rfc1522(encode_utf8($_))} @{$headers}), + (map{encode_rfc1522(encode_utf8(defined $_ ? $_:''))} @{$headers}), Data => encode_utf8($body), );