From c7a250da31feb65e181070e5859bd3795ef4c4a7 Mon Sep 17 00:00:00 2001 From: link2xt Date: Mon, 8 May 2023 10:59:15 +0000 Subject: [PATCH] fix: fetch at most 100 existing messages even if EXISTS was not received According to RFC 3501, EXISTS must always be sent in response to SELECT. But if the server does not send it for some reason, async-imap uses the default value, so we will essentially fetch `1:*` and downloading all messages may take a long time. --- src/imap.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/imap.rs b/src/imap.rs index 6e3437fc0..f8729ece8 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -1324,8 +1324,8 @@ impl Imap { // Fetch last DC_FETCH_EXISTING_MSGS_COUNT (100) messages. // Sequence numbers are sequential. If there are 1000 messages in the inbox, // we can fetch the sequence numbers 900-1000 and get the last 100 messages. - let first = cmp::max(1, exists - DC_FETCH_EXISTING_MSGS_COUNT); - let set = format!("{first}:*"); + let first = cmp::max(1, exists - DC_FETCH_EXISTING_MSGS_COUNT + 1); + let set = format!("{first}:{exists}"); let mut list = session .fetch(&set, PREFETCH_FLAGS) .await