From 1cfeb730c3d3ef1b2aeb8e065eae992a1c8074ca Mon Sep 17 00:00:00 2001 From: holger krekel Date: Sun, 3 Nov 2019 02:12:29 +0100 Subject: [PATCH] try to fix some smtp todos and do better error logging --- src/configure/mod.rs | 21 +++++++++++++-------- src/job.rs | 10 +++++++--- src/smtp.rs | 35 ++++++++++++++++------------------- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/configure/mod.rs b/src/configure/mod.rs index 099445a99..6e9d1dedb 100644 --- a/src/configure/mod.rs +++ b/src/configure/mod.rs @@ -531,21 +531,26 @@ fn try_smtp_one_param(context: &Context, param: &LoginParam) -> Option { param.send_user, param.send_server, param.send_port, param.server_flags ); info!(context, "Trying: {}", inf); - if context + match context .smtp .clone() .lock() .unwrap() .connect(context, ¶m) { - info!(context, "success: {}", inf); - return Some(true); + Ok(()) => { + info!(context, "success: {}", inf); + Some(true) + } + Err(err) => { + if context.shall_stop_ongoing() { + Some(false) + } else { + warn!(context, "could not connect: {}", err); + None + } + } } - if context.shall_stop_ongoing() { - return Some(false); - } - info!(context, "could not connect: {}", inf); - None } /******************************************************************************* diff --git a/src/job.rs b/src/job.rs index 585c0873f..49c34a0c3 100644 --- a/src/job.rs +++ b/src/job.rs @@ -134,9 +134,13 @@ impl Job { /* connect to SMTP server, if not yet done */ if !context.smtp.lock().unwrap().is_connected() { let loginparam = LoginParam::from_database(context, "configured_"); - let connected = context.smtp.lock().unwrap().connect(context, &loginparam); - - if !connected { + if context + .smtp + .lock() + .unwrap() + .connect(context, &loginparam) + .is_err() + { self.try_again_later(3, None); return; } diff --git a/src/smtp.rs b/src/smtp.rs index ca9a252e0..9e739b92c 100644 --- a/src/smtp.rs +++ b/src/smtp.rs @@ -44,27 +44,24 @@ impl Smtp { } /// Connect using the provided login params - pub fn connect(&mut self, context: &Context, lp: &LoginParam) -> bool { + pub fn connect(&mut self, context: &Context, lp: &LoginParam) -> Result<(), Error> { if self.is_connected() { warn!(context, "SMTP already connected."); - return true; + return Ok(()); } if lp.send_server.is_empty() || lp.send_port == 0 { context.call_cb(Event::ErrorNetwork("SMTP bad parameters.".into())); + bail!("SMTP Bad parameters"); } - self.from = if let Ok(addr) = EmailAddress::new(lp.addr.clone()) { - Some(addr) - } else { - None + self.from = match EmailAddress::new(lp.addr.clone()) { + Ok(addr) => Some(addr), + Err(err) => { + bail!("invalid login address {}: {}", lp.addr, err); + } }; - if self.from.is_none() { - // TODO: print error - return false; - } - let domain = &lp.send_server; let port = lp.send_port as u16; @@ -76,11 +73,12 @@ impl Smtp { let addr = &lp.addr; let send_pw = &lp.send_pw; let access_token = dc_get_oauth2_access_token(context, addr, send_pw, false); - if access_token.is_none() { - return false; - } + ensure!( + access_token.is_some(), + "could not get oaut2_access token addr={}", + addr + ); let user = &lp.send_user; - ( lettre::smtp::authentication::Credentials::new( user.to_string(), @@ -125,18 +123,17 @@ impl Smtp { "SMTP-LOGIN as {} ok", lp.send_user, ))); - return true; + return Ok(()); } Err(err) => { - warn!(context, "SMTP: failed to connect {:?}", err); + bail!("SMTP: failed to connect {:?}", err); } } } Err(err) => { - warn!(context, "SMTP: failed to setup connection {:?}", err); + bail!("SMTP: failed to setup connection {:?}", err); } } - false } /// SMTP-Send a prepared mail to recipients.