nixConfig/packages/alias-to-sieve
2025-04-08 09:50:20 +02:00
..
src Disallow apostrophies in mail addresses of alias files 2025-04-07 15:20:03 +00:00
testdata Disallow apostrophies in mail addresses of alias files 2025-04-07 15:20:03 +00:00
Cargo.lock cargo update 2025-04-07 20:29:25 +00:00
Cargo.toml Documentation and usage example for sieve script 2025-04-08 09:50:20 +02:00
README.md Documentation and usage example for sieve script 2025-04-08 09:50:20 +02:00

This script converts an alias file to a sieve script for stalwart-mail.

Usage

Given an alias file testdata/simple.aliases that contains lines of redirects of the form localpart with optional @fqdn followed by a space followed by a list (space or comma+space separated) list of destinations that consist of a localpart and optionally an @fqdn. If you don't define a fqdn along any of the addresses, the default domain from your commandline input will be appended.

An example using the testdata directory of this repository:

$ ./alias_to_sieve testdata/simple.aliases example.com
require ["variables", "copy", "vnd.stalwart.expressions", "envelope", "editheader"];

let "i" "0";
while "i < count(envelope.to)" {
  let "redirected" "false";
  if eval "eq_ignore_case(envelope.to[i], 'admin@example.com')" {
    addheader "Delivered-To" "admin@example.com";
    redirect :copy "me@example.org";

    deleteheader :index 1 :is "Delivered-To" "admin@example.com";
    let "redirected" "true";
  }
  if eval "eq_ignore_case(envelope.to[i], 'postmaster@example.com')" {
    addheader "Delivered-To" "postmaster@example.com";
    redirect :copy "me@example.org";

    deleteheader :index 1 :is "Delivered-To" "postmaster@example.com";
    let "redirected" "true";
  }
  if eval "eq_ignore_case(envelope.to[i], 'root@example.com')" {
    addheader "Delivered-To" "root@example.com";
    redirect :copy "me@example.org";

    deleteheader :index 1 :is "Delivered-To" "root@example.com";
    let "redirected" "true";
  }
  if eval "eq_ignore_case(envelope.to[i], 'sudo@example.com')" {
    addheader "Delivered-To" "sudo@example.com";
    redirect :copy "me@example.org";

    deleteheader :index 1 :is "Delivered-To" "sudo@example.com";
    let "redirected" "true";
  }
  if eval "!redirected" {
    let "destination" "envelope.to[i]";
    redirect :copy "${destination}";
  }
  let "i" "i+1";
}
discard;

Limitations

You cannot use apostrophes (') in any mail addresses although allowed by RFC 5322 since they would break termination of strings in sieve.

This parser is not designed with security in mind. While the above gives some basic protection against code injection, I have no idea whether sieve has other pitfalls that might allow them.

This is my first rust project, consume the code with care.

The generated code is specific to stalwart-mail and contains non-standard sieve features.