E-Mails ausfiltern

Betriebssystem: Debian 10, Devuan ascii

Sieve ist eine universelle Filtersprache und ein gleichnamiges Programm zum Aussieben und Weiterleiten von E-Mail. Es kann von der Rolle her zu den Mail Delivery Agents (MDA) gerechnet werden. In unserem Szenario ist es dazu gedacht, eine bestehende Dovecot-Konfiguration zu erweitern.

HINWEIS: Mit alias gg='grep -v '\''^\s*#\|^$'\''' lässt sich ein netter Alias definieren, der alle Kommentare und Leerzeilen aus den Configs entfernt. Er findet in diesem Dokument immer einmal Verwendung.

Mailfilter sieve

Die Installation ist schnell erledigt, wie wir dabei sehen, bringt es für Dovecot 2 Konfigurationsdateien mit (/etc/dovecot/conf.d/90-sieve.conf, /etc/dovecot/conf.d/90-sieve-extprograms.conf):

root@mailsrv:~# apt-get install dovecot-sieve
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.
Statusinformationen werden eingelesen.... Fertig
Die folgenden NEUEN Pakete werden installiert:
dovecot-sieve
0 aktualisiert, 1 neu installiert, 0 zu entfernen und 42 nicht aktualisiert.
Es müssen 971 kB an Archiven heruntergeladen werden.
Nach dieser Operation werden 1.758 kB Plattenplatz zusätzlich benutzt.
Holen:1 http://deb.devuan.org//merged ascii/main amd64 dovecot-sieve amd64 1:2.2.27-3+deb9u5 [971 kB]
Es wurden 971 kB in 1 s geholt (887 kB/s).
Vormals nicht ausgewähltes Paket dovecot-sieve wird gewählt.
(Lese Datenbank ... 29796 Dateien und Verzeichnisse sind derzeit installiert.)
Vorbereitung zum Entpacken von .../dovecot-sieve_1%3a2.2.27-3+deb9u5_amd64.deb ...
Entpacken von dovecot-sieve (1:2.2.27-3+deb9u5) ...
Trigger für dovecot-core (1:2.2.27-3+deb9u5) werden verarbeitet ...
[ ok ] Restarting IMAP/POP3 mail server: dovecot.
dovecot-sieve (1:2.2.27-3+deb9u5) wird eingerichtet ...

Creating config file /etc/dovecot/conf.d/90-sieve.conf with new version

Creating config file /etc/dovecot/conf.d/90-sieve-extprograms.conf with new version
Trigger für man-db (2.7.6.1-2) werden verarbeitet ...
Trigger für dovecot-core (1:2.2.27-3+deb9u5) werden verarbeitet ...
[ ok ] Restarting IMAP/POP3 mail server: dovecot.
root@mailsrv:~#

Konfiguration Dovecot

Zur Einbindung von Sieve ändern wir nun die bestehende Konfiguration des Mail Access Agenten (MAA) namens ‚Dovecot‘. Dabei aktivieren wir die Zeile 47 und ergänzen sie um das Wörtchen ‚sieve‘:

root@mailsrv:~# cd /etc/dovecot/conf.d/
root@mailsrv:/etc/dovecot/conf.d#
root@mailsrv:/etc/dovecot/conf.d# vi 15-lda.conf

root@mailsrv:/etc/dovecot/conf.d# gg 15-lda.conf
protocol lda {
mail_plugins = $mail_plugins sieve
}
root@mailsrv:/etc/dovecot/conf.d#

Prüfen, in welche Dateien die Filterausdrücke geschrieben werden können:

root@mailsrv:/etc/dovecot/conf.d# gg 90-sieve.conf
plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve
}
root@mailsrv:/etc/dovecot/conf.d#
root@mailsrv:/etc/dovecot/conf.d# cd
root@mailsrv:~#

Mit der Kommandozeile service dovecot restart lesen wir nun die geänderte Konfiguration neu ein.

Konfiguration Postfix

Damit sieve-Skripte abgearbeitet werden können, muss der Aufruf des Filterprogrammes VOR den weiteren Auslieferungmechanismen in die Postfix-Konfigurationsdatei /etc/postfix/main.cf eingebunden werden (Direktive mailbox_command = /usr/lib/dovecot/deliver).

HINWEIS: Die Postfix-Direktive home_mailbox wird damit nicht mehr benötigt, weil Sieve als vorgeschaltetes Filter via Local Delivery Agent (lda) von Postfix beauftragt wird, die Daten an Dovecot weiterzureichen, welcher mittels mail_location = maildir:~/.maildir den letztlich zu verwendenden Ablageort kennt.

Zuerst erforschen wir, um welche Dateitypen es sich hierbei handelt:

root@mailsrv:~# file /usr/lib/dovecot/deliver
/usr/lib/dovecot/deliver: symbolic link to dovecot-lda
root@mailsrv:~#
root@mailsrv:~# file /usr/lib/dovecot/dovecot-lda
/usr/lib/dovecot/dovecot-lda: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=8c4ceb82dfb8af2a3b73c244be71a2e9f32c3522, stripped
root@mailsrv:~#

Letzteres ist das eigentliche Filterprogramm, das als Local Delivery Agent (LDA) agiert.

Und nun zum Einbinden von Sieve in Postfix. Wir editieren die Hauptkonfigurationsdatei, kommentieren wie beschrieben ‚home_mailbox‘ aus und aktivieren dafür ‚mailbox_command‘, wobei wir hier als Wert eben dieses Filterprogramm angeben:

root@mailsrv:~# vi /etc/postfix/main.cf
root@mailsrv:~#
root@mailsrv:~# tail -2 /etc/postfix/main.cf
#home_mailbox = .maildir/
mailbox_command = /usr/lib/dovecot/deliver
root@mailsrv:~#
root@mailsrv:~# postfix reload
postfix/postfix-script: refreshing the Postfix mail system
root@mailsrv:~#

Zusammenfassung der wichtigen Einstellungen

  1. DOVECOT: In Datei 15-lda.conf die Zeichenkette ‚sieve‘ ans Ende der ‚mail_plugins‘ setzen:

root@dsrv:~# grep -v '^\s*#\|^$' /etc/dovecot/conf.d/15-lda.conf
protocol lda {
mail_plugins = $mail_plugins sieve
}
root@dsrv:~# service dovecot restart

b) POSTFIX: /etc/postfix/main.cf: ‚home_mailbox‘ auskommentieren, danach mailbox_command = /usr/lib/dovecot/deliver zur Config hinzufügen:

root@dsrv:~# postconf -e 'home_mailbox ='
root@dsrv:~# postconf -e 'mailbox_command = /usr/lib/dovecot/deliver'
root@dsrv:~# service postfix restart
[ ok ] Stopping Postfix Mail Transport Agent: postfix.
[ ok ] Starting Postfix Mail Transport Agent: postfix.
root@dsrv:~#

Sieve-Filter schreiben

Als normaler Nutzer erstellen wir nun die Datei ~/.dovecot.sieve und geben ihr folgenden Inhalt:

# /home/tux/.dovecot.sieve
require "fileinto";
if header :contains "subject" ["Bewerbung", "application"] {
redirect "chef@dom1.test";
keep;
}

Erste Tests

Am besten wir legen dazu einen speziellen Nutzer an und führen folgendes aus:

root@mailsrv:~# useradd -m -s /bin/bash chef
root@mailsrv:~#
root@mailsrv:~# ls -la /home/chef/
insgesamt 20
drwxr-xr-x 2 chef chef 4096 Okt 10 21:43 .
drwxr-xr-x 6 root root 4096 Okt 10 21:43 ..
-rw-r--r-- 1 chef chef  220 Mai 15  2017 .bash_logout
-rw-r--r-- 1 chef chef 3526 Mai 15  2017 .bashrc
-rw-r--r-- 1 chef chef  675 Mai 15  2017 .profile
root@mailsrv:~#
root@mailsrv:~# echo Bewirb Dich bitte. | mail -s Bewerbung tux@dom1.test
root@mailsrv:~#
root@mailsrv:~# find /home -cmin 1
/home/chef
/home/chef/.maildir
/home/chef/.maildir/dovecot.index.log
/home/chef/.maildir/dovecot-uidlist
/home/chef/.maildir/tmp
/home/chef/.maildir/new
/home/chef/.maildir/new/1570736676.M824314P7103.mailsrv,S=757,W=778
/home/chef/.maildir/dovecot-uidvalidity.5d9f8a24
/home/chef/.maildir/cur
/home/chef/.maildir/dovecot-uidvalidity
/home/chef/.maildir/dovecot.index.cache
/home/tux
/home/tux/.dovecot.svbin
/home/tux/.maildir
/home/tux/.maildir/dovecot.index.log
/home/tux/.maildir/dovecot-uidlist
/home/tux/.maildir/tmp
/home/tux/.maildir/new
/home/tux/.maildir/new/1570736676.M451790P7099.mailsrv,S=494,W=509
/home/tux/.maildir/dovecot.index.cache
/home/tux/.dovecot.lda-dupes
root@mailsrv:~#
root@mailsrv:~#
root@mailsrv:~# grep Bewerbung /home/tux/.maildir/new/1570736676.M451790P7099.mailsrv\,S\=494\,W\=509
Subject: Bewerbung
root@mailsrv:~#
root@mailsrv:~# grep Bewerbung /home/chef/.maildir/new/1570736676.M824314P7103.mailsrv\,S\=757\,W\=778
Subject: Bewerbung
root@mailsrv:~#
root@mailsrv:~# ### >>> Genau, beide haben die Mail erhalten.

Und hier ist eine beispielhafte ‚vacation‘-Definition:

require ["vacation"];
vacation
# Max. 1x täglich automatisch antworten
:days 1
:subject "Grüße aus dem Urlaub"
"Leider bin ich unterwegs... im Dschungelbuch der Abgründe...!";

LPI-relevant ist z.B. auch allof und anyof: https://www.linux-magazin.de/ausgaben/2007/06/ausgesiebt/

Mailfilter procmail

Vorrangiges Ziel: Mails mit procmail filtern

Literatur:

ACHTUNG: Je nach Distribution wird eine Datei ‚~/.procmailrc‘ bzw. ‚/etc/procmailrc‘ gesucht, falls das nicht funktioniert, muss evl. ein Einbindung via ‚~/.forward‘ geschehen:

"|/usr/bin/procmail"

Gemäß dem Tutorial in letzteren Link legen wir die Verzeichnisse ‚~/Mail‘ und ‚~/.Procmail‘ an und befüllen unsere ‚~/.procmailrc‘ mit folgendem Inhalt:

VERBOSE=yes
LOGABSTRACT=all
MAILDIR=$HOME/Mail
PROCMAILDIR=$HOME/.Procmail
LOGFILE=$PROCMAILDIR/log

# Ein erstes Rezept, durch den endenden Slash erhalten wir einen Ordner 'incoming'
# mit E-Mails im maildir-Format:
:0
*
incoming/

Nach dem Senden der ersten Nachricht mit echo Inhalt1 | mail -s procTest1 tux@localhost (am besten gleich als root) erhalten wir:

procmail: Match on ""
procmail: Assigning "LASTFOLDER=incoming/new/1480674604.25156_0.jessie"
procmail: Notified comsat: "tux@0:/home/tux/Mail/incoming/new/1480674604.25156_0.jessie"
From root@jessie.dom.test  Fri Dec  2 11:30:04 2016
Subject: procTest3
Folder: incoming/new/1480674604.25156_0.jessie          379

Wir erweitern die Datei um ein weiteres Rezept, das wir dem ersten voranstellen und testen wieder:

# Rezept 2
:0
* ^Subject:.*Wichtig
wichtig

AUFGABE: Bitte ein neues Rezept schreiben, das folgendes realisiert:

  • alle Nachrichten mit ‚wichtig‘ im Betreff in den Mailboxordner ‚wichtig‘ kopiert und zugleich

  • alle Nachrichten an den Nutzer moritz@localhost weiterleitet

Die Lösung lautet:

:0
* ^Subject:.*wichtig
{
:0 c
wichtig

:0
! moritz@localhost
}