1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
package CiderWebmail::Header;
use warnings;
use strict;
use Email::Address::XS;
use Time::Piece;
use Date::Parse;
use Carp qw/ croak carp cluck /;
use CiderWebmail::Util qw/ decode_mime_words /;
=head2 transform({ type => $header_name, data => $header_data })
'transform' a header from the 'raw' state (the way it was returned from the server) to an appropriate object.
if no appropriate object exists the header will be decoded (using decode_mime_words()) and UTF-8 encoded
the following 'transformations' take place:
=over 4
=item * from -> Email::Address::XS object
=item * to -> Email::Address::XS object
=item * cc -> Email::Address::XS object
=item * date -> CiderWebmail::Date object
=back
=cut
sub transform {
my ($o) = @_;
croak unless defined $o->{type};
return unless defined $o->{data};
$o->{type} = lc($o->{type});
my $headers = {
from => \&_transform_address,
to => \&_transform_address,
cc => \&_transform_address,
'reply-to' => \&_transform_address,
'list-post' => \&_transform_address,
date => \&_transform_date,
};
return $headers->{$o->{type}}->($o) if exists $headers->{$o->{type}};
#if we have no appropriate transfrom function decode the header and return it
return decode_mime_words({ data => ($o->{data} or '')});
}
sub _transform_address {
my ($o) = @_;
#here data might be defined but empty (no address given for example no Cc address)
#we still need a empty Email::Address::XS object so we don't break templates that rely on it
return [Email::Address::XS->parse('')] unless length($o->{data} // '');
$o->{data} = decode_mime_words($o);
$o->{data} =~ s/mailto://gi;
my @address = Email::Address::XS->parse($o->{data});
return \@address;
}
sub _transform_date {
my ($o) = @_;
croak("data not set") unless defined $o->{data};
my $date = Time::Piece->new(Date::Parse::str2time $o->{data});
return $date;
}
1;
|