aboutsummaryrefslogtreecommitdiff
path: root/lib/Sietima/Role
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Sietima/Role')
-rw-r--r--lib/Sietima/Role/Headers.pm26
-rw-r--r--lib/Sietima/Role/ManualSubscription.pm17
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" },
+ ),
};
};