[Postfixbuch-users] Quota mit Postfixadmin und Dovecot 2.0.11
Michael Köhler
postfixbuch-users at makomi.de
So Mär 20 11:55:38 CET 2011
Hallo Christian,
On 18.03.2011, at 20:46, Christian Boltz wrote:
>> Wie sage ich Dovecot, das er aus der Datenbank "postfixadmin",
>> Tabelle "mailbox", Feld "quota" die Angaben zum Quota des Users
>> finden soll und das er die aktuelle maildirsize in die Datenbank
>> "postfixadmin", Tabelle "quota2" schreiben soll?
>
> Guck mal in die DOVECOT.TXT in der PostfixAdmin-Doku - da steht alles
> drin. (Sollte zumindest so sein - falls nicht, bitte ich um einen
> Bugreport ;-)
Wir hatten ja schon mal kurz drüber geschwatzt: In dem Textfile steht einiges drin, aber das Prinzip wird m.E. nicht ganz ersichtlich. Durch Selbsttests habe ich es aber nun herausgefunden :) - zumindest denke ich das und würde mich ggf. über Berichtigungen freuen:
Der m.E. relevante Teil für Quota für Dovecot (dovecot.conf oder besser gesagt die Dateien in /etc/dovecot/conf.d/) sieht so aus:
dict/quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
plugin/quota = dict:User quota::proxy::quota
service dict {
unix_listener dict {
group = mail
mode = 0660
}
}
protocol lmtp {
mail_plugins = " quota"
}
protocol imap {
mail_plugins = " quota imap_quota"
}
userdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
Die Datei dovecot-sql.conf.ext hat folgenden Inhalt:
connect = host=localhost dbname=postfixadmin user=postfixadmin password=GehtDichGarNixAn
default_pass_scheme = CRAM-MD5
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active='1'
user_query = SELECT maildir, 106 AS uid, 8 AS gid, CONCAT('*:bytes=', CAST(quota AS CHAR)) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
Und die Datei dovecot-dict-sql.conf.ext hat folgenden Inhalt:
connect = host=localhost dbname=postfixadmin user=postfixadmin password=GehtDichGarNixAn
map {
pattern = priv/quota/storage
table = quota2
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
In Postfixadmin ist der Teil wie folgt konfiguriert:
$CONF['quota'] = 'YES';
$CONF['quota_multiplier'] = '1024000';
$CONF['used_quotas'] = 'YES';
$CONF['new_quota_table'] = 'YES';
Und in Postfix sieht es so aus:
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_alias_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
virtual_mailbox_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
Der gesamte Teil "Additional for quota support" aus der POSTFIX_CONF.TXT kann weglassen werden, da die Ablehnung wegen Überschreitung des Quotas von Dovecot-lmtp kommt.
Das Prinzip, was ich in meiner Ursprungsmail dargestellt habe, scheint also anders zu sein:
Postfixadmin setzt in der Datenbank das Quotalimit in mailbox/quota. Dovecot liest dies aus und schreibt die aktuellen Größen in die Tabelle quota2. Diese Tabelle quota2 nutzt Postfixadmin zur Anzeige des Quotas. Jede Mail, die nun an einen Nutzer gesendet wird empfängt Postfix und will sie Dovecot via LMTP zustellen und Dovecot selber überpüft, ob das Quota überschritten wurde und lehnt ggf. die Mail, was Postfix seinerseits dann dem Sender mitteilt. So funktioniert es zumindest jetzt bei mir :). Über Anmerkungen bzw. Verbesserungsvorschläge bin ich natürlich dankbar.
> Das beantwortet zwar nicht alle Fragen aus Deiner Mail, dürfte aber den
> interessantesten Teil abdecken.
Also Ansatz ganz gut, aber weiteres nachdenken, probieren und Debug-Level in Postfix anschalten war notwendig um zu schauen, welchen Weg die eingehende Mail geht und was wo abgefragt und überprüft wird :).
Gruß,
Michael
Mehr Informationen über die Mailingliste Postfixbuch-users