diff --git a/python/tests/test_account.py b/python/tests/test_account.py index 5ebe85fff..b9febaa5b 100644 --- a/python/tests/test_account.py +++ b/python/tests/test_account.py @@ -1542,7 +1542,6 @@ class TestOnlineAccount: assert msg.is_encrypted(), "Message is not encrypted" assert msg.chat == ac2.create_chat(ac4) - @pytest.mark.xfail def test_immediate_autodelete(self, acfactory, lp): ac1 = acfactory.get_online_configuring_account() ac2 = acfactory.get_online_configuring_account(mvbox=False, move=False, sentbox=False) diff --git a/src/imap/select_folder.rs b/src/imap/select_folder.rs index c1b2d3278..4c335015e 100644 --- a/src/imap/select_folder.rs +++ b/src/imap/select_folder.rs @@ -51,6 +51,14 @@ impl Imap { Ok(()) } + /// Issues a CLOSE command if selected folder needs expunge. + pub(crate) async fn maybe_close_folder(&mut self, context: &Context) -> Result<()> { + if self.config.selected_folder_needs_expunge { + self.close_folder(context).await?; + } + Ok(()) + } + /// select a folder, possibly update uid_validity and, if needed, /// expunge the folder to remove delete-marked messages. pub(super) async fn select_folder>( @@ -76,10 +84,7 @@ impl Imap { } // deselect existing folder, if needed (it's also done implicitly by SELECT, however, without EXPUNGE then) - let needs_expunge = { self.config.selected_folder_needs_expunge }; - if needs_expunge { - self.close_folder(context).await?; - } + self.maybe_close_folder(context).await?; // select new folder if let Some(ref folder) = folder { diff --git a/src/scheduler.rs b/src/scheduler.rs index 81c1c413c..269f6f4e0 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -74,6 +74,13 @@ async fn inbox_loop(ctx: Context, started: Sender<()>, inbox_handlers: ImapConne } None => { jobs_loaded = 0; + + // Expunge folder if needed, e.g. if some jobs have + // deleted messages on the server. + if let Err(err) = connection.maybe_close_folder(&ctx).await { + warn!(ctx, "failed to close folder: {:?}", err); + } + info = if ctx.get_config_bool(Config::InboxWatch).await { fetch_idle(&ctx, &mut connection, Config::ConfiguredInboxFolder).await } else {