From 437d3a4eba02ef4dcafe062510cf2f428bbaa1db Mon Sep 17 00:00:00 2001 From: dakkar Date: Thu, 16 Jun 2016 17:29:48 +0100 Subject: role: drop mail from non-subscribers --- lib/Sietima.pm | 4 ++++ lib/Sietima/Role/SubscriberOnly.pm | 23 +++++++++++++++++++++++ lib/Sietima/Role/SubscriberOnly/Drop.pm | 9 +++++++++ 3 files changed, 36 insertions(+) create mode 100644 lib/Sietima/Role/SubscriberOnly.pm create mode 100644 lib/Sietima/Role/SubscriberOnly/Drop.pm (limited to 'lib') diff --git a/lib/Sietima.pm b/lib/Sietima.pm index 2049d2c..fbf0566 100644 --- a/lib/Sietima.pm +++ b/lib/Sietima.pm @@ -14,6 +14,8 @@ use Email::Sender; use Email::Address; use namespace::clean; +with 'MooX::Traits'; + has return_path => ( isa => Address, is => 'ro', @@ -79,4 +81,6 @@ sub send_message { return; } +sub _trait_namespace { 'Sietima::Role' } + 1; diff --git a/lib/Sietima/Role/SubscriberOnly.pm b/lib/Sietima/Role/SubscriberOnly.pm new file mode 100644 index 0000000..4dcb66c --- /dev/null +++ b/lib/Sietima/Role/SubscriberOnly.pm @@ -0,0 +1,23 @@ +package Sietima::Role::SubscriberOnly; +use Moo::Role; +use Email::Address; +use List::AllUtils qw(any); +use namespace::clean; + +requires 'munge_mail_from_non_subscriber'; + +around munge_mail => sub { + my ($orig,$self,$mail) = @_; + + my $from = (Email::Address->parse( + $mail->header_str('from'), + ))[0]->address; + if ( any { $_->address eq $from } @{$self->subscribers} ) { + $self->$orig($mail); + } + else { + $self->munge_mail_from_non_subscriber($mail); + } +}; + +1; diff --git a/lib/Sietima/Role/SubscriberOnly/Drop.pm b/lib/Sietima/Role/SubscriberOnly/Drop.pm new file mode 100644 index 0000000..91354e5 --- /dev/null +++ b/lib/Sietima/Role/SubscriberOnly/Drop.pm @@ -0,0 +1,9 @@ +package Sietima::Role::SubscriberOnly::Drop; +use Moo::Role; +use namespace::clean; + +with 'Sietima::Role::SubscriberOnly'; + +sub munge_mail_from_non_subscriber { } + +1; -- cgit v1.2.3