]> git.g-eek.se Git - interimap.git/commitdiff
pullimap: use extended SEARCH (RFC 4731) when available
authorGuilhem Moulin <guilhem@fripost.org>
Thu, 10 May 2018 15:56:45 +0000 (17:56 +0200)
committerGuilhem Moulin <guilhem@fripost.org>
Thu, 10 May 2018 16:07:25 +0000 (18:07 +0200)
Changelog
pullimap
pullimap.md

index bb355e0d1e8bd5f2d46010f2cd48c9c07269fa63..7939fa245ba793c570bf4c5938f9f0d2e0558405 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -5,6 +5,8 @@ interimap (0.4) UNRELEASED
     <>.
   + Library: new API idle_start() and idle_stop().
   + Add support for untagged ESEARCH responses from RFC 4731.
+  + pullimap: Use extended SEARCH commands (RFC 4731) if supported by
+    the server to search old mail and EXPUNGE them.
   - Ensure the lower bound of UID ranges is at least 1.
   - Fix manpage generation with pandoc >=2.1.
 
index dca8c4946cf4fcdd0f8a6bd50edbbf42f947cae2..736bbff92710046ed21d291c7f4b77a7bff85284 100755 (executable)
--- a/pullimap
+++ b/pullimap
@@ -249,10 +249,20 @@ sub purge() {
         my @now = gmtime($now - $days*86400);
         my @m = qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/; # RFC 3501's date-month
         my $date = sprintf("%02d-%s-%04d", $now[3], $m[$now[4]], $now[5]+1900);
-        my @uid = $IMAP->search("UID $set BEFORE $date");
-
-        $set = @uid ? compact_set(@uid) : undef;
-        $IMAP->log("Removing ".($#uid+1)." UID(s) $set") if defined $set and !$CONFIG{quiet};
+        my $ext = $IMAP->incapable('ESEARCH') ? undef : [qw/COUNT ALL/];
+        my @uid = $IMAP->search((defined $ext ? "RETURN (".join(' ', @$ext).') ' : '')
+                                ."UID $set BEFORE $date");
+        my $count;
+        if (defined $ext) {
+            my ($uid_indicator, %resp) = @uid;
+            $IMAP->panic() unless defined $uid_indicator and $uid_indicator = 'UID';
+            $count = $resp{COUNT} // $IMAP->panic();
+            $set = $resp{ALL}; # MUST NOT be present if there are no matches
+        } else {
+            $count = $#uid+1;
+            $set = $count == 0 ? undef : compact_set(@uid);
+        }
+        $IMAP->log("Removing $count UID(s) $set") if $count > 0 and !$CONFIG{quiet};
     }
 
     if (defined $set) {
index cb2a07ab73cbd1861245cc2cbfe91ca1ddf0ce7e..3e8aae3c2bd51f18819d6719d5aa951107d4bbbc 100644 (file)
@@ -121,9 +121,10 @@ Valid options are:
     the IMAP server.  (The value is at best 24h accurate due to the IMAP
     `SEARCH` criterion ignoring time and timezone.)
     If *purge-after* is set to `0` then messages are deleted immediately
-    after delivery.  Otherwise `pullimap` issues an IMAP `SEARCH`
-    command to list old messages; if `--idle` is set then the `SEARCH`
-    command is issued again every 12 hours.
+    after delivery.  Otherwise `pullimap` issues an IMAP `SEARCH` (or
+    extended `SEARCH` on server advertizing the [`ESEARCH`][RFC 4731]
+    capability) command to list old messages; if `--idle` is set then
+    the `SEARCH` command is issued again every 12 hours.
 
 *type*
 
@@ -339,6 +340,9 @@ Standards
    [RFC 4315], December 2005.
  * A. Gulbrandsen, _The IMAP `COMPRESS` Extension_,
    [RFC 4978], August 2007.
+ * A. Melnikov and D. Cridland, _IMAP4 Extension to SEARCH Command for
+   Controlling What Kind of Information Is Returned_,
+   [RFC 4731], November 2006.
  * R. Siemborski and A. Gulbrandsen, _IMAP Extension for Simple
    Authentication and Security Layer (SASL) Initial Client Response_,
    [RFC 4959], September 2007.
@@ -358,6 +362,7 @@ Standards
 [RFC 4978]: https://tools.ietf.org/html/rfc4978
 [RFC 1928]: https://tools.ietf.org/html/rfc1928
 [RFC 1929]: https://tools.ietf.org/html/rfc1929
+[RFC 4731]: https://tools.ietf.org/html/rfc4731
 
 [INI file]: https://en.wikipedia.org/wiki/INI_file
 [`fetchmail`(1)]: http://www.fetchmail.info/