Lazy expunge
============

This plugin exists in Dovecot v1.0rc16 and later. Currently it works only with
maildirs and only with IMAP.

The idea behind this plugin is that expunged mails and deleted mailboxes stay
around for a while, so that user can undelete them without assistance from
sysadmin. The expunged mails won't be counted in user's quota. The plugin
itself doesn't clean up the expunged messages, you'll have to do it some other
way (see below).

The plugin is configured by defining 3 namespaces where the mails are moved.
You can decide if you want the namespaces to be visible to clients, or if you
want to show them only via some special webmail interface. The namespaces are:

 1. Expunged messages namespace. Whenever a message is expunged in mailbox
    /<name>/, it's moved to a mailbox /<name>/ in this namespace. The mailboxes
    are created automatically as needed.
 2. Deleted mailboxes namespace. Whenever a mailbox /<name>/ is deleted, it's
    moved here with name /<name>-YYYMMDD-hhmmss/. The timestamp is there so
    that the mailbox can be deleted multiple times. If the mailbox is deleted
    multiple times within a second, random 16bit hex value is appended to it.
 3. Expunged messages in a deleted mailbox namespace. When a mailbox is deleted
    and it has messages in its expunged namespace, the mailbox is moved from
    the expunged namespace to this namespace. The destination mailbox name is
    the same as in the 2nd namespace (ie. contains the same timestamp).

Example configuration
---------------------

---%<-------------------------------------------------------------------------
# the default namespace
namespace private {
  prefix =
  separator = /
  inbox = yes
}

# namespaces for lazy_expunge plugin:
namespace private {
  prefix = .EXPUNGED/
  separator = /
  location = maildir:~/Maildir/expunged
  hidden = yes
}
namespace private {
  prefix = .DELETED/
  separator = /
  location = maildir:~/Maildir/deleted
  hidden = yes
}
namespace private {
  prefix = .DELETED/.EXPUNGED/
  separator = /
  location = maildir:~/Maildir/deleted/expunged
  hidden = yes
}

protocol imap {
  mail_plugins = lazy_expunge
}
protocol pop3 {
  # works with POP3 too if you want it
  mail_plugins = lazy_expunge
}

plugin {
  lazy_expunge = .EXPUNGED/ .DELETED/ .DELETED/.EXPUNGED/
}
---%<-------------------------------------------------------------------------

Cleaning up
-----------

cronjob
-------

Run something like this for each user every night (not actually tested if it
works):

---%<-------------------------------------------------------------------------
# delete a day old mails
find Maildir/expunged Maildir/deleted Maildir/deleted/expunged \
  -type f ! -cmin 1440 -print0 | xargs -0 rm
---%<-------------------------------------------------------------------------

Trash plugin
------------

<Trash plugin> [Plugins.Trash.txt] with some help from <Quota plugin>
[Quota.txt] could be used to keep the expunged and deleted mailboxes under a
specified size. Unfortunately this requires CVS HEAD version of Dovecot, and
probably even still requires some changes to the code.

Expire plugin
-------------

<Expire plugin> [Plugins.Expire.txt] was created to keep track of mails in
specific mailboxes, and expunge them when they've been there for a specified
amount of time. It keeps an internal database (Berkeley DB) of all such
mailboxes, so it doesn't have to go through all the mailboxes for all the
users. Unfortunately again this requires CVS HEAD version of Dovecot, and it
doesn't yet support wildcards in its list of tracked mailboxes.

(This file was created from the wiki on 2007-04-13 14:32)
