diff --git a/src/imap.rs b/src/imap.rs index ebf5e3d39..79d055f46 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -789,29 +789,25 @@ impl Imap { info!(context, "Done fetching existing messages."); Ok(()) } +} +impl Session { /// Synchronizes UIDs for all folders. pub(crate) async fn resync_folders(&mut self, context: &Context) -> Result<()> { - self.prepare(context).await?; - - let session = self.session.as_mut().context("No IMAP session")?; - let all_folders = session + let all_folders = self .list_folders() .await .context("listing folders for resync")?; for folder in all_folders { let folder_meaning = get_folder_meaning(&folder); if folder_meaning != FolderMeaning::Virtual { - session - .resync_folder_uids(context, folder.name(), folder_meaning) + self.resync_folder_uids(context, folder.name(), folder_meaning) .await?; } } Ok(()) } -} -impl Session { /// Synchronizes UIDs in the database with UIDs on the server. /// /// It is assumed that no operations are taking place on the same diff --git a/src/scheduler.rs b/src/scheduler.rs index b6132c4d4..3c558e3fb 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -393,6 +393,10 @@ async fn inbox_loop( }; loop { + if let Err(err) = connection.prepare(&ctx).await { + warn!(ctx, "Failed to prepare connection: {:#}.", err); + } + { // Update quota no more than once a minute. let quota_needs_update = { @@ -412,9 +416,11 @@ async fn inbox_loop( let resync_requested = ctx.resync_request.swap(false, Ordering::Relaxed); if resync_requested { - if let Err(err) = connection.resync_folders(&ctx).await { - warn!(ctx, "Failed to resync folders: {:#}.", err); - ctx.resync_request.store(true, Ordering::Relaxed); + if let Some(session) = connection.session.as_mut() { + if let Err(err) = session.resync_folders(&ctx).await { + warn!(ctx, "Failed to resync folders: {:#}.", err); + ctx.resync_request.store(true, Ordering::Relaxed); + } } }