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