aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO.md1
-rw-r--r--lib/Sietima.pm14
-rw-r--r--lib/Sietima/Role/NoMail.pm17
-rw-r--r--lib/Sietima/Types.pm8
-rw-r--r--t/tests/sietima/role/nomail.t24
5 files changed, 57 insertions, 7 deletions
diff --git a/TODO.md b/TODO.md
index f169033..829fd61 100644
--- a/TODO.md
+++ b/TODO.md
@@ -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;