package Sisimai::Mail; use feature ':5.10'; use strict; use warnings; use Class::Accessor::Lite; my $roaccessors = [ 'path', # [String] path to mbox or Maildir/ 'type', # [String] Data type: mailbox, maildir, or stdin ]; my $rwaccessors = [ 'mail', # [Sisimai::Mail::[Mbox,Maildir,Memory,STDIO] Object ]; Class::Accessor::Lite->mk_accessors(@$rwaccessors); Class::Accessor::Lite->mk_ro_accessors(@$roaccessors); sub new { # Constructor of Sisimai::Mail # @param [String] argv1 Path to mbox or Maildir/ # @return [Sisimai::Mail, Undef] Object or Undef if the argument was wrong my $class = shift; my $argv1 = shift; my $klass = undef; my $loads = 'Sisimai/Mail/'; my $param = { 'type' => '', 'mail' => undef, 'path' => $argv1 }; # The argumenet is a mailbox or a Maildir/. if( -f $argv1 ) { # The argument is a file, it is an mbox or email file in Maildir/ $klass = __PACKAGE__.'::Mbox'; $loads .= 'Mbox.pm'; $param->{'type'} = 'mailbox'; $param->{'path'} = $argv1; } elsif( -d $argv1 ) { # The agument is not a file, it is a Maildir/ $klass = __PACKAGE__.'::Maildir'; $loads .= 'Maildir.pm'; $param->{'type'} = 'maildir'; } else { # The argumen1 neither a mailbox nor a Maildir/. if( ref($argv1) eq 'GLOB' || $argv1 eq 'STDIN' ) { # Read from STDIN $klass = __PACKAGE__.'::STDIN'; $loads .= 'STDIN.pm'; $param->{'type'} = 'stdin'; } elsif( ref($argv1) eq 'SCALAR' ) { # Read from a variable as a scalar reference $klass = __PACKAGE__.'::Memory'; $loads .= 'Memory.pm'; $param->{'type'} = 'memory'; $param->{'path'} = 'MEMORY'; } } return undef unless $klass; require $loads; $param->{'mail'} = $klass->new($argv1); return bless($param, __PACKAGE__); } sub read { # Mbox/Maildir reader, works as an iterator. # @return [String] Contents of mbox/Maildir my $self = shift; my $mail = $self->{'mail'}; return undef unless ref $mail; return $mail->read; } sub close { # Close the handle # @return [Integer] 0: Mail handle is not defined # 1: Successfully closed the handle my $self = shift; return 0 unless $self->{'mail'}->{'handle'}; $self->{'mail'}->{'handle'} = undef; return 1; } 1; __END__ =encoding utf-8 =head1 NAME Sisimai::Mail - Handler of Mbox/Maildir for reading each mail. =head1 SYNOPSIS use Sisimai::Mail; my $mailbox = Sisimai::Mail->new('/var/mail/root'); while( my $r = $mailbox->read ) { print $r; } $mailbox->close; my $maildir = Sisimai::Mail->new('/home/neko/Maildir/cur'); while( my $r = $maildir->read ) { print $r; } $maildir->close; my $mailtxt = 'From Mailer-Daemon ...'; my $mailobj = Sisimai::Mail->new(\$mailtxt); while( my $r = $mailobj->read ) { print $r; } =head1 DESCRIPTION Sisimai::Mail is a handler for reading a UNIX mbox, a Maildir, a bounce object as a JSON string, or any email message input from STDIN, variable. It is a wrapper class of the following child classes: * Sisimai::Mail::Mbox * Sisimai::Mail::Maildir * Sisimai::Mail::STDIN * Sisimai::Mail::Memory =head1 CLASS METHODS =head2 C)>> C is a constructor of Sisimai::Mail my $mailbox = Sisimai::Mail->new('/var/mail/root'); my $maildir = Sisimai::Mail->new('/home/nyaa/Maildir/cur'); my $mailtxt = 'From Mailer-Daemon ...'; my $mailobj = Sisimai::Mail->new(\$mailtxt); =head1 INSTANCE METHODS =head2 C> C returns the path to mbox or Maildir. print $mailbox->path; # /var/mail/root =head2 C> C Returns the name of data type print $mailbox->type; # mailbox or maildir, or stdin. =head2 C> C returns Sisimai::Mail::Mbox object or Sisimai::Mail::Maildir object. my $o = $mailbox->mail; print ref $o; # Sisimai::Mail::Mbox =head2 C> C works as a iterator for reading each email in mbox or Maildir. It calls Sisimai::Mail::Mbox->read or Sisimai::Mail::Maildir->read method. my $mailbox = Sisimai::Mail->new('/var/mail/neko'); while( my $r = $mailbox->read ) { print $r; # print each email in /var/mail/neko } $mailbox->close; =head2 C> C Close the handle of the mailbox or the Maildir/. my $o = $mailbox->close; print $o; # 1 = Successfully closed, 0 = already closed. =head1 AUTHOR azumakuniyuki =head1 COPYRIGHT Copyright (C) 2014-2016,2018 azumakuniyuki, All rights reserved. =head1 LICENSE This software is distributed under The BSD 2-Clause License. =cut