-# Copyright (C) 2016-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
# SpamAssassin rules useful for running a mailing list mirror. We want to:
my $v = $pms->get($hdr) or next;
local $/ = "\n";
chomp $v;
- next if $v ne $hval;
+ if (ref($hval)) {
+ next if $v !~ $hval;
+ } else {
+ next if $v ne $hval;
+ }
return 1 if $recvd !~ $host_re;
}
$host_glob =~ s!(.)!$patmap{$1} || "\Q$1"!ge;
my $host_re = qr/\A\s*from\s+$host_glob(?:\s|$)/si;
+ (lc($hdr) eq 'list-id' && $hval =~ /<([^>]+)>/) and
+ $hval = qr/\A<\Q$1\E>\z/;
push @{$self->{list_mirror_check}}, [ $hdr, $hval, $host_re, $addr ];
}
loadplugin PublicInbox::SaPlugin::ListMirror
-Declare some mailing lists based on the expected List-Id value,
+Declare some mailing lists based on the expected List-ID value,
expected servers, and mailing list address:
- list_mirror List-Id <foo.example.com> *.example.com foo@example.com
- list_mirror List-Id <bar.example.com> *.example.com bar@example.com
+ list_mirror List-ID <foo.example.com> *.example.com foo@example.com
+ list_mirror List-ID <bar.example.com> *.example.com bar@example.com
Bump the score for messages which come from unexpected servers:
=item list_mirror HEADER HEADER_VALUE HOSTNAME_GLOB [LIST_ADDRESS]
-Declare a list based on an expected C<HEADER> matching C<HEADER_NAME>
-exactly coming from C<HOSTNAME_GLOB>. C<LIST_ADDRESS> is optional,
+Declare a list based on an expected C<HEADER> matching C<HEADER_VALUE>
+coming from C<HOSTNAME_GLOB>. C<LIST_ADDRESS> is optional,
but may specify the address of the mailing list being mirrored.
-C<List-Id> or C<X-Mailing-List> are common values of C<HEADER>
+C<List-ID> is the recommended value of C<HEADER> as most
+mailing lists support it.
An example of C<HEADER_VALUE> is C<E<lt>foo.example.orgE<gt>>
-if C<HEADER> is C<List-Id>.
+if C<HEADER> is C<List-ID>.
+
+As of public-inbox 2.0, using C<List-ID> as the C<HEADER> and a
+C<HEADER_VALUE> contained by angle brackets (E<lt>list-idE<gt>),
+matching is done in accordance with
+L<RFC 2919|https://tools.ietf.org/html/rfc2919>. That is,
+C<HEADER_VALUE> will be a case-insensitive substring match
+and ignore the optional description C<phrase> as documented
+in RFC 2919.
+
+All other C<HEADER> values use exact matches for backwards-compatibility.
C<HOSTNAME_GLOB> may be a wildcard match for machines where mail can
come from or an exact match.
=head1 COPYRIGHT
-Copyright (C) 2016-2021 all contributors L<mailto:meta@public-inbox.org>
+Copyright (C) all contributors L<mailto:meta@public-inbox.org>
License: AGPL-3.0+ L<http://www.gnu.org/licenses/agpl-3.0.txt>