This documentation is for Dovecot v2.x, see wiki1 for v1.x documentation.

Dovecot virtual users

An exercise in mailrouting by F. Overkamp <>


I wanted to use Dovecot to deal with mailboxes that may belong to accounts that may or may not exist as a unix user. I also required a large amount of flexibility in migration options - so mail-accounts may have any number of formats and daemons. I am doing distribution of these users by using [ Perdition], but thats just a preference.

A few assumptions were made in this setup:

Desired results

The result I was looking for was this:

Mail for the domain comes in. If it has a dovecot mailbox, deliver it there. If not, continue with 'normal' local delivery.

Making dovecot use these mailboxes

auth = default
auth_userdb = static uid=500 gid=500 home=/home/dovecot/users/%u
auth_passdb = passwd-file /home/dovecot/passwd
auth_user = dovecot

By the way, I did not bother making another set of configs to deal with non-virtual users - I use perdition for that in my migration scenario.

Making exim deliver to those virtual users

# Director to send any mail for who a dovecot user exists to the appropriate maildir box
  driver = smartuser
  require_files = +/home/dovecot/users/${local_part}/
  transport = dovecot_transport

# Transport to send any mail for who a dovecot user exists to the appropriate maildir box
# Transports are evaluated in order of configuration, so if you place this 
# above the local_delivery director this will play nice:
# If there is a virtual user in the dovecot dirs it will use that
# If not, it will try normal local delivery
  driver = appendfile
  user = dovecot
  group = dovecot
  mode = 0600
  maildir_format = true
  mode_fail_narrower = false
  envelope_to_add = true
  return_path_add = true

In order to make this work, exim must be able to read the /home/dovecot/users/ directory, otherwise delivery will not work.

Be carefull how you do this - test it with 'exim -bt <address>' for a few different options

  deliver to frops in domain host
  director = dovecot, transport = dovecot_transport

  deliver to florian in domain host
  director = procmail, transport = procmail_pipe