Wenn maildrop
-Filter mit der Zeit wachsen und komplexer werden steigt das Risiko, dass sich irgendwo ein Fehler einschleicht. Da die Debugging und Fehlererkennungsmechanismen von maildrop
eher rudimentär ausfallen – besonders bei verteilten Filtern in mehreren Dateien – kann ein solcher Fehler schnell zum Verlust von E-Mails führen.
Probleme mit den Dateirechten
maildrop
ist sehr empfindlich was die Dateirechte der Hauptfilterdatei (~/.mailfilter
) angeht. Sind diese nicht auf 0600
gesetzt, verweigert maildrop jeglichen Dienst. Da ich meine Filter über git
versioniere und git
Dateirechte schlicht aus der umask generiert (Ausnahme ist das +x
-Flag) kam es hier gelegentlich zu Problemen.
Die Lösung ist so einfach wie wirkungsvoll. Über die .qmail
-Datei rufe ich ein Wrapper-Script maildrop-wrapper.sh
auf, welches die Übergabe an maildrop
versucht. Sollte ein Fehler auftreten, wird versucht die Rechte zu korrigieren und anschließend ein weiterer Versuch gestartet.
[shell]
#!/bin/bash
#
# maildrop-wrapper.sh
maildrop ~/.mailfilter
if [ $? -ne 0 ]; then
# Try to correct file permissions and retry
chmod 0600 ~/.mailfilter
maildrop ~/.mailfilter
fi
[/shell]
Der Vollständigkeit halber hier auch die entsprechende .qmail
-Datei:
[generic]
# .qmail
# Deliver email via maildrop-wrapper.sh
|~/bin/maildrop-wrapper.sh
[/generic]
Fehler im Filter
Um bei Fehlern im Filtercode dennoch zumindest eine Zustellung zu ermöglichen, habe ich eine grundlegende Filterkonfiguration in die ~/.mailfilter
gepackt. Daher sollte es an dieser eigentlich keine Änderungen geben, die Fehler verursachen können.
[generic]
# mailfilter
# Maildrop filter
#
# This file is just for data integrity, it includes the
# actual mailfilter in file „main“
# If any exception occurs while executing main, this file
# makes sure that the affected mail is not dropped
# DO NOT ADD ANY ADDIDTIONAL CODE OUTSIDE THE EXCEPTION SCOPE
# Catch exceptions in actual filter
exception {
# Include the actual filter
CONFIG_DIR=“$HOME/etc/maildrop“
include „$CONFIG_DIR/main“
# If anything worked until now, exiting with success
# is quite fine
EXITCODE=0
exit
}
# DO NOT ADD ANY ADDIDTIONAL CODE OUTSIDE THE EXCEPTION SCOPE
# If anything goes wrong, deliver mail to Maildir
to „$HOME/Maildir“
[/generic]
Der simple aber wirkungsvolle Gedanke dahinter – packe alles was irgendwie kritisch werden könnte in einen exception
-Block, der alle möglichen Fehler auffängt. Wird die E-Mail innerhalb dieses Blocks zugestellt, passiert nichts mehr. Kann jedoch nicht zugestellt werden, wird die E-Mail in (fast) jedem Fall ins Standard-Maildir ~/Maildir
zugestellt.