/* * SPDX-FileCopyrightText: 2026 Coffey Labs LLC * * SPDX-License-Identifier: AGPL-3.0-only */ //! inbuxa: a server-built message, always DKIM-signed (scheduled-reports //! spec, RP-14). Unlike `send_autogenerated`, a message that can't be signed //! isn't sent, and the caller hears why. use crate::queue::{ MessageSource, spool::{QueueParams, SmtpSpool}, }; use common::Server; /// Queues `raw` from `from` to `rcpts`, signed with `sign_domain`'s keys. pub async fn send_signed( server: &Server, from: &str, rcpts: &[String], raw: &[u8], sign_domain: &str, ) -> Result<(), String> { let signers = match server.dkim_signers(sign_domain).await { Ok(Some(signers)) => signers, Ok(None) => return Err(format!("{sign_domain} has no DKIM key to sign with.")), Err(err) => { trc::error!(err.details("Failed to retrieve DKIM signers for a report")); return Err(format!("The DKIM keys for {sign_domain} couldn't be read.")); } }; let mut message = server.new_message(from, MessageSource::Autogenerated, 0); for rcpt in rcpts { message.add_expanded_recipient(rcpt, server).await; } if message .queue(QueueParams::new(raw, 0, server).with_dkim_signers(Some(signers))) .await { Ok(()) } else { Err("The mail queue didn't accept the message.".into()) } }