1use common::sense; 2 3use Email::Address; 4use Email::MIME::CreateHTML; 5use Encode; 6use FindBin qw($Bin); 7use HTML::TreeBuilder::XPath; 8use LWP::UserAgent; 9use MIME::Parser; 10use MIME::Words qw(encode_mimeword); 11use Test::More; 12 13my $builder = Test::More->builder; 14binmode $builder->output, ":encoding(UTF-8)"; 15binmode $builder->failure_output, ":encoding(UTF-8)"; 16binmode $builder->todo_output, ":encoding(UTF-8)"; 17 18my $response = LWP::UserAgent->new->get("file://$Bin/data/UTF-8.html"); 19 20my $body = $response->decoded_content; 21 22my $from = generate_address('Föö', 'test@foo.example'); 23my $to = generate_address('Bäz', 'test@baz.example'); 24 25my $subject = encode_mimeword(encode_utf8('Sübject'), 'Q', 'UTF-8'); 26 27my $mail = Email::MIME->create_html( 28 header => [ 29 From => $from->format, 30 To => $to->format, 31 Subject => $subject, 32 ], 33 body => $body, 34 body_attributes => { 35 charset => 'UTF-8', 36 encoding => 'quoted-printable', 37 } 38); 39 40my $parsed_mail = parse_mail($mail->as_string); 41 42is(decode_utf8($parsed_mail->{from}), 'Föö <test@foo.example>'); 43is(decode_utf8($parsed_mail->{to}), 'Bäz <test@baz.example>'); 44is(decode_utf8($parsed_mail->{subject}), 'Sübject'); 45 46is(decode_utf8($parsed_mail->{content}->findnodes('//p')->[0]->as_text), 'Umlaute: äöüßÄÖÜ'); 47 48 49done_testing(); 50 51sub generate_address { 52 my ($name, $address) = @_; 53 54 return Email::Address->new( 55 encode_mimeword(encode_utf8($name), 'Q', 'UTF-8'), 56 encode_utf8($address) 57 ); 58} 59 60sub parse_mail { 61 my ($mail) = @_; 62 63 my $parser = MIME::Parser->new(); 64 $parser->output_to_core(1); 65 66 my $parsed_mail = $parser->parse_data($mail); 67 68 my $subject = MIME::Words::decode_mimewords( $parsed_mail->head->get('Subject') ); 69 my $from = MIME::Words::decode_mimewords( $parsed_mail->head->get('From') ); 70 my $to = MIME::Words::decode_mimewords( $parsed_mail->head->get('To') ); 71 72 defined and chomp foreach ($subject, $from, $to); 73 74 return { 75 content => HTML::TreeBuilder::XPath->new_from_content($parsed_mail->bodyhandle->as_string), 76 subject => $subject, 77 from => $from, 78 to => $to, 79 }; 80} 81