diff options
Diffstat (limited to 'lib/Sietima/Role')
-rw-r--r-- | lib/Sietima/Role/Headers.pm | 26 | ||||
-rw-r--r-- | lib/Sietima/Role/ManualSubscription.pm | 17 |
2 files changed, 24 insertions, 19 deletions
diff --git a/lib/Sietima/Role/Headers.pm b/lib/Sietima/Role/Headers.pm index a1aa566..fe3f8a5 100644 --- a/lib/Sietima/Role/Headers.pm +++ b/lib/Sietima/Role/Headers.pm @@ -2,7 +2,10 @@ package Sietima::Role::Headers; use Moo::Role; use Try::Tiny; use Sietima::Policy; +use Sietima::HeaderURI; +use Email::Address; use Types::Standard qw(Str); +use Sietima::Types qw(HeaderUriFromThings); use namespace::clean; # VERSION @@ -50,6 +53,14 @@ has name => ( required => 0, ); +sub _normalise_address($self,$address) { + my @items = ref($address) eq 'ARRAY' ? $address->@* : $address; + + return map { + HeaderUriFromThings->coerce($_) + } @items; +} + sub _add_headers_to($self,$message) { my $addresses = $self->list_addresses; my $mail = $message->mail; @@ -58,7 +69,7 @@ sub _add_headers_to($self,$message) { # Identification of Mailing Lists" my $return_path = delete $addresses->{return_path}; if (my $name = $self->name) { - $mail->header_str_set( + $mail->header_raw_set( 'List-Id', sprintf '%s <%s>', $name,$return_path->address =~ s{\@}{.}r, ); @@ -70,17 +81,10 @@ sub _add_headers_to($self,$message) { for my $name (sort keys $addresses->%*) { my $header_name = 'List-' . ucfirst($name =~ s{[^[:alnum:]]+}{-}gr); - my $address = $addresses->{$name}; - - # if it's not an Email::Address obect, we'll just take it as a - # string: it could be a non-mailto URI, see RFC 2369 "The Use - # of URLs as Meta-Syntax for Core Mail List Commands and their - # Transport through Message Header Fields" + my @items = $self->_normalise_address($addresses->{$name}); - $mail->header_str_set( - $header_name => try { - sprintf '<mailto:%s>',$address->address - } catch { "<$address>" }, + $mail->header_raw_set( + $header_name => join ', ', map { $_->as_header_raw } @items, ); } return; diff --git a/lib/Sietima/Role/ManualSubscription.pm b/lib/Sietima/Role/ManualSubscription.pm index fd75f80..c2711f0 100644 --- a/lib/Sietima/Role/ManualSubscription.pm +++ b/lib/Sietima/Role/ManualSubscription.pm @@ -1,7 +1,7 @@ package Sietima::Role::ManualSubscription; use Moo::Role; use Sietima::Policy; -use URI; +use Sietima::HeaderURI; use namespace::clean; # VERSION @@ -36,16 +36,17 @@ L<owner|Sietima::Role::WithOwner/owner>, with different subjects. around list_addresses => sub($orig,$self) { my $list_name = $self->name // 'the list'; - my $mail_owner_uri = URI->new($self->owner,'mailto'); - my $sub_uri = $mail_owner_uri->clone; - $sub_uri->query_form(subject => "Please add me to $list_name"); - my $unsub_uri = $mail_owner_uri->clone; - $unsub_uri->query_form(subject => "Please remove me from $list_name"); return +{ $self->$orig->%*, - subscribe => $sub_uri, - unsubscribe => $unsub_uri, + subscribe => Sietima::HeaderURI->new_from_address( + $self->owner, + { subject => "Please add me to $list_name" }, + ), + unsubscribe => Sietima::HeaderURI->new_from_address( + $self->owner, + { subject => "Please remove me from $list_name" }, + ), }; }; |