diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index ea25b5979..eaa15f8f4 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -1245,8 +1245,11 @@ pub unsafe extern "C" fn dc_forward_msgs( let ffi_context = &*context; ffi_context - .with_inner(|ctx| chat::forward_msgs(ctx, ids, chat_id)) - .unwrap_or_log_default(ctx, "Failed to forard message") + .with_inner(|ctx| { + chat::forward_msgs(ctx, ids, chat_id) + .unwrap_or_log_default(ctx, "Failed to forward message") + }) + .unwrap_or_default() } #[no_mangle] diff --git a/src/chat.rs b/src/chat.rs index 166d2489f..3d66c63e0 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -805,8 +805,7 @@ pub fn send_msg(context: &Context, chat_id: u32, msg: &mut Message) -> Result { + sock.disconnect(); + warn!(context, "smtp failed: {}", err); + self.try_again_later(-1i32, Some(err.to_string())); + } + Ok(()) => { + // smtp success, update db ASAP, then delete smtp file + if 0 != self.foreign_id { + message::update_msg_state( + context, + self.foreign_id, + MessageState::OutDelivered, + ); + let chat_id: i32 = context + .sql + .query_get_value( + context, + "SELECT chat_id FROM msgs WHERE id=?", + params![self.foreign_id as i32], + ) + .unwrap_or_default(); + context.call_cb(Event::MsgDelivered { + chat_id: chat_id as u32, + msg_id: self.foreign_id, + }); + } + // now also delete the generated file + dc_delete_file(context, filename); } - // now also delete the generated file - dc_delete_file(context, filename); } } else { warn!(context, "Missing recipients for job {}", self.job_id,); @@ -214,7 +218,7 @@ impl Job { if !inbox.is_connected() { connect_to_inbox(context, &inbox); if !inbox.is_connected() { - self.try_again_later(3, None); + self.try_again_later(3, Some("could not connect".into())); return; } } @@ -612,10 +616,6 @@ pub fn job_action_exists(context: &Context, action: Action) -> bool { pub fn job_send_msg(context: &Context, msg_id: u32) -> Result<(), Error> { let mut mimefactory = MimeFactory::load_msg(context, msg_id)?; - ensure!(!mimefactory.recipients_addr.is_empty(), - "msg {} has no recipients, can not smtp-sent", msg_id - ); - if chat::msgtype_has_file(mimefactory.msg.type_0) { let file_param = mimefactory .msg @@ -672,6 +672,15 @@ pub fn job_send_msg(context: &Context, msg_id: u32) -> Result<(), Error> { .recipients_addr .push(mimefactory.from_addr.to_string()); } + + if mimefactory.recipients_addr.is_empty() { + warn!( + context, + "message {} has no recipient, skipping smtp-send", msg_id + ); + return Ok(()); + } + if mimefactory.out_gossiped { chat::set_gossiped_timestamp(context, mimefactory.msg.chat_id, time()); } diff --git a/src/smtp.rs b/src/smtp.rs index f2287b749..5d8ba4654 100644 --- a/src/smtp.rs +++ b/src/smtp.rs @@ -3,6 +3,7 @@ use lettre::*; use crate::constants::*; use crate::context::Context; +use crate::error::Error; use crate::events::Event; use crate::login_param::LoginParam; use crate::oauth2::*; @@ -14,7 +15,6 @@ pub struct Smtp { transport_connected: bool, /// Email address we are sending from. from: Option, - pub error: Option, } impl Smtp { @@ -24,7 +24,6 @@ impl Smtp { transport: None, transport_connected: false, from: None, - error: None, } } @@ -132,11 +131,19 @@ impl Smtp { context: &Context, recipients: Vec, message: Vec, - ) -> bool { + ) -> Result<(), Error> { let message_len = message.len(); + let recipients_display = recipients + .iter() + .map(|x| format!("{}", x)) + .collect::>() + .join(","); + if let Some(ref mut transport) = self.transport { - let envelope = Envelope::new(self.from.clone(), recipients).expect("invalid envelope"); + let envelope = Envelope::new(self.from.clone(), recipients); + ensure!(envelope.is_ok(), "internal smtp-message construction fail"); + let envelope = envelope.unwrap(); let mail = SendableEmail::new( envelope, "mail-id".into(), // TODO: random id @@ -145,24 +152,22 @@ impl Smtp { match transport.send(mail) { Ok(_) => { - context.call_cb(Event::SmtpMessageSent( - "Message was sent to SMTP server".into(), - )); + context.call_cb(Event::SmtpMessageSent(format!( + "Message len={} was smtp-sent to {}", + message_len, recipients_display + ))); self.transport_connected = true; - true + return Ok(()); } Err(err) => { - warn!( - context, - "SMTP failed message size {}, error: {}", message_len, err - ); - self.error = Some(format!("{}", err)); - false + bail!("SMTP failed len={}: error: {}", message_len, err); } } } else { - warn!(context, "SMTP Failed to send message to {:?}", recipients); - false + bail!( + "uh? SMTP has no transport, failed to send to {:?}", + recipients_display + ); } } }