# Vorwort
Plesk liefert leider nur sehr wenige Infos bzgl. der API der MailHandler von
Postfix/QMail.
Dieses doch sehr maechtige Werkzeug erlaubt es, eigene Funktionen auf die
E-Mails vor der Verteilung anzuwenden. In unserem Fall haben wir damit den
Umstand geloest, dass David auf das X-Delivered-To feld im Mailheader
zugreift, welches jedoch im Standard nicht existiert.
Daher werde ich erklaeren wie man die Handler dazu verwenden kann, die Mails
zu bearbeiten.

# Aufbau Mailhandler
Der Mailhandler selber ist ein einfaches Script, welches Aufgerufen wird. Es
kann sich dabei um jegliche Art von Script oder Programm handeln. (Unser
erster versuch war z.B. ein Simples PHP-Script.) Das Script wird dann vom
Mailserver aufgerufen und uebergibt einige Daten als Parameter und die Mail
selber im STDIN (vom Programm aus gesehen).
Der Handler kann nun die Mail behandeln und entscheiden was damit geschehen
soll. Dazu kann das Script verschiedene Befehle an den Server zurueck geben.
Dies geschieht ueber den STDERR. Welche Befehle man verwenden kann werde ich
spaeter erklaeren.
Ueber den STDOUT des Programmes wird dann die E-Mail wieder an den Maildienst
zurueck gegeben und dieser verarbeitet sie dann so weiter. Es ist also wichtig,
dass das Script eine ausgabe macht.

# Registrierung eines Mailhandlers
Damit der Mailserver den Handler verwenden kann, muss man diesen fuer Plesk
bekannt machen. Dies geschieht mit dem Befehl mailmng --add-handler.
Der Befehl hat folgende Parameter:

--handler-name arg Ein Name fuer den Handler. Dieser dient nur zur
eindeutigekeit

--handler-type arg Der Handlertyp, auf was der Handler angesetzt wird.
Folgende Argumente sind moeglich:
global Jede E-Mail
sender Nur bei einem bestimmten Sender
recipient Nur bei einem bestimmten Empfaenger
sender-domain Bei einer bestimmten Sender-Domain
recipient-domain Bei einer bestimmten Empfaenger-Domain

--handler-type-name arg Der Handlertyp-Name ist fuer den vorigen Typen bestimmt.
So muss man dann hier die jeweilige Domain oder Mail-
Adresse angeben. Ist nicht notwendig bei "global".

--executable arg Hier wird angegeben, wo das Programm liegt, welches
aufgerufen werden soll.

--context arg Der Context ist eine Zeichenkette, die als erster
Parameter im Programm angegeben wird. Dies kann
nuetzlich sein, wenn man fuer mehrere Aufgaben ein
einziges Programm benutzt.

--hook arg Der Punkt an dem das Script angesetzt werden soll.
Folgende Werte sind moeglich:
before-queue Bevor die Mail in die Queue kommt
before-local Bevor die Mail in das Postfach kommt
before-remote Bevor die Mail rausgeht

--priority arg Die Prioritaet ist eine Zahl nach der das Script
Priorisiert wird. So kann man verschiedene Scripte
in einer bestimmten Reihenfolge schalten lassen.
Plesk benutzt fuer seine Handler folgende Prioritaeten
Greylisting 05
Spamassassin 10
( fuer DrWeb weiss ich nicht ob es einen Handler gibt )

Als Beispiel wie man ganz Simpel ClamAV als Virenscanner fuer die Mails nutzt:

mailmng --add-handler
--handler-name clamav
--handler-type global
--executable /usr/bin/clamassassin
--context 'context'
--hook before-local
--priority 30

Natuerlich muss das alles in einer Zeile stehen. Der Context ist dabei
eigentlich unwichtig. Aber Plesk moechte ja nunmal gerne einen haben.

# Befehle des Mailhandlers
Wie schon gesagt, kann man ueber den STDERR ein paar Befehle an den Server
geben, wie er mit der Mail umzugehen hat. Dabei gibt es folgende Moeglichkeiten:

LOG Dies ist um einen Text als Warnung oder Fehler auszugeben
PASS Die E-Mail soll durchgelassen werden (Standard)
STOP Die Mail soll nicht verarbeitet werden, ist jedoch kein Fehler
(kann man Benutzen, wenn man die Mail selber zustellt)
DEFER Die Mail wird nicht verarbeitet und es gibt einen Temporaeren
Fehler (z.B. fuer Greylisting)
REJECT Die Mail wird mit einem Fehler abgelehnt.

# Parameter des Mailhandlers
Die Parameter sind die Argumente, mit denen das Script aufgerufen wird.

1. CONTEXT Der erste Parameter ist der von uns angegebene Context
2. SENDER Der zweite Parameter ist der Absender der Mail
3. EMPFAENGER Der dritte Parameter ist der Empfaenger der Mail
n. EMPFAENGER Es koennen noch beliebig viele Empfaenger uebergeben werden

# Beispiel eines Mailhandlers
Dies ist nur ein sehr simples Beispiel, was zeigt, wie so ein Script aufgebaut
sein kann:

#!/bin/bash
# Variablen setzen
# Context
CONTEXT=$1
# Absneder
SENDER=$2
# Empfaenger
RECPT=$3

# Die Mail in eine Variable lesen
MAIL=`cat`

# Die Mail ausgeben und eine Zeile anhaengen
echo "$MAIL\n------ Versendet von $SENDER ------\n"

# ENDE

Wie man sieht, ist es sehr einfach einen Handler zu schreiben. Das Beispiel
ist jedoch nicht sehr praktikabel, da es einfach nur eine Zeile anhaengt.
Ausserdem habe ich das Beispiel nicht getestet, weiss also garnicht ob es
wirklich Funktioniert. Jedoch sollte jedem klar geworden sein, wie sowas
Funktionieren kann.

# Anmerkungen
- Wurde geschrieben fuer Plesk 9.3
- Es muss nicht zwangslaeufig ein PASS zurueckgegeben werden