Loop through all recipients

This commit is contained in:
Gonne 2025-03-11 09:12:09 +01:00 committed by Dennis Frieberg
parent f4650b2afc
commit ac90301e36
Signed by: nerf
SSH key fingerprint: SHA256:zvrU0EwwaNK65M+AqL9IOTRawFq0JZ8QXBASxxGpxmg

View file

@ -133,27 +133,28 @@ where
/// ///
/// Addresses are sorted according to the order on `OrdEmailAddress`. /// Addresses are sorted according to the order on `OrdEmailAddress`.
pub fn generate_sieve_script(redirects: AliasMap) -> String { pub fn generate_sieve_script(redirects: AliasMap) -> String {
let mut script: String = "require [\"envelope\", \"copy\"];\n\n".to_string(); let mut script: String =
"require [\"variables\", \"copy\", \"vnd.stalwart.expressions\", \"envelope\"];\n\n"
.to_string();
for (redirect, mut destinations) in redirects { for (redirect, mut destinations) in redirects {
script += format!("if envelope :is \"to\" \"{}\" {{\n{}}}\n", redirect.0, { script += format!(
let mut subscript: String = String::new(); // inspired by https://github.com/stalwartlabs/mail-server/issues/916#issuecomment-2474844389
destinations.sort(); "if eval \"contains_ignore_case(envelope.to, '{}')\" {{\n{}}}\n",
for destination in destinations.iter().rev().skip(1).rev() { redirect.0,
subscript += format!(" redirect :copy \"{}\";\n", destination.0).as_str(); {
let mut subscript: String = String::new();
destinations.sort();
for destination in destinations.iter() {
subscript += format!(" redirect :copy \"{}\";\n", destination.0).as_str();
}
subscript
} }
subscript )
+ format!(
" redirect \"{}\";\n",
destinations.iter().next_back().unwrap().0
)
.as_str()
})
.as_str(); .as_str();
} }
script script
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
@ -173,11 +174,12 @@ mod tests {
let result = parse_alias_to_map(vec![AliasFile { let result = parse_alias_to_map(vec![AliasFile {
content: read_lines("testdata/simple.aliases").unwrap(), content: read_lines("testdata/simple.aliases").unwrap(),
default_domain: FQDN::from_str("example.com").unwrap(), default_domain: FQDN::from_str("example.com").unwrap(),
}]).unwrap(); }])
.unwrap();
assert_eq!(result.len(), 4); assert_eq!(result.len(), 4);
for redirects in result.iter() { for redirects in result.iter() {
assert_eq!(redirects.1[0].0.to_string(), "me@example.org"); assert_eq!(redirects.1[0].0.to_string(), "me@example.org");
} }
} }
} }