diff --git a/src/context.rs b/src/context.rs index d9fcec7a5..30ab63af9 100644 --- a/src/context.rs +++ b/src/context.rs @@ -207,7 +207,8 @@ unsafe fn cb_precheck_imf( server_uid ); if let Some(res) = dc_rfc724_mid_exists_with_msg_state(context, rfc724_mid) { - let (msg_id, msg_state, old_server_folder, old_server_uid) = res; + let (msg_id, _, old_server_folder, old_server_uid) = res; + info!(context, 0, "precheck msg_id={}", msg_id); if msg_id != 0 { if old_server_folder.is_empty() { info!(context, 0, "[move] detected bbc-self {}", rfc724_mid,); @@ -216,21 +217,14 @@ unsafe fn cb_precheck_imf( info!(context, 0, "[move] detected moved message {}", rfc724_mid,); } dc_update_msg_move_state(context, rfc724_mid, MoveState::Stay); - if msg_state == MessageState::InSeen { - // Message is maybe moved from another folder. - // trigger MDN receipts - info!( - context, - 0, - "InSeen msgid={} server_uid={} server_folder={}", - msg_id, - server_uid, - server_folder, - ); - } } if old_server_folder != server_folder || old_server_uid != server_uid { + info!( + context, + 0, "precheck updated server_uid for msg_id={}", msg_id + ); dc_update_server_uid(context, rfc724_mid, server_folder, server_uid); + job_retry_msg_actions_at_once(context, msg_id); } dc_do_heuristics_moves(context, server_folder, msg_id); if mark_seen { diff --git a/src/job.rs b/src/job.rs index 88d1cab1c..d6a47b4ba 100644 --- a/src/job.rs +++ b/src/job.rs @@ -284,7 +284,14 @@ impl Job { self.try_again_later(Delay::Standard, None); return; } + if let Ok(msg) = dc_msg_load_from_db(context, self.foreign_id) { + if msg.server_uid == 0 { + // the message has likely been moved + // try again later + self.try_again_later(Delay::Standard, None); + return; + } let server_folder = msg.server_folder.as_ref().unwrap(); info!(context, 0, "job_markseen_msg db id={}", self.foreign_id); match inbox.set_seen(context, server_folder, msg.server_uid) { @@ -310,7 +317,7 @@ impl Job { .unwrap_or_else(|| 1) ); - /* + /* XXX if 0 != msg.param.get_int(Param::WantsMdn).unwrap_or_default() && 0 != context .sql @@ -602,6 +609,21 @@ pub fn maybe_network(context: &Context) { interrupt_sentbox_idle(context); } +pub fn job_retry_msg_actions_at_once(context: &Context, msg_id: uint32_t) -> bool { + match sql::execute( + context, + &context.sql, + "UPDATE jobs SET desired_timestamp=? WHERE foreign_id=?;", + params![time(), msg_id], + ) { + Ok(_) => true, + Err(_err) => { + info!(context, 0, "job-retry-at-once failed {:?}", _err); + false + } + } +} + pub fn job_action_exists(context: &Context, action: Action) -> bool { context .sql @@ -960,7 +982,7 @@ fn connect_to_inbox(context: &Context, inbox: &Imap) -> bool { } } -fn send_mdn(context: &Context, msg_id: uint32_t) { +pub fn send_mdn(context: &Context, msg_id: uint32_t) { if let Ok(mut mimefactory) = unsafe { dc_mimefactory_load_mdn(context, msg_id) } { if 0 != unsafe { dc_mimefactory_render(&mut mimefactory) } { add_smtp_job(context, Action::SendMdn, &mut mimefactory);