Die mögliche Filter, nach denen jede Mail geprüft wird, sollten über eine XML-Datei eingelesen werden können. Deren Struktur wird über eine DTD festegelegt.
<!-- DTD fuer eMPie's email-filters namespace: http://www.empie.de/mail/filter1_0 Datei kann folgendermassen aussehen: <email-filters> <filter> <date></date> -> wann wurde regel erstellt? dd.MM.yyyy <type></type> -> typ, z.B. 'limit' fuer maximale laenge/groesse, 'matches' fuer regulaeren ausdruch <target></target> -> welche header information soll ueberprueft werden: subject, size, sent, received, from, to, reply, message id, uidl, any <regexp></regexp> -> regulaerer ausdruck fuer match, muss teilweise CDATA sein <value></value> -> genauer wert, z.B. fuer groesse <weight></weight> -> gewichtung: positive zahl: hinweis auf spam negative zahl: hinweis auf erwuenschte mail </filter> ... </email-filters> --> <!-- wurzelelement, eine sammlung von filtern --> <!ELEMENT email-filters (filter)*> <!-- ein filter --> <!ELEMENT filter (date?, type, target, (regexp | value), weight)> <!-- erstellungsdatum - aktualitaet --> <!ELEMENT date (#PCDATA)> <!-- Typ, z.B. limit, match --> <!ELEMENT type (#PCDATA)> <!-- Ziel, z.B. any, subject, from, to, reply --> <!ELEMENT target (#PCDATA)> <!-- regulaerer ausdruck --> <!ELEMENT regexp (#PCDATA)> <!-- genauer wert, z.B. fuer Groesse --> <!ELEMENT value (#PCDATA)> <!-- Gewichtung: 0 -neutral, positiv -Spam, negativ -kein Spam --> <!ELEMENT weight (#PCDATA)>
Meine Java-Implementierung des Email-Filters umfasst 4 Klassen. Der Filter repräsentiert einen Filter. Dieser kann eine POP3Message überprüfen und gibt das ermittelte Gewicht zurück. Der XMLFilterHandler wird in den SAX-Parser eingehängt, erzeugt aus einer XML-Datei die entsprechenden Filter-Objekte und liefert einen Vector mit diesen zurück. Die Helper-Klasse enthält ein paar Hilfsfunktionen zur Formattierung. Der Executor ist der Haupteinstiegspunkt für Konsolenanwendungen. Er kann über Befehlszeilen-Parameter initialisiert werden und führt dann die Überprüfungen durch.
Zusammengepackt in ein Archiv: mp_mail.jar
Für die Ausführung benötigt man außer einer Java-Laufzeitumgebung folgende zusätzliche Pakete:
Hier ein Ausschnitt einer beispielhaften Filter-Datei. Sie ist dabei noch aufgeteilt in die objektiven Email-Filter, die Freundeslisten und in eine Abteilung mit bekannten Spam-Adressen.
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE email-filters SYSTEM "filter.dtd" [ <!ENTITY friends SYSTEM "friends.xml" > <!ENTITY spammer SYSTEM "spammer.xml" > ]> <email-filters xmlns="http://www.empie.de/mail/filter1_0"> <!-- von freunden --> &friends; <!-- zu groesse Mail --> <filter> <date>07.06.2003</date> <type>limit</type> <target>size</target> <value>100000</value> <weight>1</weight> </filter> <!-- zweifelhafte Absender --> <filter> <date>30.06.2003</date> <type>match</type> <target>from</target> <regexp>.*((M|m)ailing|(N|n)ews(letter)?|bonus).*</regexp> <weight>1</weight> </filter> <!-- betreff leer oder kein einziger kleinbuchstabe --> <filter> <date>17.06.2003</date> <type>match</type> <target>subject</target> <regexp>^[^a-z]*$</regexp> <weight>1</weight> </filter> <!-- Spam mit persoenlicher Note (eigene Adresse im Subject): --> <filter> <date>16.06.2003</date> <type>match</type> <target>subject</target> <regexp>.*(((info@)|(empie@)|(www\.))(empie\.de)).*</regexp> <weight>1</weight> </filter> <!-- auf den empfaenger mit gebruell --> <filter> <date>18.04.2003</date> <type>match</type> <target>subject</target> <regexp>.*!.*!.*!.*</regexp> <weight>1</weight> </filter> <!-- von bekannten Spammern --> &spammer; </email-filters>
<?xml version="1.0" encoding="ISO-8859-1" ?> <!-- von freunden --> <filter> <date>18.04.2003</date> <type>match</type> <target>from</target> <regexp>.*(@(empie|inghuimische)\.de).*</regexp> <weight>-20</weight> </filter>
<?xml version="1.0" encoding="ISO-8859-1" ?> <!-- von bekannten Spammern --> <filter> <date>01.05.2003</date> <type>match</type> <target>from</target> <regexp>.*(freenet|winbigusa).*</regexp> <weight>5</weight> </filter>
04. Juli 2003
© Daniel Müller-Pathle
dont_send_spam_to_this_address@empie.de