about summary refs log tree commit homepage
path: root/lib/PublicInbox/Reply.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2017-06-14 00:10:52 +0000
committerEric Wong <e@80x24.org>2017-06-15 23:13:00 +0000
commitef3ca9b80fcb464d851c2f8d87f3f02f4f70986d (patch)
tree905052112686dec08eea7d4b6d2c87216e36fe0b /lib/PublicInbox/Reply.pm
parent92afb41e15dfdcda291b432173bd49ddfc49614a (diff)
downloadpublic-inbox-ef3ca9b80fcb464d851c2f8d87f3f02f4f70986d.tar.gz
This allows us to support centralized mailing lists (which suck,
but better than no mailing list at all).
Diffstat (limited to 'lib/PublicInbox/Reply.pm')
-rw-r--r--lib/PublicInbox/Reply.pm66
1 files changed, 48 insertions, 18 deletions
diff --git a/lib/PublicInbox/Reply.pm b/lib/PublicInbox/Reply.pm
index 73a4df11..5bbe8f4e 100644
--- a/lib/PublicInbox/Reply.pm
+++ b/lib/PublicInbox/Reply.pm
@@ -17,36 +17,66 @@ sub squote_maybe ($) {
         $val;
 }
 
+sub add_addrs {
+        my ($to, $cc, @addrs) = @_;
+        foreach my $address (@addrs) {
+                my $dst = lc($address);
+                $cc->{$dst} ||= $address;
+                $$to ||= $dst;
+        }
+}
+
+my @reply_headers = qw(From To Cc);
+my $reply_headers = join('|', @reply_headers);
+
 sub mailto_arg_link {
-        my ($hdr) = @_;
-        my %cc; # everyone else
-        my $to; # this is the From address
-
-        foreach my $h (qw(From To Cc)) {
-                my $v = $hdr->header($h);
-                defined($v) && ($v ne '') or next;
-                my @addrs = PublicInbox::Address::emails($v);
-                foreach my $address (@addrs) {
-                        my $dst = lc($address);
-                        $cc{$dst} ||= $address;
-                        $to ||= $dst;
+        my ($ibx, $hdr) = @_;
+        my $cc = {}; # everyone else
+        my $to; # this is the From address by default
+
+        foreach my $rt (split(/\s*,\s*/, $ibx->{replyto} || ':all')) {
+                if ($rt eq ':all') {
+                        foreach my $h (@reply_headers) {
+                                my $v = $hdr->header($h);
+                                defined($v) && ($v ne '') or next;
+                                my @addrs = PublicInbox::Address::emails($v);
+                                add_addrs(\$to, $cc, @addrs);
+                        }
+                } elsif ($rt eq ':list') {
+                        add_addrs(\$to, $cc, $ibx->{-primary_address});
+                } elsif ($rt =~ /\A(?:$reply_headers)\z/io) {
+                        my $v = $hdr->header($rt);
+                        if (defined($v) && ($v ne '')) {
+                                my @addrs = PublicInbox::Address::emails($v);
+                                add_addrs(\$to, $cc, @addrs);
+                        }
+                } elsif ($rt =~ /@/) {
+                        add_addrs(\$to, $cc, $rt);
+                } else {
+                        warn "Unrecognized replyto = '$rt' in config\n";
                 }
         }
-        my @arg;
 
+        my @arg;
         my $subj = $hdr->header('Subject') || '';
         $subj = "Re: $subj" unless $subj =~ /\bRe:/i;
         my $mid = $hdr->header_raw('Message-ID');
         push @arg, '--in-reply-to='.squote_maybe(mid_clean($mid));
         my $irt = mid_escape($mid);
-        delete $cc{$to};
+        delete $cc->{$to};
         push @arg, "--to=$to";
         $to = uri_escape_utf8($to);
         $subj = uri_escape_utf8($subj);
-        my @cc = sort values %cc;
-        push(@arg, map { "--cc=$_" } @cc);
-        my $cc = uri_escape_utf8(join(',', @cc));
-        my $href = "mailto:$to?In-Reply-To=$irt&Cc=${cc}&Subject=$subj";
+        my @cc = sort values %$cc;
+        $cc = '';
+        if (@cc) {
+                push(@arg, map { "--cc=$_" } @cc);
+                $cc = '&Cc=' . uri_escape_utf8(join(',', @cc));
+        }
+
+        # order matters, Subject is the least important header,
+        # so it is last in case it's lost/truncated in a copy+paste
+        my $href = "mailto:$to?In-Reply-To=$irt${cc}&Subject=$subj";
 
         (\@arg, ascii_html($href));
 }