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.

#!/bin/bash
#
# maildrop-wrapper.sh 

maildrop ~/.mailfilter

if [ $? -ne 0 ]; then
    # Try to correct file permissions and retry
    chmod 0600 ~/.mailfilter
    maildrop ~/.mailfilter
fi

Der Vollständigkeit halber hier auch die entsprechende .qmail-Datei:

# .qmail
# Deliver email via maildrop-wrapper.sh
|~/bin/maildrop-wrapper.sh

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.

# 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"

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.