Filtern von Spam-E-Mails


Aufgabe

Benutzerdefinierte Datenbanken sind eine herausragende Funktion von todo4teams, um auf Basis von Skripten Zugriff auf eine Datenbank zu erhalten.
Der große Vorteil dabei liegt darin, dass die Datenbanken eine problemspezifische Lösung sehr vereinfachen. In unserem Beispiel erstellen wir eine Datenbank zur Unterdrückung von SPAM-E-Mails, die durch den Absender der E-Mail vordefiniert sind. Der durch eine eingehende E-Mail erstellte Job sollte automatisch geschlossen werden, wenn die E-Mail von einer Adresse stammt, die als SPAM-Quelle markiert ist.

Schritt 1: Definieren des Systemparameters: Im ersten Schritt definieren wir einen Systemparameter, dessen Wert zwei wichtige Attribute enthält. Wir werden daher eine neue Datenbank definieren.

Dies ist zum einen der Name der neuen Datenbank, definiert durch die Variable  dbname, und zum anderen das Verzeichnis, in dem die Datenbankdateien gespeichert sind. Dies wird durch die Variable basedir festgelegt:

dbname=SpamlistDB
basedir=/tmp/spamlistdb

Schritt 2: Definieren der erforderlichen Tabellen

Melden Sie sich anschließend am Web-Frontend von todo4teams an und wechseln Sie in den Reiter „Custom-DB“.
Dort sollte bereits die Datenbank SpamlistDB angeboten werden.
Definieren Sie nun eine Tabelle, beispielsweise die Tabelle spamlist. Hierzu wird die SQL-Syntax verwendet, wie sie bei relationalen Datenbanken fast immer der Fall ist:

CREATE TABLE spamlist (taskid BIGINT, eventdate TIMESTAMP, email VARCHAR(256))

The command SHOW TABLES will display all tables within the current database.

Step 3: Get access to the database using a script.

Mit der Funktion  isSpam  wird nach eingehenden E-Mails in der Mailbox gesucht. Dabei wird ein "Eintreffen-Skript" verwendet, das die E-Mails entsprechend den Werten der Tabelle Spamlist filtert.  Wenn dies der Fall ist und vom Skript ein definierter Wert gefunden wird, wird der bereits erstellte Job automatisch geschlossen und der abschließende Kommentar „E-Mail ist auf der schwarzen Liste“ erscheint. wird hinzugefügt.

function isSpam()
{
   var conny  = helper.getCustomDB("SpamlistDB");
   var selectStmt = conny.createStatement();
   var numberOfHits = selectStmt.executeQuery("SELECT COUNT(*) FROM spamlist WHERE '"+fromEmail+"' LIKE '%' || email ||'%'");
  if (numberOfHits.next())
  {
        var hits=numberOfHits.getInt(1);
        selectStmt.close();
       return hits>0;
  }

  return false;
}

println("Checking for spam in Custom DB:"+fromEmail);

if (isSpam())
{
    println("Closing task with id "+task.id+" for sender "+fromEmail);
    task.startWorking();
    task.setDoneComment("Email is blacklisted.");
    task.finishWorking(true);

}
else
{
       println("No Spam detected for task with id "+task.id+" for sender "+fromEmail);
}

Schritt 4: End-Aktion einer Gruppe zum Hinzufügen neuer E-Mail-Adressen

Zusätzlich zu den oben beschriebenen Anforderungen sollte es für bestimmte Gruppen möglich sein, einen aus einer E-Mail generierten Auftrag als SPAM zu markieren. Zu diesem Zweck prüft die Endaktion der Gruppe, ob das Wort SPAM vorkommt. Wenn ja, wird die E-Mail-Adresse, sofern sie noch nicht vorhanden ist, in die Spamlist-Tabelle aufgenommen.

function emailExists()
{
     var conny  = helper.getCustomDB("SpamlistDB");
     var selectStmt = conny.createStatement();
     var numberOfHits = selectStmt.executeQuery("SELECT COUNT(*) FROM spamlist WHERE email='"+fromEmail+"'");

    if (numberOfHits.next())
    {
         var hits=numberOfHits.getInt(1);
         selectStmt.close();
        return hits>0;
    }
    return false;
}

function insertEmail()
{
    var conny  = helper.getCustomDB("SpamlistDB");
    var insertStmt = conny.createStatement();
    var query = "INSERT INTO spamlist (taskid,creationdate,email) VALUES("+task.id+",CURRENT_TIMESTAMP,'"+fromEmail+"')";
    println("Insert email with query:"+query);
    insertStmt.execute(query);
    insertStmt.close();
}

if (task.getEmail() != null && task.getEmail().trim().length()>0)
{
    var fromEmail=task.getEmail().toLowerCase();

   if (task.getDoneComment().toLowerCase().contains("spam"))
   {
       if (emailExists())
       {
            print("Ignoring existing spam email from "+fromEmail+" for task id "+task.id)
       }
       else
       {
            insertEmail();
       }
   }
}