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