@@ -581,52 +581,26 @@ impl Imap {
581581
582582 // Determine the target folder where the message should be moved to.
583583 //
584- // If we have seen the message on the IMAP server before, do not move it .
584+ // We only move the messages from the INBOX folder .
585585 // This is required to avoid infinite MOVE loop on IMAP servers
586586 // that alias `DeltaChat` folder to other names.
587587 // For example, some Dovecot servers alias `DeltaChat` folder to `INBOX.DeltaChat`.
588- // In this case Delta Chat configured with `DeltaChat` as the destination folder
589- // would detect messages in the `INBOX.DeltaChat` folder
590- // and try to move them to the `DeltaChat` folder.
591- // Such move to the same folder results in the messages
592- // getting a new UID, so the messages will be detected as new
588+ // In this case moving from `INBOX.DeltaChat` to `DeltaChat`
589+ // results in the messages getting a new UID,
590+ // so the messages will be detected as new
593591 // in the `INBOX.DeltaChat` folder again.
594592 let _target;
595593 let target = if let Some ( message_id) = & message_id {
596594 let msg_info =
597595 message:: rfc724_mid_exists_ex ( context, message_id, "deleted=1" ) . await ?;
598- let delete = if let Some ( ( _, _ , true ) ) = msg_info {
596+ let delete = if let Some ( ( _, true ) ) = msg_info {
599597 info ! ( context, "Deleting locally deleted message {message_id}." ) ;
600598 true
601- } else if let Some ( ( _, ts_sent_old, _) ) = msg_info {
602- let is_chat_msg = headers. get_header_value ( HeaderDef :: ChatVersion ) . is_some ( ) ;
603- let ts_sent = headers
604- . get_header_value ( HeaderDef :: Date )
605- . and_then ( |v| mailparse:: dateparse ( & v) . ok ( ) )
606- . unwrap_or_default ( ) ;
607- let is_dup = is_dup_msg ( is_chat_msg, ts_sent, ts_sent_old) ;
608- if is_dup {
609- info ! ( context, "Deleting duplicate message {message_id}." ) ;
610- }
611- is_dup
612599 } else {
613600 false
614601 } ;
615602 if delete {
616603 & delete_target
617- } else if context
618- . sql
619- . exists (
620- "SELECT COUNT (*) FROM imap WHERE rfc724_mid=?" ,
621- ( message_id, ) ,
622- )
623- . await ?
624- {
625- info ! (
626- context,
627- "Not moving the message {} that we have seen before." , & message_id
628- ) ;
629- folder
630604 } else {
631605 _target = target_folder ( context, folder, folder_meaning, & headers) . await ?;
632606 & _target
@@ -728,7 +702,6 @@ impl Imap {
728702 . fetch_many_msgs (
729703 context,
730704 folder,
731- uid_validity,
732705 uids_fetch_in_batch. split_off ( 0 ) ,
733706 & uid_message_ids,
734707 fetch_partially,
@@ -1342,7 +1315,6 @@ impl Session {
13421315 & mut self ,
13431316 context : & Context ,
13441317 folder : & str ,
1345- uidvalidity : u32 ,
13461318 request_uids : Vec < u32 > ,
13471319 uid_message_ids : & BTreeMap < u32 , String > ,
13481320 fetch_partially : bool ,
@@ -1466,18 +1438,7 @@ impl Session {
14661438 context,
14671439 "Passing message UID {} to receive_imf()." , request_uid
14681440 ) ;
1469- match receive_imf_inner (
1470- context,
1471- folder,
1472- uidvalidity,
1473- request_uid,
1474- rfc724_mid,
1475- body,
1476- is_seen,
1477- partial,
1478- )
1479- . await
1480- {
1441+ match receive_imf_inner ( context, rfc724_mid, body, is_seen, partial) . await {
14811442 Ok ( received_msg) => {
14821443 received_msgs_channel
14831444 . send ( ( request_uid, received_msg) )
@@ -1994,7 +1955,9 @@ pub async fn target_folder_cfg(
19941955
19951956 if folder_meaning == FolderMeaning :: Spam {
19961957 spam_target_folder_cfg ( context, headers) . await
1997- } else if needs_move_to_mvbox ( context, headers) . await ? {
1958+ } else if folder_meaning == FolderMeaning :: Inbox
1959+ && needs_move_to_mvbox ( context, headers) . await ?
1960+ {
19981961 Ok ( Some ( Config :: ConfiguredMvboxFolder ) )
19991962 } else {
20001963 Ok ( None )
@@ -2163,7 +2126,9 @@ fn get_folder_meaning_by_name(folder_name: &str) -> FolderMeaning {
21632126 ] ;
21642127 let lower = folder_name. to_lowercase ( ) ;
21652128
2166- if SENT_NAMES . iter ( ) . any ( |s| s. to_lowercase ( ) == lower) {
2129+ if lower == "inbox" {
2130+ FolderMeaning :: Inbox
2131+ } else if SENT_NAMES . iter ( ) . any ( |s| s. to_lowercase ( ) == lower) {
21672132 FolderMeaning :: Sent
21682133 } else if SPAM_NAMES . iter ( ) . any ( |s| s. to_lowercase ( ) == lower) {
21692134 FolderMeaning :: Spam
@@ -2322,15 +2287,6 @@ pub(crate) async fn prefetch_should_download(
23222287 Ok ( should_download)
23232288}
23242289
2325- /// Returns whether a message is a duplicate (resent message).
2326- pub ( crate ) fn is_dup_msg ( is_chat_msg : bool , ts_sent : i64 , ts_sent_old : i64 ) -> bool {
2327- // If the existing message has timestamp_sent == 0, that means we don't know its actual sent
2328- // timestamp, so don't delete the new message. E.g. outgoing messages have zero timestamp_sent
2329- // because they are stored to the db before sending. Also consider as duplicates only messages
2330- // with greater timestamp to avoid deleting both messages in a multi-device setting.
2331- is_chat_msg && ts_sent_old != 0 && ts_sent > ts_sent_old
2332- }
2333-
23342290/// Marks messages in `msgs` table as seen, searching for them by UID.
23352291///
23362292/// Returns updated chat ID if any message was marked as seen.
0 commit comments