Files
2024-10-14 00:08:40 +02:00

130 lines
3.0 KiB
Perl

package Sisimai::Mail::Memory;
use feature ':5.10';
use strict;
use warnings;
use Class::Accessor::Lite;
my $roaccessors = [
'size', # [Integer] data size
];
my $rwaccessors = [
'data', # [Array] entire bounce mail message
'offset', # [Integer] Index of "data"
];
Class::Accessor::Lite->mk_accessors(@$rwaccessors);
Class::Accessor::Lite->mk_ro_accessors(@$roaccessors);
sub new {
# Constructor of Sisimai::Mail::Memory
# @param [String] argv1 Entire email string
# @return [Sisimai::Mail::Memory] Object or Undef if the argument is not
# valid email text
my $class = shift;
my $argv1 = shift // return undef;
my $first = substr($$argv1, 0, 5) || '';
my $param = {
'data' => [],
'size' => length $$argv1 || 0,
'offset' => 0,
};
return undef unless $param->{'size'};
if( $first eq 'From ') {
# UNIX mbox
$param->{'data'} = [split(/^From /m, $$argv1)];
shift @{ $param->{'data'} };
map { $_ = 'From '.$_ } @{ $param->{'data'} };
} else {
$param->{'data'} = [$$argv1];
}
return bless($param, __PACKAGE__);
}
sub read {
# Memory reader, works as a iterator.
# @return [String] Contents of a bounce mail
my $self = shift;
return undef unless scalar @{ $self->{'data'} };
$self->{'offset'} += 1;
return shift @{ $self->{'data'} };
}
1;
__END__
=encoding utf-8
=head1 NAME
Sisimai::Mail::Memory - Mailbox reader
=head1 SYNOPSIS
use Sisimai::Mail::Memory;
my $mailtxt = 'From Mailer-Daemon ...';
my $mailobj = Sisimai::Mail::Memory->new(\$mailtxt);
while( my $r = $mailobj->read ) {
print $r; # print contents of each mail in the mailbox or Maildir/
}
=head1 DESCRIPTION
Sisimai::Mail::Memory is a class for reading a mailbox, files in Maildir/, or
JSON string from variable.
=head1 CLASS METHODS
=head2 C<B<new(I<\$scalar>)>>
C<new()> is a constructor of Sisimai::Mail::Memory
my $mailtxt = 'From Mailer-Daemon ...';
my $mailobj = Sisimai::Mail::Memory->new(\$mailtxt);
=head1 INSTANCE METHODS
=head2 C<B<size()>>
C<size()> returns a memory size of the mailbox or JSON string.
print $mailobj->size; # 94515
=head2 C<B<data()>>
C<data()> returns an array reference to each email message or JSON string
print scalar @{ $mailobj->data }; # 17
=head2 C<B<offset()>>
C<offset()> returns an offset position for seeking "data". The value of "offset"
is an index number which have already read.
print $mailobj->offset; # 0
=head2 C<B<read()>>
C<read()> works as a iterator for reading each email in the mailbox.
my $mailtxt = 'From Mailer-Daemon ...';
my $mailobj = Sisimai::Mail->new(\$mailtxt);
while( my $r = $mailobj->read ) {
print $r; # print each email in the first argument of new().
}
=head1 AUTHOR
azumakuniyuki
=head1 COPYRIGHT
Copyright (C) 2018 azumakuniyuki, All rights reserved.
=head1 LICENSE
This software is distributed under The BSD 2-Clause License.
=cut