diff options
-rw-r--r-- | TODO.md | 1 | ||||
-rw-r--r-- | lib/Sietima.pm | 14 | ||||
-rw-r--r-- | lib/Sietima/Role/NoMail.pm | 17 | ||||
-rw-r--r-- | lib/Sietima/Types.pm | 8 | ||||
-rw-r--r-- | t/tests/sietima/role/nomail.t | 24 |
5 files changed, 57 insertions, 7 deletions
@@ -21,4 +21,3 @@ * test what happens with mime-word-encoded subjects! * reply-to munging * set `Reply-to` to list's post address (return path) -* no-mail diff --git a/lib/Sietima.pm b/lib/Sietima.pm index fbf0566..1e463ec 100644 --- a/lib/Sietima.pm +++ b/lib/Sietima.pm @@ -5,7 +5,7 @@ use Types::Standard qw(ArrayRef Object FileHandle Maybe); use Type::Params qw(compile); use Sietima::Types qw(Address AddressFromStr EmailMIME Message - Subscriber SubscriberFromAddress SubscriberFromStr + Subscriber SubscriberFromAddress SubscriberFromStr SubscriberFromHashRef Transport); use Sietima::Message; use Sietima::Subscriber; @@ -27,6 +27,7 @@ my $subscribers_array = ArrayRef[ Subscriber->plus_coercions( SubscriberFromAddress, SubscriberFromStr, + SubscriberFromHashRef, ) ]; has subscribers => ( @@ -53,6 +54,13 @@ sub handle_mail { return; } +sub addresses_to_send_to { + state $check = compile(Object,EmailMIME); + my ($self,$incoming_mail) = $check->(@_); + + return [ map { $_->address } @{$self->subscribers} ]; +} + sub munge_mail { state $check = compile(Object,EmailMIME); my ($self,$incoming_mail) = $check->(@_); @@ -60,9 +68,7 @@ sub munge_mail { return Sietima::Message->new({ mail => $incoming_mail, from => $self->return_path, - to => [ - map { $_->address } @{$self->subscribers} - ], + to => $self->addresses_to_send_to($incoming_mail), }); } diff --git a/lib/Sietima/Role/NoMail.pm b/lib/Sietima/Role/NoMail.pm new file mode 100644 index 0000000..233f6b9 --- /dev/null +++ b/lib/Sietima/Role/NoMail.pm @@ -0,0 +1,17 @@ +package Sietima::Role::NoMail; +use 5.020; +use Moo::Role; +use namespace::clean; + +around addresses_to_send_to => sub { + my ($orig,$self,@etc) = @_; + + return [ + map { $_->address } + grep { $_->prefs->{wants_mail} // 1 } + @{$self->subscribers}, + ]; +}; + +1; + diff --git a/lib/Sietima/Types.pm b/lib/Sietima/Types.pm index af3e1c0..00f0883 100644 --- a/lib/Sietima/Types.pm +++ b/lib/Sietima/Types.pm @@ -3,13 +3,13 @@ use 5.020; use strict; use warnings; use Type::Utils -all; -use Types::Standard qw(Str); +use Types::Standard qw(Str HashRef); use namespace::clean; use Type::Library -base, -declare => qw(Address AddressFromStr EmailMIME Message - Subscriber SubscriberFromAddress SubscriberFromStr + Subscriber SubscriberFromAddress SubscriberFromStr SubscriberFromHashRef Transport MailStore); class_type EmailMIME, { class => 'Email::MIME' }; @@ -31,4 +31,8 @@ declare_coercion SubscriberFromStr, to_type Subscriber, from Str, q{ Sietima::Subscriber->new(raw_address=>(Email::Address->parse($_))[0]) }; +declare_coercion SubscriberFromHashRef, + to_type Subscriber, from HashRef, + q{ Sietima::Subscriber->new($_) }; + 1; diff --git a/t/tests/sietima/role/nomail.t b/t/tests/sietima/role/nomail.t new file mode 100644 index 0000000..df4d106 --- /dev/null +++ b/t/tests/sietima/role/nomail.t @@ -0,0 +1,24 @@ +#!perl +use strict; +use warnings; +use 5.020; +use lib 't/lib'; +use Test::Sietima; + +my $s = make_sietima( + with_traits => ['NoMail'], + subscribers => [ + { + raw_address => 'one@users.example.com', + wants_mail => 0, + }, + 'two@users.example.com', + ], +); + +test_sending( + sietima => $s, + to => ['two@users.example.com'], +); + +done_testing; |