lib/PublicInbox/MDA.pm | 15 +++++++++++++++ script/public-inbox-learn | 8 +++++++- script/public-inbox-mda | 5 +---- diff --git a/lib/PublicInbox/MDA.pm b/lib/PublicInbox/MDA.pm index 9cafda13997f68229d8f6f4f0b1dc34ce4bc3b93..ce2c870f89edcd353d263d1c8fed28a0d08ede1f 100644 --- a/lib/PublicInbox/MDA.pm +++ b/lib/PublicInbox/MDA.pm @@ -83,4 +83,19 @@ $simple->header_set("List-Id", "<$pa>"); } } +# TODO: deal with multiple List-ID headers? +sub inbox_for_list_id ($$) { + my ($klass, $config, $simple) = @_; + + # newer Email::Simple allows header_raw, as does Email::MIME: + my $list_id = $simple->can('header_raw') ? + $simple->header_raw('List-Id') : + $simple->header('List-Id'); + my $ibx; + if (defined $list_id && $list_id =~ /<[ \t]*(.+)?[ \t]*>/) { + $ibx = $config->lookup_list_id($1); + } + $ibx; +} + 1; diff --git a/script/public-inbox-learn b/script/public-inbox-learn old mode 100755 new mode 100644 index 56739f88d720bfc12d344d6e4a2c68b73a28926e..79f3ead5c722cda3d17cea9f4fc8ea185fa39530 --- a/script/public-inbox-learn +++ b/script/public-inbox-learn @@ -77,7 +77,7 @@ $im->remove($mime, 'spam'); $im->done; }); } else { - require PublicInbox::MDA if $train eq "ham"; + require PublicInbox::MDA; # get all recipients my %dests; # address => @@ -89,9 +89,15 @@ } } # n.b. message may be cross-posted to multiple public-inboxes + my %seen; while (my ($addr, $ibx) = each %dests) { next unless ref($ibx); # $ibx may be 0 + next if $seen{"$ibx"}++; remove_or_add($ibx, $train, $addr); + } + my $ibx = PublicInbox::MDA->inbox_for_list_id($pi_config, $mime); + if ($ibx && !$seen{"$ibx"}) { + remove_or_add($ibx, $train, $ibx->{-primary_address}); } } diff --git a/script/public-inbox-mda b/script/public-inbox-mda index 584218b54c5a179d9b4adb86e0ef0caabf40f8de..3ff318c916007f2f19751b51a241ecb22fca2819 100755 --- a/script/public-inbox-mda +++ b/script/public-inbox-mda @@ -43,10 +43,7 @@ if (defined $recipient) { $dst = $config->lookup($recipient); # first check } if (!defined $dst) { - my $list_id = $simple->header('List-Id'); - if (defined $list_id && $list_id =~ /<[ \t]*(.+)?[ \t]*>/) { - $dst = $config->lookup_list_id($1); - } + $dst = PublicInbox::MDA->inbox_for_list_id($config, $simple); if (!defined $dst && !defined $recipient) { die "ORIGINAL_RECIPIENT not defined in ENV\n"; }