@@ -526,17 +526,6 @@ async fn fetch_idle(ctx: &Context, connection: &mut Imap, folder_meaning: Folder
526
526
}
527
527
}
528
528
529
- // Fetch the watched folder.
530
- if let Err ( err) = connection
531
- . fetch_move_delete ( ctx, & watch_folder, folder_meaning)
532
- . await
533
- . context ( "fetch_move_delete" )
534
- {
535
- connection. trigger_reconnect ( ctx) ;
536
- warn ! ( ctx, "{:#}" , err) ;
537
- return ;
538
- }
539
-
540
529
// Mark expired messages for deletion. Marked messages will be deleted from the server
541
530
// on the next iteration of `fetch_move_delete`. `delete_expired_imap_messages` is not
542
531
// called right before `fetch_move_delete` because it is not well optimized and would
@@ -605,12 +594,9 @@ async fn fetch_idle(ctx: &Context, connection: &mut Imap, folder_meaning: Folder
605
594
"IMAP session does not support IDLE, going to fake idle."
606
595
) ;
607
596
connection
608
- . fake_idle ( ctx, Some ( watch_folder) , folder_meaning)
597
+ . fake_idle ( ctx, Some ( watch_folder. clone ( ) ) , folder_meaning)
609
598
. await ;
610
- return ;
611
- }
612
-
613
- if ctx
599
+ } else if ctx
614
600
. get_config_bool ( Config :: DisableIdle )
615
601
. await
616
602
. context ( "Failed to get disable_idle config" )
@@ -619,28 +605,38 @@ async fn fetch_idle(ctx: &Context, connection: &mut Imap, folder_meaning: Folder
619
605
{
620
606
info ! ( ctx, "IMAP IDLE is disabled, going to fake idle." ) ;
621
607
connection
622
- . fake_idle ( ctx, Some ( watch_folder) , folder_meaning)
608
+ . fake_idle ( ctx, Some ( watch_folder. clone ( ) ) , folder_meaning)
623
609
. await ;
624
- return ;
610
+ } else {
611
+ info ! ( ctx, "IMAP session supports IDLE, using it." ) ;
612
+ match session
613
+ . idle (
614
+ ctx,
615
+ connection. idle_interrupt_receiver . clone ( ) ,
616
+ & watch_folder,
617
+ )
618
+ . await
619
+ . context ( "idle" )
620
+ {
621
+ Ok ( session) => {
622
+ connection. session = Some ( session) ;
623
+ }
624
+ Err ( err) => {
625
+ connection. trigger_reconnect ( ctx) ;
626
+ warn ! ( ctx, "{:#}" , err) ;
627
+ }
628
+ }
625
629
}
626
630
627
- info ! ( ctx, "IMAP session supports IDLE, using it." ) ;
628
- match session
629
- . idle (
630
- ctx,
631
- connection. idle_interrupt_receiver . clone ( ) ,
632
- & watch_folder,
633
- )
631
+ // Fetch the watched folder
632
+ // immediately after IDLE to reduce message delivery latency.
633
+ if let Err ( err) = connection
634
+ . fetch_move_delete ( ctx, & watch_folder, folder_meaning)
634
635
. await
635
- . context ( "idle " )
636
+ . context ( "fetch_move_delete " )
636
637
{
637
- Ok ( session) => {
638
- connection. session = Some ( session) ;
639
- }
640
- Err ( err) => {
641
- connection. trigger_reconnect ( ctx) ;
642
- warn ! ( ctx, "{:#}" , err) ;
643
- }
638
+ connection. trigger_reconnect ( ctx) ;
639
+ warn ! ( ctx, "{:#}" , err) ;
644
640
}
645
641
}
646
642
0 commit comments