package Sietima;
use 5.020;
use Moo;
use Types::Standard qw(ArrayRef Object FileHandle Maybe);
use Type::Params qw(compile);
use Sietima::Types qw(Address EmailMIME Message Subscriber Transport);
use Sietima::Message;
use Email::Sender::Simple qw(sendmail);
use namespace::clean;
has return_path => (
isa => Address,
is => 'ro',
required => 1,
);
has subscribers => (
isa => ArrayRef[Subscriber],
is => 'lazy',
);
sub _build_subscribers { +[] }
has transport => (
isa => Maybe[Transport],
is => 'lazy',
);
sub _build_transport { }
sub handle_message {
state $check = compile(Obect,EmailMIME);
my ($self,$incoming_message) = $check->(@_);
my (@outgoing_messages) = $self->munge_message($incoming_message);
for my $outgoing_message (@outgoing_messages) {
$self->send_message($outgoing_message);
}
return;
}
sub munge_message {
state $check = compile(Obect,EmailMIME);
my ($self,$incoming_message) = $check->(@_);
return Sietima::Message->new({
mail => $incoming_message,
from => $self->return_path,
to => [
map { $_->address } @{$self->subscribers}
],
});
}
sub send_message {
state $check = compile(Obect,Message);
my ($self,$outgoing_message) = $check->(@_);
sendmail(
$outgoing_message->mail,
{
%{$outgoing_message->envelope},
transport => $self->transport,
},
);
return;
}
1;