From 01ca8e2e3b66442e89e10a81213ec85520a7e018 Mon Sep 17 00:00:00 2001 From: mdecimus Date: Mon, 2 Jun 2025 12:18:51 +0200 Subject: [PATCH] TLS reports being issued for sent TLS reports (infinite loop) (closes #1301) --- crates/smtp/src/outbound/delivery.rs | 4 ++-- crates/smtp/src/queue/mod.rs | 2 ++ crates/smtp/src/reporting/mod.rs | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/smtp/src/outbound/delivery.rs b/crates/smtp/src/outbound/delivery.rs index 79b244fd..cb9c2ce6 100644 --- a/crates/smtp/src/outbound/delivery.rs +++ b/crates/smtp/src/outbound/delivery.rs @@ -42,7 +42,7 @@ use crate::{ }; use super::{NextHop, TlsStrategy, lookup::ToNextHop, mta_sts, session::SessionParams}; -use crate::queue::{Domain, Error, QueueEnvelope, QueuedMessage, Status}; +use crate::queue::{Domain, Error, FROM_REPORT, QueueEnvelope, QueuedMessage, Status}; impl QueuedMessage { pub fn try_deliver(self, server: Server) { @@ -300,7 +300,7 @@ impl QueuedMessage { interval @ (AggregateFrequency::Hourly | AggregateFrequency::Daily | AggregateFrequency::Weekly) - if is_smtp => + if is_smtp && (message.flags & FROM_REPORT == 0) => { let time = Instant::now(); match server diff --git a/crates/smtp/src/queue/mod.rs b/crates/smtp/src/queue/mod.rs index e9aa9dc5..cbd58afd 100644 --- a/crates/smtp/src/queue/mod.rs +++ b/crates/smtp/src/queue/mod.rs @@ -121,6 +121,8 @@ pub struct Recipient { pub orcpt: Option, } +pub const FROM_REPORT: u64 = 1 << 32; + pub const RCPT_DSN_SENT: u64 = 1 << 32; pub const RCPT_STATUS_CHANGED: u64 = 2 << 32; diff --git a/crates/smtp/src/reporting/mod.rs b/crates/smtp/src/reporting/mod.rs index db313d3b..a9df44f4 100644 --- a/crates/smtp/src/reporting/mod.rs +++ b/crates/smtp/src/reporting/mod.rs @@ -25,7 +25,7 @@ use tokio::io::{AsyncRead, AsyncWrite}; use crate::{ core::Session, inbound::DkimSign, - queue::{DomainPart, Message, MessageSource, spool::SmtpSpool}, + queue::{DomainPart, FROM_REPORT, Message, MessageSource, spool::SmtpSpool}, }; pub mod analysis; @@ -149,6 +149,7 @@ impl SmtpReporting for Server { } // Queue message + message.flags |= FROM_REPORT; message .queue( signature.as_deref(),