E-mails filtern mit dovecot-sieve

Aus
Die druckbare Version wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.
Emails auf dem Server mit dovecot-sieve filtern

Basierend auf diesem Thread im Forum wollte ich mir auch mal die Email Filter auf dem Server ausprobieren. Danke @ Purzel :-D ;-)

Purzel hat seine Beschreibung aber für die alten Versionen der Firmware geschrieben. Dort gab es noch keine Mailstation und damit Postfix und Dovecot von Synology. Mit der Mailstation in der heutigen Firmware müssten einige Dinge anders gemacht werden

What's that?

Mit dem dovecot-sieve wird es möglich Filter (mit regulären Ausdrücken) auf Emails am Dovecot anzusetzen. Damit wird es möglich eingehende Emails auf dem IMAP Server in definierte Verzeichnisse zu verschieben oder gleich zu löschen (vorteilhaft im Zusammenspiel mit einem Spamassassin auf der DS). Grundsätzlich läuft das "Sieb" am IMAP Server. Da aber Dovecot ein sogenannter LDA (Local Delivery Agent) ist, kann man auch den Postfix (SMTP) Server dazu bringen seine Emails (direkt an die DS gesendet) nicht mehr direkt in die Mailboxen einzustellen, sondern die Emails zur Einstellung in die Mailboxen an Dovecot zu übergeben. Damit sind auch die Emails am SMTP Port im Filterprozess. Dazu muss aber auf der DS (zumindest für Dovecot von Synology) noch der lokale Zustellprozess (deliver) aus den Quellen von Dovecot kompiliert werden. Das ist einer der Unterschiede zur Beschreibung von Purzel, da sich seine Beschreibung auf den ipkg-Dovecot bezieht. Im Folgenden soll es um diese Unterschiede gehen. Also Purzels Post zusammen mit den hier gezeigten Unterschieden sollte Euch zum Ziel führen ;-)

Voraussetzungen

Als Grundvoraussetzung gilt das gleiche wie für ipkg Pakete, obwohl wir für Dovecot-Sieve kein Paket aus ipkg installieren müssen

 * ipkg für die jeweilige Prozessorarchitektur ist installiert
 * Zugriff auf die Shell Konsole via telnet oder ssh als root
 * Texteditor mit korrekten UNIX-Zeilenendzeichen (\n und nicht \r\n): z.B. vi oder nano

Zusätzlich müssen suf der DS noch ein C-Compiler, die Development-Tools und die DB Library installiert werden, bevor mit der Arbeit an Dovecot-Sieve begonnen werden kann $ ipkg update
$ ipkg install gcc
$ ipkg install optware-devel
$ ipkg install libdb
Wenn das Paket gcc nicht existiert dann kann man versuchen den Compiler via cross-native einzuspielen (falls vorhanden). Sollte sich kein Compiler einspielen lassen, dann kann man dieses Sieb leider nicht verwenden! Desweiteren werden die Quellcodes von Deovecot und auch Dovecot-Sieve benötigt. Dabei ist es wichtig die korrekten Versionen zu verwenden, welche Purzel in seinem Post angegeben hat $ cd /volume1/public
$ wget http://www.dovecot.org/releases/1.0/dovecot-1.0.15.tar.gz
$ wget http://www.dovecot.org/releases/sieve/dovecot-sieve-1.0.3.tar.gz
$ gzip -d ./dovecot-1.0.15.tar.gz
$ tar xfv ./dovecot-1.0.15.tar
$ gzip -d ./dovecot-sieve-1.0.3.tar.gz
$ tar xfv ./dovecot-sieve-1.0.3.tar

Installation

Bei der Installation ist folgendes wichtig: Sowohl dovecot als auch dovecot-sieve müssen erstellt werden.

Dabei ist wichtig, dass nur die Befehle configure und make, ABER kein make install gemacht werden!!!

Dovecot kompilieren

Dovecot-Sieve erwartet den kompletten Quellcode von Dovecot. Da Dovecot aber auf der DS nicht komplett vorhanden ist, muss man zuerst Dovecot aus den Quellen "erstellen". (wichtig: kein make install machen) $ cd /volume1/public/dovecot-1.0.15
$ ./configure && make
Obiger Code wird Dovecot so vorbereiten, dass dovecot-sieve damit arbeiten kann http://www.synology-forum.de/showthread.html?t=11137&page=4

Dovecot-Sieve installieren

Nachdem der Dovecot vorbereitet wurde, kann man an die eigentliche Installation von dem Sieb gehen. Auch hierbei darf kein **make install** gemacht werden $ cd /volume1/public/dovecot-sieve-1.0.3
$ ./configure --with-dovecot=../dovecot-1.0.15
$ make
Diese Code erstellt alle benötigten Module, welche dann an die korrekten Orte kopiert werden müssen.

Module kopieren

In Purzels Post kopiert er die Dateien in eine Dovecot Installation einer ipkg Version. Mit der Default Mailstation der Synology Firmware müssen andere Verzeichnisse gewählt werden, die ich im folgenden erwähnen möchte. Die ersten 4 Dateien liegen unter src/.libs/ im Dovecot-Sieve-Verzeichnis. Das Ziel muss zuerst erstellt werden, damit es in die Struktur der Firmware passt

$ mkdir -p /lib/dovecot/lda

Damit kann man die Zielverzeichnisse dann mit den Modulen nutzen

lib90_cmusieve_plugin.la  -> /lib/dovecot/<br />
lib90_cmusieve_plugin.lai -> /lib/dovecot/lda/<br />
lib90_cmusieve_plugin.a   -> /lib/dovecot/lda/<br />
lib90_cmusieve_plugin.la  -> /lib/dovecot/lda/<br />
lib90_cmusieve_plugin.so  -> /lib/dovecot/lda/<br />

Die folgenden zwei Dateien liegen in **src/libsieve/** des Dovecot-Sieve-Verzeichnisses. Deren Zielverzeichnisse existieren bereits. sievec -> /usr/syno/mailstation/libexec/dovecot/
sieved -> /usr/syno/mailstation/libexec/dovecot/

Local Delivery Agent kompilieren

Dieser Punkt kommt bei Purzels Beschreibung nicht vor, da der LDA bei der ipkg-Version bereits vorhanden ist. Unter dovecot heisst das Teil deliver. Dieses ist leider bei der Mailstation nicht mit dabei. Der LDA hat die Aufgabe die Emails entgegenzunehmen und dann unter Berücksichtigung der Filter in die Mailboxen zu schreiben. Per default schreiben sowohl Postfix als auch Dovecot direkt in die Mailboxen der User. $ cd /volume1/public/dovecot-1.0.15/src/deliver
$ make install deliver
Nun gibt es im Verzeichnis eine Datei Namens deliver, welche man noch an die korrekte Position kopieren muss $ cp ./deliver /usr/syno/mailstation/libexec/dovecot Jetzt erwartet der deliver-Befehl die Konfigurationsdatei von dovecot leider unter /usr/local/etc. Um das zu "beheben" kann man einen Softlink auf die Konfig-Datei anlegen $ ln -s /usr/syno/mailstation/etc/dovecot.conf /usr/local/etc/dovecot.conf

Konfiguration

Dovecot

Damit auch der Dovecot weiss, dass die Filter benutzt werden solle muss dessen Konfiguration angepasst werden. Öffnet dazu die Datei /usr/syno/mailstation/etc/dovecot.conf und sucht den String protocol lda

<code style="margin:20px;">
protocol lda {
  # Address to use when sending rejection mails.
  postmaster_address = ich@du.tld

  # Hostname to use in various parts of sent mails, eg. in Message-Id.
  # Default is the system's real hostname.
  hostname = ich.du.tld

  # Support for dynamically loadable plugins. mail_plugins is a space separated
  # list of plugins to load.
   mail_plugins = cmusieve
   mail_plugin_dir = /usr/lib/dovecot/lda

  # If user is over quota, return with temporary failure instead of
  # bouncing the mail.
  #quota_full_tempfail = no

  # Format to use for logging mail deliveries. You can use variables:
  #  %$ - Delivery status message (e.g. "saved to INBOX")
  #  %m - Message-ID
  #  %s - Subject
  #  %f - From address
  #deliver_log_format = msgid=%m: %$

  # Binary to use for sending mails.
  #sendmail_path = /usr/lib/sendmail

  # Human readable error message for rejection mails. Use can use variables:
  #  %n = CRLF, %r = reason, %s = subject, %t = recipient
  #rejection_reason = Your message to <%t> was automatically rejected:%n%r

  # UNIX socket path to master authentication server to find users.
  #auth_socket_path = /var/run/dovecot/auth-master
}
</code>

Achtet Euch darauf, dass ihr sowohl das Kommentarzeichen ('**#**') vor **protocol_lda** und dasjenige vor der schliessenden Klammer ('**}**') entfernt. Sonst crashed Dovecot beim booten. Dann die Datei speichern.

Filter beim Einsammeln der Emails anwenden

Damit überhaupt der LDA involviert wird, wenn die Emails von externen Account abgerufen werden, müssen die dem Konto entsprechenden rc-Files angepasst werden. Im Normalzustand werden die Emails auch von Dovecot direkt in die Mailbox geschrieben. So kann man Dovecot anweisen (im entsprechenden rc-File) den LDA zu verwenden [destination] type = MDA_external path = /usr/syno/mailstation/libexec/dovecot/deliver arguments = ("-e", ) Wenn ihr virtuelle Emailbenutzer verwenden wollt, dann solltet ihr mal die **Diskussion unten auf der Seite** anschauen

Postfix

Damit der Postfix Server auch weiss, dass er die Emails nicht direkt in die Mailboxen stellen soll, sondern einem weiteren Agent übergeben muss, reicht eine einfache Anweisung in der **main.cf** des Postfix Servers. Öffnet diese Datei und sucht nach **mailbox_command =** und setzt den Wert auf mailbox_command = /usr/syno/mailstation/libexec/dovecot/deliver Datei speichern und Postfix neustarten

Sieb File einrichten

Damit überhaupt Aktionen ausgeführt werden können wenn Emails an den LDA übergeben werden, braucht es im Homeverzeichnis von jedem User, der gefiltert werden soll, eine Datei Namens **.dovecot.sieve** Diese Datei legt die regulären Ausdrücke und die Aktionen fest. Im folgenden Beispiel werden von Spamassassin markierte Emails direkt in den Papierkorb verschoben und die Emails vom Synology Forum in einen speziellen Ordner geschrieben. Das else keep; sorgt dafür, dass die Email im Posteingang bleibt wenn keine Regel zutrifft require "fileinto"; if header :comparator "i;ascii-casemap" :contains "subject" "*****SPAM*****" {

 fileinto "Trash";
 stop;

} elsif header :comparator "i;ascii-casemap" :contains "from" "info@synology-forum.de" {

  fileinto "INBOX.Computer &- Security.Foren.Synology";
  stop;

} else {

  keep;

} Wichtig dabei ist, dass die Regeln alle in **einem einzigen** if/elsif/else-Konstrukt untergebracht sind. Sonst passiert es schnell, dass die Emails doppelt vorkommen (einmal im Posteingang und einmal im Folder). Es werden zudem Verkettungen von Bedingungen mithilfe von Operatoren unterstützt, um komplexere Regeln zu erstellen. Zuerstmal am Besipiel des **oder**-Operators if anyof(header :comparator "i;ascii-casemap" :contains "from" "info@synology-forum.de",header :comparator "i;ascii-casemap" :contains "subject" "Your Support Request") {

  fileinto "INBOX.Computer &- Security.Foren.Synology";
  stop;

Und jetzt mit einem **und**-Operator if allof(header :comparator "i;ascii-casemap" :contains "from" "info@synology-forum.de",header :comparator "i;ascii-casemap" :contains "subject" "Your Support Request") {

  fileinto "INBOX.Computer &- Security.Foren.Synology";
  stop;

Die Syntax bei den "Zielen" ist genau gleich wie die Dateien/Verzeichnisse im Dateisystem (unter ~/.Maildir) heissen. Bei den obigen zwei Beispielen wäre das Ziel im Dateisystem also ~/.Maildir/.INBOX.Computer &- Security.Foren.Synology