diff --git a/Cargo.lock b/Cargo.lock index fb307c34a..20af8557a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -200,8 +200,7 @@ dependencies = [ [[package]] name = "async-smtp" version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9720181a7d56bf3b4d0cfdcb6353df975125996bdd2958b4e639c8317fcaa68" +source = "git+https://github.com/async-email/async-smtp?branch=smtptimeout#74f489f29f8cbd2650d69119e63bf9e35e36dc85" dependencies = [ "async-native-tls", "async-std", diff --git a/Cargo.toml b/Cargo.toml index c73ea8be7..ae925322d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ smallvec = "1.0.0" surf = { version = "2.0.0-alpha.4", default-features = false, features = ["h1-client"] } num-derive = "0.3.0" num-traits = "0.2.6" -async-smtp = { version = "0.3" } +async-smtp = { git = "https://github.com/async-email/async-smtp", branch = "smtptimeout" } email = { git = "https://github.com/deltachat/rust-email", branch = "master" } lettre_email = { git = "https://github.com/deltachat/lettre", branch = "master" } async-imap = "0.3.1" diff --git a/src/smtp/send.rs b/src/smtp/send.rs index 1948ccf7e..821636549 100644 --- a/src/smtp/send.rs +++ b/src/smtp/send.rs @@ -5,6 +5,7 @@ use async_smtp::*; use crate::context::Context; use crate::events::Event; +use std::time::Duration; pub type Result = std::result::Result; @@ -30,7 +31,7 @@ impl Smtp { message: Vec, job_id: u32, ) -> Result<()> { - let message_len = message.len(); + let message_len_bytes = message.len(); let recipients_display = recipients .iter() @@ -47,11 +48,16 @@ impl Smtp { ); if let Some(ref mut transport) = self.transport { - transport.send(mail).await.map_err(Error::SendError)?; + // The timeout is 1min + 3min per MB. + let timeout = 60 + (180 * message_len_bytes / 1_000_000) as u64; + transport + .send_with_timeout(mail, Some(&Duration::from_secs(timeout))) + .await + .map_err(Error::SendError)?; context.emit_event(Event::SmtpMessageSent(format!( "Message len={} was smtp-sent to {}", - message_len, recipients_display + message_len_bytes, recipients_display ))); self.last_success = Some(std::time::SystemTime::now());