E-Mail-Filter (mail_filter)
Autor/Kontakt
Autor: Sascha SingertE-Mail:
Art der Lösung
Perl-SkriptVorwort
Eigentlich sollte dieses Skript nur ein Hack sein, um schnellstmöglich den gesetzlich geforderten rechtlichen Hinweis an jede E-Mail anzuhängen. Dann fielen mir Fehler im Zeichensatz der versendeten E-Mails auf, was einige E-Mail-Server, die die E-Mail entgegennehmen sollten, dazu veranlasste, diese als Spam abzuweisen – zu Recht. Irgendwann packte mich dann der Ehrgeiz und seit Version 0.3.0 steht eine weitaus aufgeräumtere Version zum Download bereit. Ich stelle dieses Skript jedem zur Verfügung, allerdings ohne Garantie oder Gewährleistung. Schadensersatzansprüche (oder sonstige andere juristische Späße) sind nichtig – Nutzung auf eigene Gefahr! Bei der Entwicklung wurde (noch) nicht auf Leistung geachtet, daher sollte das Skript nicht auf einem Produktiv-System mit starkem E-Mail-Verkehr oder bei sehr großen E-Mails genutzt werden. Da sich seit Version 0.3.0 die Parameter und der interne Aufbau des Skripts stark verändert haben, steht die (alte) Page unter index_old.html zur Verfügung.Funktionsumfang
- Ergänzt die E-Mail um den rechtlichen Hinweis (Footer), egal ob reiner Text oder HTML
- Footer kann für eine Domain als Empfänger ausgelassen werden (nützlich für interne E-Mails)
- Wandelt die E-Mail in UTF-8 um (Anhänge bleiben unverändert)
So arbeitet das Skript
Das Skript nimmt die gesamte E-Mail auseinander und sucht sich die Stelle heraus, an die der Footer hingehört. Dabei wird der Zeichensatz der Einzelteile überarbeitet. Das Puzzle wird wieder zusammengesetzt und je nach Parameter beim Aufruf an "sendmail" zum Versenden weitergereicht.Parameter
| Name | ab Version | Beschreibung |
|---|---|---|
| --help | 0.3.0 | Der wohl wichtigste Parameter überhaupt. Dieser gibt Auskunft über die verfügbaren Parameter und gibt eine kurze Beschreibung zu diesen aus. Im Zweifelsfall immer dieser Ausgabe trauen, da diese besonders gut gepflegt wird. |
| --mode | 0.3.0 | Über diesen Parameter wird das Verhalten von mail_filter gesteuert, ob die E-Mail bspw. per Pipe oder Dateipfad eingelesen werden soll. Mögliche Werte sind "pipe" und "debug", wobei pipe Standard ist. |
| --in | 0.3.0 | nur mode=debug: Pfadangabe der Datei, die eingelesen werden soll |
| --out | 0.3.0 | nur mode=debug: Pfadangabe der Datei, in die das Ergebnis geschrieben werden soll |
| --sendmail | 0.3.0 | nur mode=pipe: Pfadangabe des Programms, an das das Ergebnis über Pipe weitergereicht wird |
| --ignore-domain | 0.3.0 | Empfänger, die den angegebenen Domains zugehören, erhalten nicht zwingend einen Footer angehängt. Dies gilt aber nicht, wenn ein Empfänger vorhanden ist, dessen Domain nicht aufgelistet wurde. |
| --footer-text | 0.3.0 | Pfadangabe der Datei, deren Inhalt als Footer für Text-E-Mails genutzt wird |
Beispiele
# erste Gehversuche (0.3.0)
-- Aufruf --
perl mail_filter.pl --mode=debug --in="test1.eml"
-- Ausgabe --
debug => MIME line 226: parsing email / mime part
debug => MIME line 251: converting mime part to charset UTF-8
debug => MIME line 267: correcting header information
debug => MIME line 316: checking recipient domains whether to add footer
debug => MIME line 327: swm-software.de (OK)
debug => MIME line 330: no footer will be added
debug => MIME line 292: reassembling email / mime part
output written to: out.eml
Duration: 5.676031ms
# das Gleiche im Pipe-Modus (0.3.0)
-- Aufruf --
cat test1.eml | perl mail_filter.pl --sendmail="cat"
Download & Chronik
| Version 0.1.0 | .zip | Veröffentlichung |
| Version 0.1.1 | .zip | Korrektur erzwungen, wenn MIME nur aus einem Teil (Text) besteht |
| Version 0.1.2 | .zip | Fiesen Tippfehler entfernt, der zur Falsch-Erkennung von Text-Anhängen führte |
| Version 0.1.3 | .zip | Quoted-Printables nach RFC 2045 Abschnitt 6 werden nun auch ausgetauscht |
| Version 0.2.0 | .zip | base64 nach RFC 2045 Abschnitt 6 wird nun auch ausgetauscht. Damit sind alle "wichtigen" Content-Transfer-Encodings abgedeckt. |
| Version 0.2.1 | .zip | Produkte von "Winzigweich" hinterließen seltsame Zeilenenden. |
| Version 0.3.0 | .zip | Komplette Überarbeitung des internen Ablaufs und mehreren kleineren Korrekturen. Hinweis: Durch andere Parameter ein neues Interface! |
Installation für Postfix 2.x
Um das Skript für ausgehende E-Mails zu nutzen, könnten folgende Änderungen in der master.cf (/etc/postfix/) behilflich sein:# hinzufügen/ändern
smtp inet n - n - - smtpd
-o content_filter=filter:dummy
# hinzufügen
filter unix - n n - 10 pipe
user=dovecot argv=perl /pfad/zur/mail_filter.pl --footer-text /pfad/zur/footer.txt --ignore-domain example.com
Der Benutzer, der bei user angegeben wurde, benötigt nur Leserechte auf das Skript.
Mitarbeit
Bisher arbeite ich alleine an diesem Projekt. Wer sich dazu genötigt fühlt, das Skript zu überarbeiten, zu übersetzen bzw. zu portieren, darf dies gerne machen. Für mitgeteilte Änderungen bin ich immer dankbar.Zeitmessungen
... coming ... may be ...Hinweise
Es gibt noch keine Erfahrungen mit S/MIME oder digitale Signaturen bezüglich Inkompatibilität. Aufgrund der RFCs gehe ich davon aus, dass es zu Problemen kommen könnte, wenn eine verschlüsselte oder signierte E-Mail verschickt wird.Aussichten
Nichts hiervon ist festgetackert, aber zumindest angedacht:- --ignore-address: statt immer die gesamte Domain bei Footern auszunehmen, soll dies mit diesem Parameter auch für einzelne Adressen gehen
- --footer-html: Footer-Datei für HTML-Mails
- --force-text-footer: HTML-Mails wird der Text-Footer hinzugefügt statt der HTML-Footer
- --force-base64: Texte werden nach base64 kodiert für höchstmögliche Kompatibilität
- --remove-x-headers: Metainformationen werden aus den Headern verbannt (bis auf wenige Ausnahmen)
- --encoding: Zeichensätze, nach denen die Text-Teile einer MIME geprüft werden sollen um diese dann nach UTF-8 zu konvertieren. Bisher werden nur ASCII, UTF-8 und cp1252 erkannt.
- --mode=daemon: Das Skript wird als daemon gestartet; Kommunikation via Socket