diff options
Diffstat (limited to 'lib/Sietima.pm')
-rw-r--r-- | lib/Sietima.pm | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/lib/Sietima.pm b/lib/Sietima.pm index 6c3e60c..85468bb 100644 --- a/lib/Sietima.pm +++ b/lib/Sietima.pm @@ -1,5 +1,68 @@ 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; |