The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Mail::IMAP::Envelope;
use strict;
use warnings;
use utf8;
use Encode ();
use Mail::IMAP::Address;

use constant {
    DATE        => 0,
    SUBJECT     => 1,
    FROM        => 2,
    SENDER      => 3,
    REPLY_TO    => 4,
    TO          => 5,
    CC          => 6,
    BCC         => 7,
    IN_REPLY_TO => 8,
    MESSAGE_TO  => 9,
};

sub new {
    my ($class, $envelope) = @_;
    return bless $envelope, $class;
}

sub _decode {
    defined($_[0]) ? Encode::decode('MIME-Header', $_[0]) : '';
}

sub subject { _decode($_[0]->[SUBJECT]) }
sub date { $_[0]->[DATE] }
for (qw(FROM SENDER REPLY_TO TO CC BCC)) {
    no strict 'refs';
    my $idx = __PACKAGE__->can($_)->();
    *{__PACKAGE__ . '::' . lc($_)} = sub { [map { Mail::IMAP::Address->new($_) } @{$_[0]->[$idx]||[]}] };
}

1;
__END__

=head1 NAME

Mail::IMAP::Envelope - envelope

=head1 METHODS

=over 4

=item $enve->subject

=item $enve->date

=item $enve->from

=item $enve->sender

=item $enve->reply_to

=item $enve->to

=item $enve->cc

=item $enve->bcc

=back