aboutsummaryrefslogtreecommitdiff
path: root/lib/Sietima/Role/Headers.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Sietima/Role/Headers.pm')
-rw-r--r--lib/Sietima/Role/Headers.pm26
1 files changed, 15 insertions, 11 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;