Dovecot SIEVE-Filter für POP3-Nutzer

Abstract

Dovecots SIEVE-Filter-Sprache kennt globale Regeln. Dies kann ein Mailserver-Adminstrator z.B. dazu nutzen, um bereits von Amavis oder Spamassassin als Spam markierte Mails in IMAP-Unterordner (z.B. Junk) automatisch zu verschieben. Diese Lösung ist sehr elegant, hat aber ein Problem: Ein Nutzer, der nur POP3 benutzt, wird diese Mails normalerweise nie sehen, da POP3 keine Abfrage von Unterordnern kennt.

Dovecots SIEVE-Filter-Sprache kennt globale Regeln. Dies kann ein Mailserver-Adminstrator z.B. dazu nutzen, um bereits von Amavis oder Spamassassin als Spam markierte Mails in IMAP-Unterordner (z.B. Junk) automatisch zu verschieben.

Diese Lösung ist sehr elegant, hat aber ein Problem: Ein Nutzer, der nur POP3 benutzt, wird diese Mails normalerweise nie sehen, da POP3 keine Abfrage von Unterordnern kennt.

Dieses Problem kann man mit dem Dovecot virtual-Plugin lösen. Nutzt man Postfixadmin mit MySQL, kann ein solches Setup beginnend mit dovecot-sql.conf.ext z.B. so eingerichtet werden. Die verwendete Dovecot-Version ist 2 .1.x mit maildir Mailbox-Format.

Important

Nützlicher Nebeneffekt bei Verwendung dieser globalen SIEVE-Spamregel ist, dass ein Anwender diese nicht trivial umgehen kann. Das Weiterleiten von bereits erkannten Spammails aus der Inbox wird mit anwenderdefinierten weiteren SIEVE-Regeln verhindert. Das ist ein wichtiger Punkt, denn wer Spam weiterleitet landet schnell auf Blocklisten.

...
user_query = SELECT concat('/usr/local/virtual/', maildir) AS home, \
...
concat('maildir:/usr/local/virtual/', maildir) AS mail, \
...
CASE '%s' WHEN 'pop3' THEN NULL ELSE 'yes' END AS 'namespace/inbox/inbox', \
CASE '%s' WHEN 'pop3' THEN 'yes' ELSE NULL END AS 'namespace/virtual/inbox', \
1001 AS uid, 1001 AS gid FROM mailbox WHERE username = '%u' AND active = '1'
...

Ein zugehöriges Namespace-Layout kann so aussehen:

Important

Das Postfixadmin-Layout, das hier verwendet wird, sieht so aus: /usr/local/virtual/domain.beispiel/adresse@domain.beispiel usw.

Weiter mit /etc/dovecot/10-mail.conf:

...
namespace inbox {
  separator = /
  prefix = ""
  list = yes
  subscriptions = yes
  hidden = no
}

namespace virtual {
  prefix = "virtual/"
  separator = /
  location = virtual:/etc/dovecot/virtual:LAYOUT=maildir++:INDEX=~/virtual
  hidden = yes
  list = no
  subscriptions= no
}

namespace real {
  prefix = "RealMails/"
  separator = /
  list = no
  hidden = yes
}
...

Das Virtual Plugin ist natürlich allgemein auch zu aktivieren:

10-mail.conf:  mail_plugins = $mail_plugins zlib expire virtual fts fts_lucene mail_log autocreate notify acl listescape
15-lda.conf:   mail_plugins = $mail_plugins quota sieve virtual acl fts fts_lucene mail_log notify expire listescape
20-imap.conf:  mail_plugins = imap_acl acl fts fts_lucene mail_log autocreate notify expire virtual quota imap_quota zlib imap_zlib listescape
20-lmtp.conf:  mail_plugins = quota sieve virtual acl fts fts_lucene mail_log notify expire listescape
20-pop3.conf:  mail_plugins = expire virtual quota mail_log fts fts_lucene notify listescape zlib

Nun muss noch definiert werden, wo die globalen SIEVE-Regeln zu finden sind. Die Angaben dazu müssen nach /etc/dovecot/conf.d/90-sieve.conf:

# A path to a global sieve script file, which gets executed ONLY
# if user's private Sieve script doesn't exist. Be sure to
# pre-compile this script manually using the sievec command line
# tool.
#sieve_global_path = /var/lib/dovecot/sieve/default.sieve
sieve_global_path = /etc/dovecot/sieve/global.sieve

# Directory for :personal include scripts for the include extension.
#sieve_dir = ~/sieve
sieve_dir = /usr/local/virtual/%d/%u/sieve

# Directory for :global include scripts for the include extension.
#sieve_global_dir =
sieve_global_dir = /etc/dovecot/sieve/

Das globale SIEVE-Skript muss dann noch im Verzeichnis /etc/dovecot/sieve erstellt und kompiliert werden. Entsprechend meiner Angabe oben in $sieve_global_path, heißt meine Datei global.sieve:

...
if header :contains "X-Spam-Flag" "YES" {fileinto "Junk";stop;}
...

Diese muss dann kompiliert werden:

% sievec global.sieve

Important

In diesem Setup wird der Subordner Junk mittels autocreate-Plugin beim Erstellen der Mailbox automatisch erzeugt, ebenso wie andere Standardordner des Mailclients Thunderbird: Trash, Sent, Templates, Drafts, Archives. Diese können einem Mailclient mittels der IMAP-Extension SPECIAL-USE zur Erstellung auf dem Server vom Server auch noch nachträglich vorgeschlagen werden.

Wie im Namespace virtual bereits konfiguriert, müssen nun in /etc/dovecot/virtual die zugehörigen Anordnungen für die virtuelle Maildir-Mailbox erstellt werden.

Die virtuelle Mailbox erscheint nur einem POP3-Nutzer! Dafür ist folgende Verzeichnisstruktur in /etc/dovecot/virtual/.INBOX/dovecot-virtual anzulegen:

+RealMails
+RealMails/*
-RealMails/Trash
-RealMails/Trash/*
-RealMails/Sent
-RealMails/Sent/*
-RealMails/Templates
-RealMails/Templates/*
-RealMails/Drafts
-RealMails/Drafts/*
-RealMails/Archives
-RealMails/Archives/*
all

Das bedeutet, dass alle ungelesenen Mails – egal in welchen IMAP-Unterordner der Inbox (inklusive Junk) – bei einer POP3-Anfrage so erscheinen als würden sie tatsächlich in der Inbox liegen, mit Ausnahme der mit "-" markierten Standard-Thunderbird-IMAP-Ordner und deren Unterordnern.

Begründung für ein solches Layout ist beispielsweise: Ein Anwender kann ja gleichzeitig immer noch auf eine Mailbox per IMAP zugreifen.

Beim POP3-Zugriff möchte er aber sicher keine temporären Mails seines IMAP-Mailclients, die von diesem (je nach Einstellung) zum Beispiel in dem Ordner Drafts (Entwürfe) während einer IMAP-Sitzung evtl. automatisch erstellt werden, herunterladen.

Important

Normalerweise erfolgt die Übersetzung von Standard-IMAP-Ordnern durch den IMAP-Client. Das muss aber nicht immer fehlerfrei umgesetzt sein, es wären also z.B. auch noch zusätzliche Einträge wie -RealMails/Entw&APw-rfe oder -RealMails/Entw&APw-rfe/* denkbar und möglich.

Abschließend ist zu sagen, dass die hier vorgestellte Lösung davon ausgeht, dass die Spam-Markierung auf SMTP-Ebene erfolgt. Zu empfehlen sind hier ClamAV-Milter mit Sanesecurity-Antispam-Signaturen, Spamass-Milter und Amavis.

Die Anwendung dürfte außerdem noch häufiger gefragt sein, um z.B. den unerwünschten Zugriff auf bestimmte IMAP-Ordner per POP3 ganz zu unterbinden.

Robert Schetterer, 11. February 2013

   Dovecot    Sieve