This documentation is for Dovecot v2.x, see wiki1 for v1.x documentation.
Differences between revisions 22 and 23
Revision 22 as of 2008-05-25 11:20:03
Size: 5141
Editor: TimoSirainen
Comment:
Revision 23 as of 2008-05-25 11:32:21
Size: 2520
Editor: TimoSirainen
Comment:
Deletions are marked like this. Additions are marked like this.
Line 9: Line 9:

See ["Quota/New"] for Dovecot v1.1 / quota-rewrite patch quota configuration.
Line 33: Line 31:
== Configuring quota == == Configuration ==
Line 35: Line 33:
Most of the quota backends have very similar configuration. They support two kinds of quota limits: The configuration is done differently for v1.0 and v1.1:
Line 37: Line 35:
 * '''storage''': Quota limit in kilobytes.
 * '''messages''': Quota limit in number of messages. This isn't probably very useful.

You can configure quota globally by placing the settings in plugin section in {{{dovecot.conf}}} and you can give per-user limits by having your [:UserDatabase:userdb] return the quota setting as an [:UserDatabase/ExtraFields:extra field]. The userdb quota setting always overrides the global plugin setting.

The important thing to remember is to '''use the correct format for quota setting'''. You can't just return a numeric quota field from userdb and expect it to work. Dovecot wouldn't then know what quota backend to use.

Here is an example global quota configuration:

{{{
plugin {
  # 10 MB + 1000 messages quota limit
  quota = maildir:storage=10240:messages=1000
} }}}

Now if you want to override this for some users, make your userdb return quota field '''in the exact same format'''. See below for some examples.
 * [:Quota/1.0:v1.0 quota configuration]
 * [:Quota/1.1:v1.1 quota configuration]
Line 72: Line 56:
 * Dovecot v1.1 or [:Quota/New:v1.0 quota rewrite]: You can give a separate quota rule giving Trash mailbox somewhat more quota.  * Dovecot v1.1 or [:Quota/1.1:v1.0 quota rewrite]: You can ignore Trash like with v1.0, but you can also give a separate quota rule giving Trash mailbox somewhat more quota (but not unlimited).
Line 75: Line 59:

== Examples ==

=== SQL ===

{{{
# MySQL, quota in kilobytes:
user_query = SELECT home, uid, gid, concat('maildir:storage=', quota_kb) AS quota FROM users WHERE userid = '%u'

# MySQL, quota in bytes:
user_query = SELECT home, uid, gid, concat('maildir:storage=', floor(quota/1024)) AS quota FROM users WHERE userid = '%u'

# PostgreSQL, SQLite, quota in kilobytes:
user_query = SELECT home, uid, gid, 'maildir:storage=' || quota_kb AS quota FROM users WHERE userid = '%u'
}}}

=== LDAP ===

The easiest way from Dovecot's point of view is if you already have the quota in Dovecot's format in LDAP (e.g. {{{maildir:storage=102400}}}. Then you can use a configuration like this:

{{{
user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,quotaDovecot=quota
}}}

Unfortunately usually this isn't the case. So if you have the quota in kilobytes in LDAP, you can use it in a bit kludgy way:

{{{
user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,quotaKb=quota=maildir:storage
}}}

If you have the quota stored as bytes, you'll need to use a [:PostLoginScripting:post-login scripting] trick to use them. Something like:

{{{
# quotaBytes is exported to $QUOTA_BYTES environment
user_attrs = homeDirectory=home,uidNumber=uid,gidNumber=gid,quotaBytes=quota_bytes
}}}

And make imap's {{{mail_executable}}} point to a script:

{{{
#!/bin/sh

export QUOTA=maildir:storage=`expr $QUOTA_BYTES / 1024`
exec /usr/local/libexec/dovecot/imap
}}}

This post-login trick unfortunately doesn't work with [:LDA:deliver]. If you need it, you're pretty much out of luck for now. [:Quota/New:v1.1 quota] makes this possible.

Quota

There are different quota backends that Dovecot can use:

  • [wiki:Quota/FS fs]: Filesystem quota.
  • [wiki:Quota/Dirsize dirsize]: The simplest and slowest quota backend, but it works quite well with mboxes.
  • [wiki:Quota/Dict dict]: Store quota in a dictionary (e.g. SQL).
  • [wiki:Quota/Maildir maildir]: Maildir++ quota. This is the most commonly used quota for virtual users.

Enabling quota plugins

There are currently two quota related plugins:

  • quota: Implements the actual quota handling and includes also all the quota backends.
  • imap_quota: For reporting quota information via IMAP.

Usually you'd enable these by adding them to the mail_plugins settings in the config file:

protocol imap {
  mail_plugins = quota imap_quota
}
protocol pop3 {
  mail_plugins = quota
}
# In case you're using deliver:
protocol lda {
  mail_plugins = quota
} 

Configuration

The configuration is done differently for v1.0 and v1.1:

  • [:Quota/1.0:v1.0 quota configuration]
  • [:Quota/1.1:v1.1 quota configuration]

Quota and Trash mailbox

Standard way to expunge messages with IMAP works by:

  1. Marking message with \Deleted flag
  2. Actually expunging the message using EXPUNGE command

Both of these commands can be successfully used while user's quota is full. However many clients use a "move-to-Trash" feature, which works by:

  1. COPY the message to Trash mailbox
  2. Mark the message with \Deleted
  3. Expunge the message from the original mailbox.
  4. (Maybe later expunge the message from Trash when "clean trash" feature is used)

If user is over quota, the first COPY command will fail and user may get an unintuitive message about not being able to delete messages because user is over quota. The possible solutions for this are:

  • Disable move-to-trash feature from client
  • Dovecot v1.0 + [:Quota/Maildir:Maildir++] quota: You can completely ignore Trash mailbox from quota calculation by appending :ignore=Trash to the quota line. Note that this would allow users to store messages infinitely to the mailbox.

  • Dovecot v1.1 or [:Quota/1.1:v1.0 quota rewrite]: You can ignore Trash like with v1.0, but you can also give a separate quota rule giving Trash mailbox somewhat more quota (but not unlimited).

To make sure users don't start keeping messages permanently in Trash you can use a nightly [:Plugins/Expire:cronjob or expire plugin (v1.1)] to expunge old messages from Trash mailbox.

None: Quota (last edited 2021-06-15 23:54:28 by MichaelSlusarz)