Einfache Sievescripte

Sieve ist keine schwere, aber sehr gewöhnungsbedürftige Programmiersprache. Warum nicht eine einfache Syntax, z.B. an Pascal oder Basic angelehnt, verwendet wurde, versteht keiner. Bemerkenswert ist z.B. dass statt "if (a AND B)" oder "if (A or B)" die schreibweise "if allof (A,B)" und "if anyof(A,B)" verwendet wird.

Daher hier ein paar Beispiele:

Einfacher Spamfilter

require ["fileinto"];

if header :contains "X-Spam-Level" "*****" {
      fileinto "Spam5";
      stop;
} elsif header :contains "X-Spam-Level" "****" {
      fileinto "Spam4";
      stop;
}

Einfache Weiterleitung

Es verbleibt keine Kopie an der TU. Bitte keinen Spam weiterleiten! Wenn Sie eine Kopie an der TU behalten möchten ersetzen SIe bitte das "discard" durch ein "keep".

require ["fileinto"];

if header :contains "X-Spam-Level" "*****" {
      fileinto "Spam5";
      stop;
} elsif header :contains "X-Spam-Level" "****" {
      fileinto "Spam4";
      stop;
}

redirect "myaddress@mydomain.com";
discard;

Einfache Urlaubsbenachrichtigung

In den folgenden Beispielen lautet meine eigene Mailadresse "joe.public@tuhh.de".

require ["fileinto","vacation"];

if header :contains "X-Spam-Level" "*****" {
      fileinto "Spam5";
      stop;
} elsif header :contains "X-Spam-Level" "****" {
      fileinto "Spam4";
      stop;
}

vacation :days 7 :addresses ["joe.public@tuhh.de",
                             "joe.public@tu-harburg.de",
                             "joe.public@tu-hamburg.de"] 

         :subject "I'm on vacation" 
         text:
I'm on vacation!

Best regards!

.
;

Komplexere Urlaubsbenachrichtigung

In diesem Beispiel erhalten nur Absender aus der TU eine Benachrichtigung. Dabei wird die Eigenheit unseres Systems genutzt, dass nur externe Mails eine X-Spam-Status: Zeile enthalten. Zusätzlich gibt es noch den Fall der Mitarbeiter der Verwaltung, die zwar nicht im TU-Netz sitzen, aber natürlich auch informiert werden müssen. Solche Mails enthalten den Text "DATAPORT" in der X-Spam-Status: Zeile.

require ["fileinto","vacation"];

if header :contains "X-Spam-Level" "*****" {
      fileinto "Spam5";
      stop;
} elsif header :contains "X-Spam-Level" "****" {
      fileinto "Spam4";
      stop;
}


if anyof (not exists ["X-Spam-Status"],
          header :contains "X-Spam-Status" "DATAPORT" ) {

  vacation :days 7 :addresses ["joe.public@tuhh.de",
                               "joe.public@tu-harburg.de",
                               "joe.public@tu-hamburg.de"] 

           :subject "I'm on vacation"
           text:
I'm on vacation!

Best regards!

.
;
}

Spamfilter mit einigen Ausnahmen


Folgende Mails werden nicht als Spam eingestuft:
  • Mails die im "From"-Header "joe.public@public.org" enthalten.
  • Mails die im "From"-Header als Domäne "friendly.com" stehen haben.
  • Mails die als Return-Path für den Fehlerfall "maillist-owner@listserver.org" enthalten.

if not anyof (
     address :all "From" "joe.public@public.org",
     address :domain "From" "friendly.com",
     envelope :all "From" "maillist-owner@listserver.org"
   ) {
  if header :contains "X-Spam-Level" "*****" {
        fileinto "Spam5";
        stop;
  } elsif header :contains "X-Spam-Level" "****" {
        fileinto "Spam4";
        stop;
  }
}

Plus-Adressen ausfiltern


Es gibt die Möglichkeit, sogenannte Plus-Adressen zu verwenden. Beispiel:
Wenn meine Mailadresse "joe.public@tuhh.de" lautet, erhalte ich auch Mails, die an "joe.public+privat@tuhh.de" adressiert sind. Normalwerweise landen diese ganz normal in der INBOX, ich kann sie aber auch per sieve-script anders einsortieren.

Das Beispiel setzt natürlich voraus, dass ein Ordner "privat" existiert. Auch sollte man tunlichst den oben angeführten Spamfilter dem Code voranstellen.

require ["fileinto","envelope","subaddress"];

if envelope :detail "to" "privat" {
  fileinto "privat";
}

Mails an die sys-admins Mailingliste wegsortieren


Wir verteilen Mails des DFN-CERTs über eine unserer internen Mailinglisten weiter. Da sehr viele der Mails auch Betriebssysteme betreffen, die man gar betreibt, lohnt es sich, diese auszufiltern.

Der folgende Codeschnipsel geht davon aus, dass eine Ordner "CERT" existiert. Alle Mitteilungen werden automatisch dorthin wegsortiert, wenn folgende Bedingungen erfüllt sind:

  1. Steht im envelope-from "sys-admins-owner@tuhh.de"? Nur dann ist es eine Mail, die über die sys-admin Liste der TU verteilt wurde.
  2. Steht im header-from ein Absender aus der Domäne "@dfn-cert.de"?
  3. Wurde die Mail an "dfncert-ssc@tuhh.de" geschickt?
  4. Steht im Subject der Text "[sys-admins]"?

Zusätzlich wird eine Kopie aller Mitteilungen, die RedHat betreffen, in der INBOX abgelegt. Sollte ausserdem im Subject der Text "cyrus" oder "BIND" vorkommen, werden diese Mails auch noch rot markiert.

if allof (envelope :all :contains "from" "sys-admins-owner@tuhh.de",
          address :domain "From" "dfn-cert.de",
          address :contains ["to"] "dfncert-ssc@tuhh.de",
          header :contains "subject" "[sys-admins]") {
  fileinto "CERT";
  if header :contains "subject" "[RedHat]" {
    if header :contains "subject" ["cyrus","BIND"] {
      setflag "$Label1";
    }
    keep;
  }
}

Mails effizienter verschicken

Wenn man große Mails (z.B. mit Bildern) bei langsamer Internetanbindung verschickt (DSL, Mobilfunk) kann es sehr stören, wenn das Mailporgramm diese dann auch noch doppelt hochläd: Einmal um sie per SMTP zu verschicken und ein weiteres Mal, um sie per IMAP im sent- Ordener abzulegen.

Dies kann man vermeiden, wenn das Mailprogramm wie z. B. Thunderbird die Möglichkeit bietet, das Ablegen einer Kopie abzuschalten und statt dessen immer eine Adresse mit "Bcc:" hinzuzufügen.

Zusätzlich hat es den schönen Effekt, dass die Mails im Sent-Ordner auch die Received: Headerzeilen enthalten, an denen man ersehen kann, wann und mit welcher Queue-ID die Mail vom Mailserver angenommen wurde.

Angenommen die eigene Userid lautet "xyz123" und die Mailadresse sei "joe.public@tuhh.de". Dann konfiguriert man sein Mailprogramm so, dass "xyz123+sent@rz.tu-harburg.de" im "Bcc:" jeder ausgehenden Mail steht.

Die folgende Zeilen am Anfang des eigenen Sieve-Scriptes speichern dann jede an "xyz123+sent@rz.tu-harburg.de" adressierte Mail im sent- Ordner, sofern folgende Bedingungen erfüllt sind:

  • Die Mail wurde an die Plus-Adresse "sent" geschickt.
  • Der Absender im Envelope-From ist joe.public@tuhh.de.
  • Die Mail enthält nur 2 Headerzeile "Received". Das ist wichtig, weil bei mehr als 2 Received-Zeilen die folgende Bedingung durch gefälschte Header-Zeilen umgangen werden könnte, so dass einem jemand anderes Mails in den sent-Ordner schummeln könnte:
  • Die Mail muss authentifiziert von der Userid xyz123 eingeliefert worden sein.

Damit man nicht dauernd ungelesene Mails im sent- Ordner hat, wird die Mail zusätzlich mit "setflag" als gelesen markiert.

require ["fileinto","envelope","subaddress",
         "comparator-i;ascii-numeric","relational",
         "imapflags"];

if allof ( envelope :detail "to" "sent",
           envelope :all :contains "from" "joe.public@tuhh.de",
           header :count "eq" :comparator "i;ascii-numeric" "received" "2",
           header :contains "received" "(user=xyz123 mech="
         ) {
  setflag "\\seen";
  fileinto "Sent";
  stop;
}

Das tuhh-default Script

Falls man es aus Versehen mal gelöscht hat: So sieht das tuhh-default Script aus, welches für jeden Account bei der Einrichtung angelegt wird:

require ["fileinto","vacation"];

# If you want to use a private whitelist
# remove the 4 lines containing "WL" and add
# your own "address" lines
#

/* WL
if not anyof (
     # Use "," to separate all but the last entry

     # For filtering against header From: line use this:
     # address :all "From" "my@friendly.org"

     # If you want to whitelist a whole domain use this:
     # address :domain "From" "friendly.com"

     # For filtering against envelope-from use this:
     # envelope :all "From" "my@friendly.org"
   ) {
 WL */
  # Spam Filter
  if header :contains "X-Spam-Level" "*****" {
        fileinto "Spam5";
        stop;
  } elsif header :contains "X-Spam-Level" "****" {
        fileinto "Spam4";
        stop;
  }
/* WL
} 
 WL */

/* RD
# If you want to forward your mails remove the 2 lines
# containing RD and change the address in the "redirect"- line accordingly.

redirect "myaddress@mydomain.com";
discard;
 RD */

# If you want to send a vacation message remove the 2 lines
# containing VA and change the other lines as you like.
# At least replace "myaddress" by your mailaddress(es).

/* VA
vacation :days 7 :addresses ["myaddress@tuhh.de",
                             "myaddress@tu-harburg.de",
                             "myaddress@tu-hamburg.de"] 

         :subject "I'm on vacation" 
         text:
I'm on vacation!

Best regards!

.
;
# A line containing a single "." ends the reply-
# message, ";" ends the vacation command (Do not remove
# both lines above)! 
 VA */