diff --git a/src/lib.rs b/src/lib.rs index 1cb6577..164c62d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -133,27 +133,26 @@ where /// /// Addresses are sorted according to the order on `OrdEmailAddress`. 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\"];\n\n".to_string(); for (redirect, mut destinations) in redirects { - script += format!("if envelope :is \"to\" \"{}\" {{\n{}}}\n", redirect.0, { - let mut subscript: String = String::new(); - destinations.sort(); - for destination in destinations.iter().rev().skip(1).rev() { - subscript += format!(" redirect :copy \"{}\";\n", destination.0).as_str(); + script += format!( + "if eval \"contains(recipients, '{}')\" {{\n{}}}\n", + redirect.0, + { + 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(); } + script += "discard;"; script } - #[cfg(test)] mod tests { use super::*; @@ -173,11 +172,12 @@ mod tests { let result = parse_alias_to_map(vec![AliasFile { content: read_lines("testdata/simple.aliases").unwrap(), default_domain: FQDN::from_str("example.com").unwrap(), - }]).unwrap(); + }]) + .unwrap(); assert_eq!(result.len(), 4); for redirects in result.iter() { assert_eq!(redirects.1[0].0.to_string(), "me@example.org"); } } -} \ No newline at end of file +}