aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sietima.pm63
-rw-r--r--lib/Sietima/Message.pm47
2 files changed, 110 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;
diff --git a/lib/Sietima/Message.pm b/lib/Sietima/Message.pm
new file mode 100644
index 0000000..547077a
--- /dev/null
+++ b/lib/Sietima/Message.pm
@@ -0,0 +1,47 @@
+package Sietima::Message;
+use 5.020;
+use Moo;
+use Types::Standard qw(ArrayRef Object);
+use Sietima::Types qw(Address EmailMIME);
+use Email::MIME;
+use namespace::clean;
+
+has mail => (
+ is => 'ro',
+ isa => EmailMIME,
+ required => 1,
+);
+
+has from => (
+ is => 'ro',
+ isa => Address,
+ required => 1,
+);
+
+has to => (
+ is => 'ro',
+ isa => ArrayRef[Address],
+ required => 1,
+);
+
+sub clone {
+ my ($self,$args) = @_;
+
+ return ref($self)->new({
+ map {
+ $_ => $args->{$_} // $self->$_,
+ } qw(mail from to),
+ });
+}
+
+sub envelope {
+ my ($self) = @_;
+
+ return {
+ map {
+ $_ => $self->$_,
+ } qw(from to),
+ }
+}
+
+1;