Schlagwort-Archive: Rechte

maildrop-Fallstricke und was man dagegen tun kann

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.