Im Unternehmensumfeld kann es durchaus die Anforderung geben, aus Mails die Anhänge automatisiert zu speichern um irgendwelche weiteren Schritte damit durchzuführen. Hier wäre beispielsweise ein Mail-to-Fax System zu nennen.

Mit Hilfe von Postfix ist so etwas recht einfach zu realisieren. Innerhalb der /etc/aliases kann ein Skript als Ziel für einen Mailempfänger angegeben werden. Zum Beispiel:


mail2fax: |/home/mail2fax/bin/mail2fax_worker.sh

Die komplette Mail wird per STDIN an das Skript übergeben, kann gespeichert und weiter bearbeitet werden.

Und wie nun „Raus damit“?

Die Anhänge sind innerhalb der Mail base64 kodiert. Dazu ist das ganze in diverse Abschnitte aufgeteilt. Theoretisch könnte man nun die Mail per Skript auseinander nehmen und die kodierten Teile per cli und dem Befehl „base64 -d“ dekodieren. Aber(!) das macht natürlich keinen Sinn, weil es dafür nützliche Tools gibt.

Den Standard dürfte „munpack“ darstellen – unter Debian enthalten in dem Paket „mpack“. Funktioniert prima, bis auf eines. Leerzeichen und andere Sonderzeichen werden beim Speichern der jeweiligen Datei durch ein „X“ ersetzt. Das ist soweit ok. Sind innerhalb der Mail allerdings die Dateinamen kodiert (ebenfalls base64) – weil sie bspw. Umlaute enthalten, so speichert munpack die Datei unter dem kodierten Namen. Dabei ist auch die Dateiendung kodiert, was unter M$ Benutzern dann schnell zu Problemen führt.

Auf meiner Suche nach einer Alternative habe ich ripMIME gefunden. ripMIME arbeitet prinzipiell genauso wie munpack – bis auf die Dateinamen. Diese werden korrekt übernommen und ggf. auch dekodiert. Möchte man nun keine Umlaute etc. im Dateinamen haben, so kann man sich mit einem einfachen


# das -n steht für "nothing is done"

rename -n "s/[^a-zA-Z0-9.-]/_/g" *.xyz

helfen. Mit Hilfe dieses Befehls werden alle Zeichen die nicht a-z, A-Z, 0-9, „.“ oder „-“ sind durch ein „_“ ersetzt.

Natürlich gibt es Module für Python, Perl etc. um solche Mails auszulesen und auch die Attachments zu speichern. Wir sind hier rein auf der bash unterwegs 😉