X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FWatchMaildir.pm;h=e923178066fcac20f7e4e5a6c331354ee7d5a7da;hb=f9fc5cf2e8cefda4a56d937ed217e47689fd7e49;hp=f63140c8ed32724a20554cb9bbb014cefdfd709b;hpb=9bd675d33ad1e49bd2ebe12a1d216216e61380de;p=public-inbox.git diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm index f63140c8..e9231780 100644 --- a/lib/PublicInbox/WatchMaildir.pm +++ b/lib/PublicInbox/WatchMaildir.pm @@ -13,6 +13,7 @@ use File::Temp qw//; use PublicInbox::Filter::Base; use PublicInbox::Spamcheck; *REJECT = *PublicInbox::Filter::Base::REJECT; +*maildir_path_load = *PublicInbox::InboxWritable::maildir_path_load; sub new { my ($class, $config) = @_; @@ -59,9 +60,19 @@ sub new { my $watch = $ibx->{watch} or return; if (is_maildir($watch)) { - if (my $wm = $ibx->{watchheader}) { - my ($k, $v) = split(/:/, $wm, 2); - $ibx->{-watchheader} = [ $k, qr/\Q$v\E/ ]; + my $watch_hdrs = []; + if (my $wh = $ibx->{watchheader}) { + my ($k, $v) = split(/:/, $wh, 2); + push @$watch_hdrs, [ $k, qr/\Q$v\E/ ]; + } + if (my $list_ids = $ibx->{listid}) { + for (@$list_ids) { + my $re = qr/<[ \t]*\Q$_\E[ \t]*>/; + push @$watch_hdrs, ['List-Id', $re ]; + } + } + if (scalar @$watch_hdrs) { + $ibx->{-watchheaders} = $watch_hdrs; } my $new = "$watch/new"; my $cur = "$watch/cur"; @@ -114,7 +125,7 @@ sub _remove_spam { my ($self, $path) = @_; # path must be marked as (S)een $path =~ /:2,[A-R]*S[T-Za-z]*\z/ or return; - my $mime = _path_to_mime($path) or return; + my $mime = maildir_path_load($path) or return; $self->{config}->each_inbox(sub { my ($ibx) = @_; eval { @@ -156,13 +167,20 @@ sub _try_path { $warn_cb->(@_); }; foreach my $ibx (@$inboxes) { - my $mime = _path_to_mime($path) or next; + my $mime = maildir_path_load($path) or next; my $im = _importer_for($self, $ibx); - my $wm = $ibx->{-watchheader}; - if ($wm) { - my $v = $mime->header_obj->header_raw($wm->[0]); - next unless ($v && $v =~ $wm->[1]); + # any header match means it's eligible for the inbox: + if (my $watch_hdrs = $ibx->{-watchheaders}) { + my $ok; + my $hdr = $mime->header_obj; + for my $wh (@$watch_hdrs) { + my $v = $hdr->header_raw($wh->[0]); + next unless defined($v) && $v =~ $wh->[1]; + $ok = 1; + last; + } + next unless $ok; } if (my $scrub = $ibx->filter($im)) { @@ -242,21 +260,6 @@ sub scan { trigger_scan($self, 'cont') if keys %$opendirs; } -sub _path_to_mime { - my ($path) = @_; - if (open my $fh, '<', $path) { - local $/; - my $str = <$fh>; - $str or return; - return PublicInbox::MIME->new(\$str); - } elsif ($!{ENOENT}) { - return; - } else { - warn "failed to open $path: $!\n"; - return; - } -} - sub _importer_for { my ($self, $ibx) = @_; my $importers = $self->{importers};