Email-Filter (Anti-Spam)

XML, Java, POP3



die DTD (Document Type Definition)

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)>



Java

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:



der Filter

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>

Als Vorlage diente das Konzept von Bert Ungerer un@ix.de, nachzulesen unter externer Verweis ftp.ix.de/pub/ix/ix_listings/2003_05/nixspam.procmailrc.

04. Juli 2003
© Daniel Müller-Pathle
dont_send_spam_to_this_address@empie.de