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;