From 5e7fcdac8fe3ce13ebb2fce536b5882fdb9adcde Mon Sep 17 00:00:00 2001 From: holger krekel Date: Fri, 8 May 2026 22:06:18 +0200 Subject: [PATCH] add imap metadata reading of smtp max recipients --- src/constants.rs | 3 --- src/context.rs | 24 ++++++++++++++++-------- src/imap.rs | 17 ++++++++++++++++- src/sql/migrations.rs | 9 +++++++++ 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/src/constants.rs b/src/constants.rs index 9b109c0f5..439144186 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -204,9 +204,6 @@ pub const MAX_RCVD_IMAGE_PIXELS: u32 = 50_000_000; // `max_smtp_rcpt_to` in the provider db. pub(crate) const DEFAULT_MAX_SMTP_RCPT_TO: usize = 50; -/// Same as `DEFAULT_MAX_SMTP_RCPT_TO`, but for chatmail relays. -pub(crate) const DEFAULT_CHATMAIL_MAX_SMTP_RCPT_TO: usize = 999; - /// How far the last quota check needs to be in the past to be checked by the background function (in seconds). pub(crate) const DC_BACKGROUND_FETCH_QUOTA_CHECK_RATELIMIT: u64 = 12 * 60 * 60; // 12 hours diff --git a/src/context.rs b/src/context.rs index 95ce3c777..faf1778f3 100644 --- a/src/context.rs +++ b/src/context.rs @@ -589,18 +589,26 @@ impl Context { /// Returns maximum number of recipients the provider allows to send a single email to. pub(crate) async fn get_max_smtp_rcpt_to(&self) -> Result { - let is_chatmail = self.is_chatmail().await?; + if let Some(limit) = self + .sql + .query_row_optional( + "SELECT t.max_smtp_rcpt_to + FROM transports t + JOIN config c ON c.keyname='configured_addr' AND c.value=t.addr", + (), + |row| row.get::<_, Option>(0), + ) + .await? + .flatten() + { + return Ok(limit as usize); + } + let val = self .get_configured_provider() .await? .and_then(|provider| provider.opt.max_smtp_rcpt_to) - .map_or_else( - || match is_chatmail { - true => constants::DEFAULT_CHATMAIL_MAX_SMTP_RCPT_TO, - false => constants::DEFAULT_MAX_SMTP_RCPT_TO, - }, - usize::from, - ); + .map_or(constants::DEFAULT_MAX_SMTP_RCPT_TO, usize::from); Ok(val) } diff --git a/src/imap.rs b/src/imap.rs index 892253bc2..c321a578a 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -1503,7 +1503,7 @@ impl Session { .get_metadata( mailbox, options, - "(/shared/comment /shared/admin /shared/vendor/deltachat/irohrelay /shared/vendor/deltachat/turn)", + "(/shared/comment /shared/admin /shared/vendor/deltachat/irohrelay /shared/vendor/deltachat/turn /shared/vendor/deltachat/maxsmtprecipients)", ) .await?; for m in metadata { @@ -1539,6 +1539,21 @@ impl Session { } } } + "/shared/vendor/deltachat/maxsmtprecipients" => { + if let Some(value) = m.value.and_then(|v| v.parse::().ok()) { + let transport_id = self.transport_id(); + context + .sql + .execute( + "UPDATE transports \ + SET max_smtp_rcpt_to=? WHERE id=?", + (value, transport_id), + ) + .await + .log_err(context) + .ok(); + } + } _ => {} } } diff --git a/src/sql/migrations.rs b/src/sql/migrations.rs index ce5cf718c..6a4061f26 100644 --- a/src/sql/migrations.rs +++ b/src/sql/migrations.rs @@ -2385,6 +2385,15 @@ UPDATE msgs SET state=19 WHERE state=24; -- Change OutPreparing to OutFailed. .await?; } + inc_and_check(&mut migration_version, 153)?; + if dbversion < migration_version { + sql.execute_migration( + "ALTER TABLE transports ADD COLUMN max_smtp_rcpt_to INTEGER DEFAULT NULL", + migration_version, + ) + .await?; + } + let new_version = sql .get_raw_config_int(VERSION_CFG) .await?