Debian Lenny, dovecot 1.2, quota 1.1, MySQL und Quota Warnings.

Ich habe vor kurzem vor dem Problem gestanden meinen dovecot mailboxen quotas aufzuerlegen. Die Anleitung von: http://wiki.dovecot.org/Quota/1.1 war sehr hilfreich, funktioniert aber leider mit meiner Konfiguration nicht sofort.

Ich wollte folgendes erreichen:
–    Alle Mailboxen haben im Standard eine quota von maximal 512MB.
–    Jeder Mailbox kann ich dynamisch mehr oder weniger Platz zur Verfügung stellen.
–    Die Benutzer sowie der Admin sollen frühzeitig Warnmeldungen bekommen, wenn der Platz eng wird.

Als erstes musste eine etwas aktuellere Version vom dovecot (Taubenschlag) auf den Lenny Server. Glücklicherweise findet sich die Version 1.2 schon in den Backports. Diese waren schnell eingebunden!

echo "deb http://www.backports.org/debian lenny-backports main contrib non-free" >> /etc/apt/sources.list
apt-get update && apt-get install debian-backports-keyring && apt-get update
apt-get –t lenny-backports install dovecot-common

Nach der Installation erweiterte ich meine /etc/dovecot/dovecot.conf um die folgenden Einträge in den jeweiligen Sektionen.

protocol imap {
mail_plugins = quota imap_quota
}

 

protocol lda {
mail_plugins = sieve quota
quota_full_tempfail = yes
}

Hier ist zu beachten das in der neueren dovecot Version das sieve Plugin nicht mehr cumsieve heist! Damit E-Mais bei vollem Postfach nicht sofort zurückgewiesen werden, sondern mit einem temporären Fehler (so hat der Postfachbesitzer etwas mehr Zeit sein Postfach aufzuräumen), gibt es den 2. Eintrag.

plugin {
quota = dirsize:User quota
quota_rule = *:storage=512M
quota_warning = storage=80%% /usr/local/bin/quota-warning.sh 80 %u
quota_warning2 = storage=95%% /usr/local/bin/quota-warning.sh 95 %u
quota_warning3 = storage=99%% /usr/local/bin/quota-warning.sh 99 %u
}

Hier gebe ich nun an das ich als Backend, also über welche der möglichen Lösungen ich den Speicherplatz „berechnen“ möchte. Zudem gebe ich an, das jede Mailbox default 512MB Platz hat.
Quota_warning… Ruft jeweils bei 80%, 95% und 99% Mailboxauslastung das Script /usr/local/bin/quota-warning.sh auf.

Das Script muss man selbst anlegen. Das script im dovecot-wiki hat bei mir nicht so ganz funktioniert, es wurden keine quota_warnings generiert, versendet oder wie auch immer. Daher habe ich es etwas umgeschrieben und als weitere Übergabewert mir noch die betreffende E-Mailadresse des Postfaches mit übergeben lassen „%u“. Zusätzlich wollte bei mir (warum auch immer /usr/sbin/sendmail) nicht funktionier. Daber habe ich auf Heirloom Mailx zurückgegriffen (apt-get install heirloom-mailx). Mein script ist ausführbar (chmod +x /usr/local/bin/quota-warning.sh) und gehört dem Benutzer sowie der Gruppe vmail (chown vmail:vmail /usr/local/bin/quota-warning.sh). Es schaut nun so aus:

#!/bin/bash
PERCENT=$1
USER=$2
FROM=" <a href="mailto:%3Ca%20href=" mailto:sebastian="" vandemeer="" de="">sebastian@vandemeer.de"><a href="mailto:sebastian@vandemeer.de">sebastian@vandemeer.de<span style="display: none;">This e-mail address is being protected from spambots. You need JavaScript enabled to view it. "
qwf="/tmp/quota.warning.$"
echo "
(for English version please see below
Liebe(r) Mailsystem Benutzer(in
ihr E-Mail Postfach $USER ist jetzt zu  $PERCENT% voll.
Fuer Informationen senden Sie eine E-Mail an: sebastian@vandemeer.de">sebastian@vandemeer.de

Ab jetzt läuft das Thema Quota schon. Es lässt sich auch testen. Für alle jeweils 512MB.

Jetzt möchte ich natürlich in meiner mysql Datenbank den einzelnen Mailboxen mehr oder weniger Platz zuweisen können! Diesen Teil kann man für seine eigene Konfiguration aber nur dann so wie jetzt beschrieben übernehmen, wenn die Benutzerauthentifizierung wie bei mir funktioniert. Hier habe ich etwas länger gehangen bis ich eine funktionable Lösung hatte. Wer hier auch hängt: http://www.gidf.de/ vielleicht kann ich auch helfen (e-mail)!
Ich musste bei mir meine dovecot-sql.conf um die folgende Zeile erweitern:

>>Klick mich<<

Dann habe ich in der dovecot.conf den Teil auskommentiert:

#  userdb static {
#    # Template for the fields. Can return anything a userdb could normally
#    # return. For example:
#    #
#    args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
#    #
#    #args =
# }

Und durch diesen hier „ersetzte“:

userdb prefetch {
}
userdb sql {
args = /etc/dovecot/dovecot-sql.conf
}

In meiner Datenbank habe ich dann ein neues view angelegt, und vorher meiner Tabelle virtual_users ein neues Feld quota_kb spendiert:

CREATE VIEW view_users_quota AS select concat(`virtual_users`.`user`,_latin1'@',`virtual_domains`.`name`) AS `email`,`virtual_users`.`quota_kb` AS `quota_kb`,`virtual_users`.`password` AS `password` from (`virtual_users` left join `virtual_domains` on((`virtual_users`.`domain_id` = `virtual_domains`.`id`)));

Dieses view sammelt sich aus meinen anderen Tabellen die passenden Informationen zusammen und erbricht bei einer Abfrage gleich auch die Quota infos:

>>klick mich<<

Jetzt klappt es auch mit den dynamisch zugeteilten quotas. Dafür habe ich aber etwas gebraucht *lach*!

Als Webmailser setzte ich roundcube ein. Dieser zeigt einem sogar in einer lustigen Statusleiste wieviel Platz gerade „verschwendet“ wird. Dieser Statusbalken hat mir (quick and dirty) beim Testen sehr geholfen :-P! Zudem kann roundcube mit sieves-filtern bessern umgehen als alle mir (derzeit) bekannten Mailclients!


*Update*

Da gibt es etwas neues. Man muss natürlich nicht unbedingt über den view gehen. Ich habe ein weiteres System neu aufgesetzt. Alles läuft nun über /var/vmail und die sql user query schaut nun so aus: >>klick mich<<

Ne ne ne… im Grunde müsste ich das alles noch einmal neu schreiben 😛 Wenn ich dafür nur die Zeit hätte!