====== Exim4 - Sieve Filter ====== Exim4 Sieve filter. The filter contains an automatic response and a forwarding. router userforward: driver = redirect allow_filter user = mail group = mail file = /var/vmail/${domain}/${local_part}/${if exists{/var/vmail/${domain}/${local_part}/active_script}{active_script{}}}{forward}} no_verify no_expn check_ancestor file_transport = local_delivery pipe_transport = address_pipe reply_transport = address_reply condition = ${if exists{/var/vmail/${domain}/${local_part}/forward}{yes}{${if exists{/var/vmail/${domain}/${local_part}/active_script}{yes}{no}}}} Transport local_delivery: driver = appendfile check_string = "" delivery_date_add directory = /var/vmail/${domain}/${local_part}/${sg{${sg{/${address_file}}{/+}{.}}}{(?i)^.inbox}{}} directory_mode = 770 envelope_to_add group = mail maildir_format maildir_tag = ,S=$message_size message_prefix = "" message_suffix = "" mode = 0660 active_script # Sieve filter require ["fileinto", "copy", "vacation"] ; #begin = forward = #data=1~dGlub0BuYXVtaXguZGU= redirect :copy "copy@domain.tld"; #end = forward = #begin = autoresponder = #data=1~YXV0b3Jlc3BvbmQAZGFzIGlzdCBlaW5lIGF1dG9tYXRpc2NoZSBtYWls vacation :days 1 :subject "Automatic Mail" "This is automatic Mail"; #end = autoresponder = or # Sieve filter require ["fileinto", "copy", "vacation"] ; #begin = forward = #data=1~bmF1bWl4QGdteC5kZA== redirect :copy "test@domain.de"; #end = forward = #begin = autoresponder = #data=1~VGVzdC1CZXRyZWZmAFRlc3QtVGV4dQ== vacation :days 1 :subject "Test-Betreff" "Test-Text"; #end = autoresponder = #begin = filters = #sieve filter #sieve_filter:1;0;2;Test;3;INBOX.Trash if header :contains ["Subject"] "Test" { fileinto "INBOX.Trash" ; stop ; } #end sieve filter #end = filters = keep ; ===== Another approach ===== Should you want to use Exim's Sieve support there are three main caveats: * Sieve files accessed from redirect routers need to be readable by the uid of the process that handles the SMTP connection, (e.g. Debian-exim) * While the [[http://tools.ietf.org/html/rfc5228|Sieve RFC]] specifies that files use CRLF as linebreaks, Exim filters usually require the use of LF only. * Exim requires that sieve filter files identify themselves with "# Sieve filter" which is not part of the Sieve spec. ACTIVE_SIEVE = /var/lib/sieve/${domain}/${local_part}/active VACATION_DIR = /var/lib/sieve/${domain}/${local_part}/vacation VDOM_MAILDIR = /var/vmail/${domain}/${local_part} The following router is installed to /etc/exim4/conf.d/router/350_local_sieve vdom_sieve: debug_print = "R: vdom_sieve for $local_part@$domain" driver = redirect domains = +local_domains require_files = ACTIVE_SIEVE no_verify no_expn check_ancestor allow_filter = true local_part_suffix = +* : -* local_part_suffix_optional data = "#Sieve filter\n${sg{${readfile{ACTIVE_SIEVE}}}{\r}{}}" sieve_useraddress = "$local_part" sieve_subaddress = "${sg{$local_part_suffix}{^.}{}}" sieve_vacation_directory = VACATION_DIR pipe_transport = address_pipe reply_transport = address_reply file_transport = vdom_sieve_file Note, the redirect router allows either "+" or "-" as a suffix, which may need to be tweaked depending on site requirements. /etc/exim4/conf.d/transport/40_local_sieve vdom_sieve_file: debug_print = "T: vdom_sieve_file for $local_part@$domain ($address_file)" driver = appendfile delivery_date_add envelope_to_add return_path_add directory = VDOM_MAILDIR/${sg {.${sg {$address_file}{/}{.}}/} \ {^.(INBOX|inbox)/} {}} maildir_format = true user = vmail group = vmail Note: The directory line might need a little fixing to fully support Maildir, but currently it replaces "/" characters with dots and assumes "inbox" as the user maildir root. ===== References ===== http://www.exim.org/exim-html-current/doc/html/spec_html/filter_ch02.html https://debian-administration.org/users/lee/weblog/43 https://github.com/Exim/exim/blob/master/doc/doc-txt/README.SIEVE https://tty1.net/blog/2011/sieve-tutorial_en.html