about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-08-27 12:17:04 +0000
committerEric Wong <e@yhbt.net>2020-08-27 22:33:47 +0000
commit4f623a133e5531032e378a3d5dd9aec9243450ae (patch)
tree174d3a2c88d1882e923f074c3cb99432ffb6d8ed /lib
parent7cca148aa220d2c747f6487bd8987e0e36db0367 (diff)
downloadpublic-inbox-4f623a133e5531032e378a3d5dd9aec9243450ae.tar.gz
This matches the behavior of Maildir `watchspam' handling in not
removing unseen messages.  NNTP can't match this behavior, since
NNTP servers don't store flags, clients do.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/WatchMaildir.pm20
1 files changed, 12 insertions, 8 deletions
diff --git a/lib/PublicInbox/WatchMaildir.pm b/lib/PublicInbox/WatchMaildir.pm
index 768e0efe..4ae400f7 100644
--- a/lib/PublicInbox/WatchMaildir.pm
+++ b/lib/PublicInbox/WatchMaildir.pm
@@ -382,8 +382,8 @@ sub mic_for ($$$) { # mic = Mail::IMAPClient
         $mic;
 }
 
-sub imap_import_msg ($$$$) {
-        my ($self, $url, $uid, $raw) = @_;
+sub imap_import_msg ($$$$$) {
+        my ($self, $url, $uid, $raw, $flags) = @_;
         # our target audience expects LF-only, save storage
         $$raw =~ s/\r\n/\n/sg;
 
@@ -394,10 +394,13 @@ sub imap_import_msg ($$$$) {
                         my $x = import_eml($self, $ibx, $eml);
                 }
         } elsif ($inboxes eq 'watchspam') {
-                local $SIG{__WARN__} = warn_ignore_cb();
-                my $eml = PublicInbox::Eml->new($raw);
-                my $arg = [ $self, $eml, "$url UID:$uid" ];
-                $self->{config}->each_inbox(\&remove_eml_i, $arg);
+                # we don't remove unseen messages
+                if ($flags =~ /\\Seen\b/) {
+                        local $SIG{__WARN__} = warn_ignore_cb();
+                        my $eml = PublicInbox::Eml->new($raw);
+                        my $arg = [ $self, $eml, "$url UID:$uid" ];
+                        $self->{config}->each_inbox(\&remove_eml_i, $arg);
+                }
         } else {
                 die "BUG: destination unknown $inboxes";
         }
@@ -474,7 +477,7 @@ sub imap_fetch_all ($$$) {
                         my @batch = splice(@$uids, 0, $bs);
                         $batch = join(',', @batch);
                         local $0 = "UID:$batch $mbx $sec";
-                        my $r = $mic->fetch_hash($batch, $req);
+                        my $r = $mic->fetch_hash($batch, $req, 'FLAGS');
                         unless ($r) { # network error?
                                 $err = "E: $url UID FETCH $batch error: $!";
                                 last;
@@ -483,7 +486,8 @@ sub imap_fetch_all ($$$) {
                                 # messages get deleted, so holes appear
                                 my $per_uid = delete $r->{$uid} // next;
                                 my $raw = delete($per_uid->{$key}) // next;
-                                imap_import_msg($self, $url, $uid, \$raw);
+                                my $fl = $per_uid->{FLAGS} // '';
+                                imap_import_msg($self, $url, $uid, \$raw, $fl);
                                 $last_uid = $uid;
                                 last if $self->{quit};
                         }