This documentation is for Dovecot v1.x, see wiki2 for v2.x documentation.
Differences between revisions 2 and 104 (spanning 102 versions)
Revision 2 as of 2005-08-22 22:51:59
Size: 28315
Editor: bigdog
Comment: New Main Config File
Revision 104 as of 2011-04-25 16:53:54
Size: 47878
Editor: generator
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= Dovecot 1.0 configuration file =

' ' character and everything after it is treated as comments. Extra spaces
and tabs are ignored. If you want to use either of these explicitly, put the
value inside quotes, eg.: key = "char and trailing whitespace "

Default values are shown after each value, it's not required to uncomment
any of the lines. Exception to this are paths, they're just examples
with real defaults being based on configure options. The paths listed here
are for configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
--with-ssldir=/etc/ssl

Base directory where to store runtime data.
{{{
base_dir = /var/run/dovecot/
}}}
Protocols we want to be serving:
 imap imaps pop3 pop3s
{{{
protocols = imap imaps
}}}

IP or host address where to listen in for connections. It's not currently
possible to specify multiple addresses. "*" listens in all IPv4 interfaces.
"[::]" listens in all IPv6 interfaces, but may also listen in all IPv4
interfaces depending on the operating system. If you want to specify ports
for each service, you will need to configure these settings inside the
protocol imap/pop3 { ... } section, so you can specify different ports
for IMAP/POP3.
{{{
listen = *
}}}
IP or host address where to listen in for SSL connections. Defaults
to above if not specified.
{{{
ssl_listen =
}}}
Disable SSL/TLS support.
{{{
ssl_disable = no
}}}
PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
dropping root privileges, so keep the key file unreadable by anyone but
root. Included doc/mkcert.sh can be used to easily generate self-signed
certificate, just make sure to update the domains in dovecot-openssl.cnf
{{{
ssl_cert_file = /etc/ssl/certs/dovecot.pem
ssl_key_file = /etc/ssl/private/dovecot.pem
}}}
File containing trusted SSL certificate authorities. Usually not needed.
{{{
ssl_ca_file =
}}}
Request client to send a certificate.
{{{
ssl_verify_client_cert = no
}}}
SSL parameter file. Master process generates this file for login processes.
It contains Diffie Hellman and RSA parameters.
{{{
ssl_parameters_file = /var/run/dovecot/ssl-parameters.dat
}}}
How often to regenerate the SSL parameters file. Generation is quite CPU
intensive operation. The value is in hours, 0 disables regeneration
entirely.
{{{
ssl_parameters_regenerate = 24
}}}
SSL ciphers to use
{{{
ssl_cipher_list = ALL:!LOW
}}}
Disable LOGIN command and all other plaintext authentications unless
SSL/TLS is used (LOGINDISABLED capability). Note that 127.*.*.* and
IPv6 ::1 addresses are considered secure, this setting has no effect if
you connect from those addresses.
{{{
disable_plaintext_auth = yes
}}}
Use this logfile instead of syslog(). /dev/stderr can be used if you want to
use stderr for logging (ONLY /dev/stderr - otherwise it is closed).
log_path =

For informational messages, use this logfile instead of the default
info_log_path =

Prefix for each line written to log file. % codes are in strftime(3)
format.
log_timestamp = "%b %d %H:%M:%S "


Login processes


Directory where authentication process places authentication UNIX sockets
which login needs to be able to connect to. The sockets are created when
running as root, so you don't have to worry about permissions. Note that
everything in this directory is deleted when Dovecot is started.
login_dir = /var/run/dovecot/login

chroot login process to the login_dir. Only reason not to do this is if you
wish to run the whole Dovecot without roots.
http://wiki.dovecot.org/Rootless
login_chroot = yes

User to use for the login process. Create a completely new user for this,
and don't use it anywhere else. The user must also belong to a group where
only it has access, it's used to control access for authentication process.
Note that this user is NOT used to access mails.
http://wiki.dovecot.org/UserIds
login_user = dovecot

Set max. process size in megabytes. If you don't use
login_process_per_connection you might need to grow this.
login_process_size = 32

Should each login be processed in it's own process (yes), or should one
login process be allowed to process multiple connections (no)? Yes is more
secure, espcially with SSL/TLS enabled. No is faster since there's no need
to create processes all the time.
login_process_per_connection = yes

Number of login processes to create. If login_process_per_user is
yes, this is the number of extra processes waiting for users to log in.
login_processes_count = 3

Maximum number of extra login processes to create. The extra process count
usually stays at login_processes_count, but when multiple users start logging
in at the same time more extra processes are created. To prevent fork-bombing
we check only once in a second if new processes should be created - if all
of them are used at the time, we double their amount until limit set by this
setting is reached. This setting is used only if login_process_per_use is yes.
login_max_processes_count = 128

Maximum number of connections allowed in login state. When this limit is
reached, the oldest connections are dropped. If login_process_per_user
is no, this is a per-process value, so the absolute maximum number of users
logging in actually login_processes_count * max_logging_users.
login_max_logging_users = 256

Greeting message for clients.
login_greeting = Dovecot ready.

Space-separated list of elements we want to log. The elements which have
a non-empty variable value are joined together to form a comma-separated
string.
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c

Login log format. %$ contains login_log_format_elements string, %s contains
the data we want to log.
login_log_format = %$: %s


Mail processes


Maximum number of running mail processes. When this limit is reached,
new users aren't allowed to log in.
max_mail_processes = 1024

Show more verbose process titles (in ps). Currently shows user name and
IP address. Useful for seeing who are actually using the IMAP processes
(eg. shared mailboxes or if same uid is used for multiple accounts).
verbose_proctitle = no

Show protocol level SSL errors.
verbose_ssl = no

Valid UID range for users, defaults to 500 and above. This is mostly
to make sure that users can't log in as daemons or other system users.
Note that denying root logins is hardcoded to dovecot binary and can't
be done even if first_valid_uid is set to 0.
first_valid_uid = 500
last_valid_uid = 0

Valid GID range for users, defaults to non-root/wheel. Users having
non-valid GID as primary group ID aren't allowed to log in. If user
belongs to supplementary groups with non-valid GIDs, those groups are
not set.
first_valid_gid = 1
last_valid_gid = 0

Grant access to these extra groups for mail processes. Typical use would be
to give "mail" group write access to /var/mail to be able to create dotlocks.
mail_extra_groups =

':' separated list of directories under which chrooting is allowed for mail
processes (ie. /var/mail will allow chrooting to /var/mail/foo/bar too).
This setting doesn't affect login_chroot or auth_chroot variables.
WARNING: Never add directories here which local users can modify, that
may lead to root exploit. Usually this should be done only if you don't
allow shell access for users. See doc/configuration.txt for more information.
valid_chroot_dirs =

Default chroot directory for mail processes. This can be overridden for
specific users in user database by giving /./ in user's home directory
(eg. /home/./user chroots into /home). Note that usually there is no real
need to do chrooting, Dovecot doesn't allow users to access files outside
their mail directory anyway.
mail_chroot =

Enable mail process debugging. This can help you figure out why Dovecot
isn't finding your mails.
mail_debug = no

Default MAIL environment to use when it's not set. By leaving this empty
dovecot tries to do some automatic detection as described in
doc/mail-storages.txt. There's a few special variables you can use, eg.:

  %u - username
  %n - user part in user@domain, same as %u if there's no domain
  %d - domain part in user@domain, empty if there's no domain
  %h - home directory

See doc/variables.txt for full list. Some examples:

  default_mail_env = maildir:/var/mail/%1u/%u/Maildir
  default_mail_env = mbox:~/mail/:INBOX=/var/mail/%u
  default_mail_env = mbox:/var/mail/%d/%n/:INDEX=/var/indexes/%d/%n

default_mail_env =

If you need to set multiple mailbox locations or want to change default
namespace settings, you can do it by defining namespace sections:

You can have private, shared and public namespaces. The only difference
between them is how Dovecot announces them to client via NAMESPACE
extension. Shared namespaces are meant for user-owned mailboxes which are
shared to other users, while public namespaces are for more globally
accessible mailboxes.

REMEMBER: If you add any namespaces, the default namespace must be added
explicitly, ie. default_mail_env does nothing unless you have a namespace
without a location setting. Default namespace is simply done by having a
namespace with empty prefix.
namespace private {
   Hierarchy separator to use. You should use the same separator for all
   namespaces or some clients get confused. '/' is usually a good one.
   separator = /

   Prefix required to access this namespace. This needs to be different for
   all namespaces. For example "Public/".
   prefix =

   Physical location of the mailbox. This is in same format as
   default_mail_env, which is also the default for it.
   location =

   There can be only one INBOX, and this setting defines which namespace
   has it.
   inbox = yes

   If namespace is hidden, it's not advertised to clients via NAMESPACE
   extension or shown in LIST replies. This is mostly useful when converting
   from another server with different namespaces which you want to depricate
   but still keep working. For example you can create hidden namespaces with
   prefixes "~/mail/", "~%u/mail/" and "mail/".
   hidden = yes
}

Space-separated list of fields to initially save into cache file. Currently
these fields are allowed:

 flags, date.sent, date.received, size.virtual, size.physical
 mime.parts, imap.body, imap.bodystructure

Different IMAP clients work in different ways, so they benefit from
different cached fields. Some do not benefit from them at all. Caching more
than necessary generates useless disk I/O, so you don't want to do that
either.

Dovecot attempts to automatically figure out what client wants and it keeps
only that. However the first few times a mailbox is opened, Dovecot hasn't
yet figured out what client needs, so it may not perform optimally. If you
know what fields the majority of your clients need, it may be useful to set
these fields by hand. If client doesn't actually use them, Dovecot will
eventually drop them.

Usually you should just leave this field alone. The potential benefits are
typically unnoticeable.
mail_cache_fields =

Space-separated list of fields that Dovecot should never save to cache file.
Useful if you want to save disk space at the cost of more I/O when the fields
needed.
mail_never_cache_fields =

Like mailbox_check_interval, but used for IDLE command.
mailbox_idle_check_interval = 30

Allow full filesystem access to clients. There's no access checks other than
what the operating system does for the active UID/GID. It works with both
maildir and mboxes, allowing you to prefix mailboxes names with eg. /path/
or ~user/.
mail_full_filesystem_access = no

Maximum allowed length for mail keyword name. It's only forced when trying
to create new keywords.
mail_max_keyword_length = 50

Save mails with CR+LF instead of plain LF. This makes sending those mails
take less CPU, especially with sendfile() syscall with Linux and FreeBSD.
But it also creates a bit more disk I/O which may just make it slower.
mail_save_crlf = no

Use mmap() instead of read() to read mail files. read() seems to be a bit
faster with my Linux/x86 and it's better with NFS, so that's the default.
Note that OpenBSD 3.3 and older don't work right with mail_read_mmaped = yes.
mail_read_mmaped = no

Don't use mmap() at all. This is required if you store indexes in remote
filesystems (NFS or clustered filesystem).
mmap_disable = no

Don't write() to mmaped files. This is required for some operating systems
which use separate caches for them, such as OpenBSD.
mmap_no_write = no

Locking method for index files. Alternatives are fcntl, flock and dotlock.
Dotlocking uses some tricks which may create more disk I/O than other locking
methods.
lock_method = fcntl

By default LIST command returns all entries in maildir beginning with dot.
Enabling this option makes Dovecot return only entries which are directories.
This is done by stat()ing each entry, so it causes more disk I/O.
(For systems setting struct dirent->d_type, this check is free and it's
done always regardless of this setting)
maildir_stat_dirs = no

Copy mail to another folders using hard links. This is much faster than
actually copying the file. This is problematic only if something modifies
the mail in one folder but doesn't want it modified in the others. I don't
know any MUA which would modify mail files directly. IMAP protocol also
requires that the mails don't change, so it would be problematic in any case.
If you care about performance, enable it.
maildir_copy_with_hardlinks = no

Which locking methods to use for locking mbox. There's four available:
 dotlock: Create <mailbox>.lock file. This is the oldest and most NFS-safe
          solution. If you want to use /var/mail/ like directory, the users
          will need write access to that directory.
 fcntl : Use this if possible. Works with NFS too if lockd is used.
 flock : May not exist in all systems. Doesn't work with NFS.
 lockf : May not exist in all systems. Doesn't work with NFS.

You can use multiple locking methods; if you do the order they're declared
in is important to avoid deadlocks if other MTAs/MUAs are using multiple
locking methods as well. Some operating systems don't allow using some of
them simultaneously.
mbox_read_locks = fcntl
mbox_write_locks = dotlock fcntl

Maximum time in seconds to wait for lock (all of them) before aborting.
mbox_lock_timeout = 300

If dotlock exists but the mailbox isn't modified in any way, override the
lock file after this many seconds.
mbox_dotlock_change_timeout = 30

When mbox changes unexpectedly we have to fully read it to find out what
changed. If the mbox is large this can take a long time. Since the change
is usually just a newly appended mail, it'd be faster to simply read the
new mails. If this setting is enabled, Dovecot does this but still safely
fallbacks to re-reading the whole mbox file whenever something in mbox isn't
how it's expected to be. The only real downside to this setting is that if
some other MUA changes message flags, Dovecot doesn't notice it immediately.
Note that a full sync is done with SELECT, EXAMINE, EXPUNGE and CHECK
commands.
mbox_dirty_syncs = yes

Like mbox_dirty_syncs, but don't do full syncs even with SELECT, EXAMINE,
EXPUNGE or CHECK commands. If this is set, mbox_dirty_syncs is ignored.
mbox_very_dirty_syncs = no

Delay writing mbox headers until doing a full write sync (EXPUNGE and CHECK
commands and when closing the mailbox). This is especially useful for POP3
where clients often delete all mails. The downside is that our changes
aren't immediately visible to other MUAs.
mbox_lazy_writes = yes

umask to use for mail files and directories
umask = 0077

Drop all privileges before exec()ing the mail process. This is mostly
meant for debugging, otherwise you don't get core dumps. It could be a small
security risk if you use single UID for multiple users, as the users could
ptrace() each others processes then.
mail_drop_priv_before_exec = no

Set max. process size in megabytes. Most of the memory goes to mmap()ing
files, so it shouldn't harm much even if this limit is set pretty high.
mail_process_size = 256

Log prefix for mail processes. See doc/variables.txt for list of possible
variables you can use.
mail_log_prefix = "%Us(%u): "


IMAP specific settings


protocol imap {
  Login executable location.
  login_executable = /usr/libexec/dovecot/imap-login

  IMAP executable location
  mail_executable = /usr/libexec/dovecot/imap
  This would write rawlogs into ~/dovecot.rawlog/ directory:
  mail_executable = /usr/libexec/dovecot/rawlog /usr/libexec/dovecot/imap

  Maximum IMAP command line length in bytes. Some clients generate very long
  command lines with huge mailboxes, so you may need to raise this if you get
  "Too long argument" or "IMAP command line too large" errors often.
  imap_max_line_length = 65536

  Support for dynamically loadable modules.
  mail_use_modules = no
  mail_modules = /usr/lib/dovecot/imap

  Send IMAP capabilities in greeting message. This makes it unnecessary for
  clients to request it with CAPABILITY command, so it saves one round-trip.
  Many clients however don't understand it and ask the CAPABILITY anyway.
  login_greeting_capability = no

  Workarounds for various client bugs:
    delay-newmail:
      Send EXISTS/RECENT new mail notifications only when replying to NOOP
      and CHECK commands. Some clients ignore them otherwise, for example
      OSX Mail. Outlook Express breaks more badly though, without this it
      may show user "Message no longer in server" errors. Note that OE6 still
      breaks even with this workaround if synchronization is set to
      "Headers Only".
    outlook-idle:
      Outlook and Outlook Express never abort IDLE command, so if no mail
      arrives in half a hour, Dovecot closes the connection. This is still
      fine, except Outlook doesn't connect back so you don't see if new mail
      arrives.
    netscape-eoh:
      Netscape 4.x breaks if message headers don't end with the empty "end of
      headers" line. Normally all messages have this, but setting this
      workaround makes sure that Netscape never breaks by adding the line if
      it doesn't exist. This is done only for FETCH BODY[HEADER.FIELDS..]
      commands. Note that RFC says this shouldn't be done.
    tb-extra-mailbox-sep:
      With mbox storage a mailbox can contain either mails or submailboxes,
      but not both. Thunderbird separates these two by forcing server to
      accept '/' suffix in mailbox names in subscriptions list.
  imap_client_workarounds = outlook-idle
}
  

POP3 specific settings


protocol pop3 {
  Login executable location.
  login_executable = /usr/libexec/dovecot/pop3-login

  POP3 executable location
  mail_executable = /usr/libexec/dovecot/pop3

  Don't try to set mails non-recent or seen with POP3 sessions. This is
  mostly intended to reduce disk I/O. With maildir it doesn't move files
  from new/ to cur/, with mbox it doesn't write Status-header.
  pop3_no_flag_updates = no

  Support LAST command which exists in old POP3 specs, but has been removed
  from new ones. Some clients still wish to use this though. Enabling this
  makes RSET command clear all \Seen flags from messages.
  pop3_enable_last = no
  
  POP3 UIDL format to use. You can use following variables:
  
   %v - Mailbox UIDVALIDITY
   %u - Mail UID
   %m - MD5 sum of the mailbox headers in hex (mbox only)
   %f - filename (maildir only)
  
  If you want UIDL compatibility with other POP3 servers, use:
   UW's ipop3d : %08Xv%08Xu
   Courier version 0 : %f
   Courier version 1 : %u
   Courier version 2 : %v-%u
   Cyrus (<= 2.1.3) : %u
   Cyrus (>= 2.1.4) : %v.%u
  
  Note that Outlook 2003 seems to have problems with %v.%u format which is
  Dovecot's default, so if you're building a new server it would be a good
  idea to change this. %08Xu%08Xv should be pretty fail-safe.
  pop3_uidl_format = %v.%u

  POP3 logout format string:
   %t - number of TOP commands
   %T - number of bytes sent to client as a result of TOP command
   %r - number of RETR commands
   %R - number of bytes sent to client as a result of RETR command
   %d - number of deleted messages
   %m - number of messages (before deletion)
   %s - mailbox size in bytes (before deletion)
  pop3_logout_format = top=%t/%T, retr=%r/%R, del=%d/%m, size=%s

  Support for dynamically loadable modules.
  mail_use_modules = no
  mail_modules = /usr/lib/dovecot/pop3

  Workarounds for various client bugs:
    outlook-no-nuls:
      Outlook and Outlook Express hang if mails contain NUL characters.
      This setting replaces them with 0x80 character.
    oe-ns-eoh:
      Outlook Express and Netscape Mail breaks if end of headers-line is
      missing. This option simply sends it if it's missing.
  pop3_client_workarounds =
}


Authentication processes


Executable location
auth_executable = /usr/libexec/dovecot/dovecot-auth

Set max. process size in megabytes.
auth_process_size = 256

Authentication cache size in kilobytes.
auth_cache_size = 0
Time to live in seconds for cached data. After this many seconds a cached
record is forced out of cache.
auth_cache_ttl = 3600

Space separated list of realms for SASL authentication mechanisms that need
them. You can leave it empty if you don't want to support multiple realms.
Many clients simply use the first one listed here, so keep the default realm
first.
auth_realms =

Default realm/domain to use if none was specified. This is used for both
SASL realms and appending @domain to username in plaintext logins.
auth_default_realm =

List of allowed characters in username. If the user-given username contains
a character not listed in here, the login automatically fails. This is just
an extra check to make sure user can't exploit any potential quote escaping
vulnerabilities with SQL/LDAP databases. If you want to allow all characters,
set this value to empty.
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@

Username character translations before it's looked up from databases. The
value contains series of from -> to characters. For example "@/@" means
that '' and '/' characters are translated to '@'.
auth_username_translation =

Username to use for users logging in with ANONYMOUS SASL mechanism
auth_anonymous_username = anonymous

More verbose logging. Useful for figuring out why authentication isn't
working.
auth_verbose = no

Even more verbose logging for debugging purposes. Shows for example SQL
queries.
auth_debug = no

Maximum number of dovecot-auth worker processes. They're used to execute
blocking passdb and userdb queries (eg. MySQL and PAM). They're
automatically created and destroyed as needed.
auth_worker_max_count = 30

auth default {
  Space separated list of wanted authentication mechanisms:
    plain digest-md5 cram-md5 apop anonymous
  mechanisms = plain

  
  Password database is used to verify user's password (and nothing more).
  You can have multiple passdbs and userdbs. This is useful if you want to
  allow both system users (/etc/passwd) and virtual users to login without
  duplicating the system users into virtual database.
  
  http://wiki.dovecot.org/Authentication
  

  PAM authentication. Preferred nowadays by most systems.
  Note that PAM can only be used to verify if user's password is correct,
  so it can't be used as userdb. If you don't want to use a separate user
  database (passwd usually), you can use static userdb.
  passdb pam {
    [-session] [<service name>]
    
    -session makes Dovecot open and immediately close PAM session. Some
    PAM plugins need this to work.
    
    If service name is "*", it means the authenticating service name
    is used, eg. pop3 or imap.
    args = dovecot
  }

  /etc/passwd or similar, using getpwnam()
  In many systems nowadays this uses Name Service Switch, which is
  configured in /etc/nsswitch.conf.
  passdb passwd {
  }

  /etc/shadow or similiar, using getspnam(). Deprecated by PAM nowadays.
  passdb shadow {
  }

  passwd-like file with specified location
  passdb passwd-file {
    Path for passwd-file
    args =
  }

  checkpassword executable authentication
  passdb checkpassword {
    Path for checkpassword binary
    args =
  }

  SQL database
  passdb sql {
    Path for SQL configuration file, see doc/dovecot-sql.conf for example
    args =
  }

  LDAP database
  passdb ldap {
    Path for LDAP configuration file, see doc/dovecot-ldap.conf for example
    args =
  }

  vpopmail authentication
  passdb vpopmail {
  }

  
  User database specifies where mails are located and what user/group IDs
  own them. For single-UID configuration use "static".
  
  http://wiki.dovecot.org/Authentication
  http://wiki.dovecot.org/VirtualUsers
  

  /etc/passwd or similar, using getpwnam()
  In many systems nowadays this uses Name Service Switch, which is
  configured in /etc/nsswitch.conf.
  userdb passwd {
  }

  passwd-like file with specified location
  userdb passwd-file {
    Path for passwd-file
    args =
  }

  static settings generated from template
  userdb static {
    Template for settings. Can return anything a userdb could normally
    return, eg.: uid, gid, home, mail, nice
    
    A few examples:
    
     args = uid=500 gid=500 home=/var/mail/%u
     args = uid=500 gid=500 home=/home/%u mail=mbox:%h/mail nice=10
    
    args =
  }

  SQL database
  userdb sql {
    Path for SQL configuration file, see doc/dovecot-sql.conf for example
    args =
  }

  LDAP database
  userdb ldap {
    Path for LDAP configuration file, see doc/dovecot-ldap.conf for example
    args =
  }

  vpopmail
  userdb vpopmail {
  }

  User to use for the process. This user needs access to only user and
  password databases, nothing else. Only shadow and pam authentication
  requires roots, so use something else if possible. Note that passwd
  authentication with BSDs internally accesses shadow files, which also
  requires roots. Note that this user is NOT used to access mails.
  That user is specified by userdb above.
  user = root

  Directory where to chroot the process. Most authentication backends don't
  work if this is set, and there's no point chrooting if auth_user is root.
  Note that valid_chroot_dirs isn't needed to use this setting.
  chroot =

  Number of authentication processes to create
  count = 1

  Require a valid SSL client certificate or the authentication fails.
  ssl_require_client_cert = no
}

It's possible to export the authentication interface to other programs,
for example SMTP server which supports talking to Dovecot. Client socket
handles the actual authentication - you give it a username and password
and it returns OK or failure. So it's pretty safe to allow anyone access to
it. Master socket is used to a) query if given client was successfully
authenticated, b) userdb lookups.

listener sockets will be created by Dovecot's master process using the
settings given inside the auth section
auth default_with_listener {
 mechanisms = plain
 passdb passwd {
 }
 userdb pam {
 }
 socket listen {
   master {
     path = /var/run/dovecot/auth-master
     mode = 0600
     Default user/group is the one who started dovecot-auth (root)
     user =
     group =
   }
   client {
     path = /var/run/dovecot-auth-client
     mode = 0660
   }
 }
}

connect sockets are assumed to be already running, Dovecot's master
process only tries to connect to them. They don't need any other settings
than path for the master socket, as the configuration is done elsewhere.
Note that the client sockets must exist in login_dir.
auth external {
 socket connect {
   master {
     path = /var/run/dovecot/auth-master
   }
 }
}
#acl All:read
= Dovecot configuration file =
<<TableOfContents>>

If you're in a hurry, see [[QuickConfiguration]]

"dovecot -n" command gives a clean output of the changed settings. Use it instead of copy&pasting this file when posting to the Dovecot mailing list.

'#' character and everything after it is treated as comments. Extra spaces and tabs are ignored. If you want to use either of these explicitly, put the value inside quotes, eg.: key = "# char and trailing whitespace "

Default values are shown for each setting, it's not required to uncomment those. These are exceptions to this though: No sections (e.g. namespace {}) or plugin settings are added by default, they're listed only as examples. Paths are also just examples with the real defaults being based on configure options. The paths listed here are for configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-ssldir=/etc/ssl


 base_dir = /var/run/dovecot/:: Base directory where to store runtime data.


 protocols = imap imaps:: Protocols we want to be serving: imap imaps pop3 pop3s If you only want to use dovecot-auth, you can set this to "none".


 listen = *:: A space separated list of IP or host addresses where to listen in for connections. "*" listens in all IPv4 interfaces. {{{[::]}}}" listens in all IPv6 interfaces. Use "*,{{{[::]}}}" for listening both IPv4 and IPv6.

If you want to specify ports for each service, you will need to configure these settings inside the protocol imap/pop3 { ... } section, so you can specify different ports for IMAP/POP3. For example:
{{{
# protocol imap {
# listen = *:10143
# ssl_listen = *:10943
# ..
# }
# protocol pop3 {
# listen = *:10100
# ..
# } }}}


 disable_plaintext_auth = yes:: Disable LOGIN command and all other plaintext authentications unless SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP matches the local IP (ie. you're connecting from the same computer), the connection is considered secure and plaintext authentication is allowed.


 shutdown_clients = yes:: Should all IMAP and POP3 processes be killed when Dovecot master process shuts down. Setting this to "no" means that Dovecot can be upgraded without forcing existing client connections to close (although that could also be a problem if the upgrade is eg. because of a security fix). This however means that after master process has died, the client processes can't write to log files anymore.

== Logging ==

 log_path = :: Log file to use for error messages, instead of sending them to syslog. /dev/stderr can be used to log into stderr.


 info_log_path = :: Log file to use for informational and debug messages. Default is the same as log_path.


 log_timestamp = "%b %d %H:%M:%S ":: Prefix for each line written to log file. % codes are in strftime(3) format.


 syslog_facility = mail:: Syslog facility to use if you're logging to syslog. Usually if you don't want to use "mail", you'll use local0..local7. Also other standard facilities are supported.

== SSL settings ==

 ssl_listen =:: IP or host address where to listen in for SSL connections. Remember to also add imaps and/or pop3s to protocols setting. Defaults to same as "listen" setting if not specified.


 ssl = yes:: SSL/TLS support: yes, no, required. [[SSL]]


 ssl_cert_file = /etc/ssl/certs/dovecot.pem:: PEM encoded X.509 SSL/TLS certificate and private key. They're opened before dropping root privileges, so keep the key file unreadable by anyone but root. Included doc/mkcert.sh can be used to easily generate self-signed certificate, just make sure to update the domains in dovecot-openssl.cnf


 ssl_key_file = /etc/ssl/private/dovecot.pem::


 ssl_key_password =:: If key file is password protected, give the password here. Alternatively give it when starting dovecot with -p parameter. Since this file is often world-readable, you may want to place this setting instead to a different root owned 0600 file by using !include_try <path>.


 ssl_ca_file = :: File containing trusted SSL certificate authorities. Set this only if you intend to use ssl_verify_client_cert=yes. The CAfile should contain the CA-certificate(s) followed by the matching CRL(s).


 ssl_verify_client_cert = no:: Request client to send a certificate. If you also want to require it, set ssl_require_client_cert=yes in auth section.


 ssl_cert_username_field = commonName:: Which field from certificate to use for username. commonName and x500UniqueIdentifier are the usual choices. You'll also need to set ssl_username_from_cert=yes.


 ssl_parameters_regenerate = 168:: How often to regenerate the SSL parameters file. Generation is quite CPU intensive operation. The value is in hours, 0 disables regeneration entirely.


 ssl_cipher_list = ALL:!LOW:!SSLv2:: SSL ciphers to use


 verbose_ssl = no:: Show protocol level SSL errors.

== Login processes ==
[[LoginProcess]]


 login_dir = /var/run/dovecot/login:: Directory where authentication process places authentication UNIX sockets which login needs to be able to connect to. The sockets are created when running as root, so you don't have to worry about permissions. Note that everything in this directory is deleted when Dovecot is started.


 login_chroot = yes:: chroot login process to the login_dir. Only reason not to do this is if you wish to run the whole Dovecot without roots. [[Rootless]]


 login_user = dovecot:: User to use for the login process. Create a completely new user for this, and don't use it anywhere else. The user must also belong to a group where only it has access, it's used to control access for authentication process. Note that this user is NOT used to access mails. [[UserIds]]


 login_process_size = 64:: Set max. process size in megabytes. If you don't use login_process_per_connection you might need to grow this.


 login_process_per_connection = yes:: Should each login be processed in it's own process (yes), or should one login process be allowed to process multiple connections (no)? Yes is more secure, espcially with SSL/TLS enabled. No is faster since there's no need to create processes all the time.


 login_processes_count = 3:: Number of login processes to keep for listening new connections.


 login_max_processes_count = 128:: Maximum number of login processes to create. The listening process count usually stays at login_processes_count, but when multiple users start logging in at the same time more extra processes are created. To prevent fork-bombing we check only once in a second if new processes should be created - if all of them are used at the time, we double their amount until the limit set by this setting is reached.


 login_max_connections = 256:: Maximum number of connections allowed per each login process. This setting is used only if login_process_per_connection=no. Once the limit is reached, the process notifies master so that it can create a new login process.


 login_greeting = Dovecot ready.:: Greeting message for clients.


 login_trusted_networks =:: Space separated list of trusted network ranges. Connections from these IPs are allowed to override their IP addresses and ports (for logging and for authentication checks). disable_plaintext_auth is also ignored for these networks. Typically you'd specify your IMAP proxy servers here.


 login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c:: Space-separated list of elements we want to log. The elements which have a non-empty variable value are joined together to form a comma-separated string.


 login_log_format = %$: %s:: Login log format. %$ contains login_log_format_elements string, %s contains the data we want to log.

== Mailbox locations and namespaces ==

 mail_location = :: Location for users' mailboxes. This is the same as the old default_mail_env setting. The default is empty, which means that Dovecot tries to find the mailboxes automatically. This won't work if the user doesn't have any mail yet, so you should explicitly tell Dovecot the full location.

If you're using mbox, giving a path to the INBOX file (eg. /var/mail/%u) isn't enough. You'll also need to tell Dovecot where the other mailboxes are kept. This is called the "root mail directory", and it must be the first path given in the mail_location setting.

There are a few special variables you can use, eg.:


{{{
# %u - username
# %n - user part in user@domain, same as %u if there's no domain
# %d - domain part in user@domain, empty if there's no domain
# %h - home directory }}}



See [[Variables]] for full list/ Some examples:


{{{
# mail_location = maildir:~/Maildir
# mail_location = mbox:~/mail:INBOX=/var/mail/%u
# mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n }}}



[[MailLocation]]


 namespace private {:: If you need to set multiple mailbox locations or want to change default namespace settings, you can do it by defining namespace sections.

You can have private, shared and public namespaces. Private namespaces are for user's personal mails. Shared namespaces are for accessing other users' mailboxes that have been shared. Public namespaces are for shared mailboxes that are managed by sysadmin. If you create any shared or public namespaces you'll typically want to enable ACL plugin also, otherwise all users can access all the shared mailboxes, assuming they have permissions on filesystem level to do so.

REMEMBER: If you add any namespaces, the default namespace must be added explicitly, ie. mail_location does nothing unless you have a namespace without a location setting. Default namespace is simply done by having a namespace with empty prefix.


 separator = :: Hierarchy separator to use. You should use the same separator for all namespaces or some clients get confused. '/' is usually a good one. The default however depends on the underlying mail storage format.


 prefix = :: Prefix required to access this namespace. This needs to be different for all namespaces. For example "Public/".


 location =:: Physical location of the mailbox. This is in same format as mail_location, which is also the default for it.


 inbox = no:: There can be only one INBOX, and this setting defines which namespace has it.


 hidden = yes:: If namespace is hidden, it's not advertised to clients via NAMESPACE extension. You'll most likely also want to set list=no. This is mostly useful when converting from another server with different namespaces which you want to deprecate but still keep working. For example you can create hidden namespaces with prefixes "~/mail/", "~%u/mail/" and "mail/".


 list = yes:: Show the mailboxes under this namespace with LIST command. This makes the namespace visible for clients that don't support NAMESPACE extension. "children" value lists child mailboxes, but hides the namespace prefix.


 subscriptions = yes:: Namespace handles its own subscriptions. If set to "no", the parent namespace handles them (empty prefix should always have this as "yes")


 }::


 namespace shared {:: Example shared namespace configuration


 separator = /::


 prefix = shared/%%u/:: Mailboxes are visible under "shared/user@domain/" %%n, %%d and %%u are expanded to the destination user.


 location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%u:: Mail location for other users' mailboxes. Note that %variables and ~/ expands to the logged in user's data. %%n, %%d, %%u and %%h expand to the destination user's data.


 subscriptions = no:: Use the default namespace for saving subscriptions.


 list = children:: List the shared/ namespace only if there are visible shared mailboxes.


 }::


 mail_uid =:: System user and group used to access mails. If you use multiple, userdb can override these by returning uid or gid fields. You can use either numbers or names. [[UserIds]]


 mail_gid =::


 mail_privileged_group =:: Group to enable temporarily for privileged operations. Currently this is used only with INBOX when either its initial creation or dotlocking fails. Typically this is set to "mail" to give access to /var/mail.


 mail_access_groups =:: Grant access to these supplementary groups for mail processes. Typically these are used to set up access to shared mailboxes. Note that it may be dangerous to set these if users can create symlinks (e.g. if "mail" group is set here, ln -s /var/mail ~/mail/var could allow a user to delete others' mailboxes, or ln -s /secret/shared/box ~/mail/mybox would allow reading it).


 mail_full_filesystem_access = no:: Allow full filesystem access to clients. There's no access checks other than what the operating system does for the active UID/GID. It works with both maildir and mboxes, allowing you to prefix mailboxes names with eg. /path/ or ~user/.

== Mail processes ==

 mail_debug = no:: Enable mail process debugging. This can help you figure out why Dovecot isn't finding your mails.


 mail_log_prefix = "%Us(%u): ":: Log prefix for mail processes. See [[Variables]] for list of possible variables you can use/


 mail_log_max_lines_per_sec = 10:: Max. number of lines a mail process is allowed to log per second before it's throttled. 0 means unlimited. Typically there's no need to change this unless you're using mail_log plugin, which may log a lot. This setting is ignored while mail_debug=yes to avoid pointless throttling.


 mmap_disable = no:: Don't use mmap() at all. This is required if you store indexes to shared filesystems (NFS or clustered filesystem).


 dotlock_use_excl = yes:: Rely on O_EXCL to work when creating dotlock files. NFS supports O_EXCL since version 3, so this should be safe to use nowadays by default.


 fsync_disable = no:: Don't use fsync() or fdatasync() calls. This makes the performance better at the cost of potential data loss if the server (or the file server) goes down.


 mail_nfs_storage = no:: Mail storage exists in NFS. Set this to yes to make Dovecot flush NFS caches whenever needed. If you're using only a single mail server this isn't needed.


 mail_nfs_index = no:: Mail index files also exist in NFS. Setting this to yes requires mmap_disable=yes and fsync_disable=no.


 lock_method = fcntl:: Locking method for index files. Alternatives are fcntl, flock and dotlock. Dotlocking uses some tricks which may create more disk I/O than other locking methods. NFS users: flock doesn't work, remember to change mmap_disable.


 mail_drop_priv_before_exec = no:: Drop all privileges before exec()ing the mail process. This is mostly meant for debugging, otherwise you don't get core dumps. It could be a small security risk if you use single UID for multiple users, as the users could ptrace() each others processes then.


 verbose_proctitle = no:: Show more verbose process titles (in ps). Currently shows user name and IP address. Useful for seeing who are actually using the IMAP processes (eg. shared mailboxes or if same uid is used for multiple accounts).


 first_valid_uid = 500:: Valid UID range for users, defaults to 500 and above. This is mostly to make sure that users can't log in as daemons or other system users. Note that denying root logins is hardcoded to dovecot binary and can't be done even if first_valid_uid is set to 0.


 last_valid_uid = 0::


 first_valid_gid = 1:: Valid GID range for users, defaults to non-root/wheel. Users having non-valid GID as primary group ID aren't allowed to log in. If user belongs to supplementary groups with non-valid GIDs, those groups are not set.


 last_valid_gid = 0::


 max_mail_processes = 512:: Maximum number of running mail processes. When this limit is reached, new users aren't allowed to log in.


 mail_process_size = 256:: Set max. process size in megabytes. Most of the memory goes to mmap()ing files, so it shouldn't harm much even if this limit is set pretty high.


 mail_max_keyword_length = 50:: Maximum allowed length for mail keyword name. It's only forced when trying to create new keywords.


 valid_chroot_dirs = :: ':' separated list of directories under which chrooting is allowed for mail processes (ie. /var/mail will allow chrooting to /var/mail/foo/bar too). This setting doesn't affect login_chroot, mail_chroot or auth chroot settings. If this setting is empty, "/./" in home dirs are ignored. WARNING: Never add directories here which local users can modify, that may lead to root exploit. Usually this should be done only if you don't allow shell access for users. [[Chrooting]]


 mail_chroot = :: Default chroot directory for mail processes. This can be overridden for specific users in user database by giving /./ in user's home directory (eg. /home/./user chroots into /home). Note that usually there is no real need to do chrooting, Dovecot doesn't allow users to access files outside their mail directory anyway. If your home directories are prefixed with the chroot directory, append "/." to mail_chroot. [[Chrooting]]

== Mailbox handling optimizations ==

 mail_cache_min_mail_count = 0:: The minimum number of mails in a mailbox before updates are done to cache file. This allows optimizing Dovecot's behavior to do less disk writes at the cost of more disk reads.


 mailbox_idle_check_interval = 30:: When IDLE command is running, mailbox is checked once in a while to see if there are any new mails or other changes. This setting defines the minimum time in seconds to wait between those checks. Dovecot can also use dnotify, inotify and kqueue to find out immediately when changes occur.


 mail_save_crlf = no:: Save mails with CR+LF instead of plain LF. This makes sending those mails take less CPU, especially with sendfile() syscall with Linux and FreeBSD. But it also creates a bit more disk I/O which may just make it slower. Also note that if other software reads the mboxes/maildirs, they may handle the extra CRs wrong and cause problems.

== Maildir-specific settings ==

 maildir_stat_dirs = no:: By default LIST command returns all entries in maildir beginning with a dot. Enabling this option makes Dovecot return only entries which are directories. This is done by stat()ing each entry, so it causes more disk I/O. (For systems setting struct dirent->d_type, this check is free and it's done always regardless of this setting)


 maildir_copy_with_hardlinks = yes:: When copying a message, do it with hard links whenever possible. This makes the performance much better, and it's unlikely to have any side effects.


 maildir_copy_preserve_filename = no:: When copying a message, try to preserve the base filename. Only if the destination mailbox already contains the same name (ie. the mail is being copied there twice), a new name is given. The destination filename check is done only by looking at dovecot-uidlist file, so if something outside Dovecot does similar filename preserving copies, you may run into problems. NOTE: This setting requires maildir_copy_with_hardlinks = yes to work.


 maildir_very_dirty_syncs = no:: Assume Dovecot is the only MUA accessing Maildir: Scan cur/ directory only when its mtime changes unexpectedly or when we can't find the mail otherwise.

== mbox-specific settings ==

 mbox_read_locks = fcntl:: Which locking methods to use for locking mbox. There are four available:
{{{
# dotlock: Create <mailbox>.lock file. This is the oldest and most NFS-safe
# solution. If you want to use /var/mail/ like directory, the users
# will need write access to that directory.
# dotlock_try: Same as dotlock, but if it fails because of permissions or
# because there isn't enough disk space, just skip it.
# fcntl : Use this if possible. Works with NFS too if lockd is used.
# flock : May not exist in all systems. Doesn't work with NFS.
# lockf : May not exist in all systems. Doesn't work with NFS. }}}



You can use multiple locking methods; if you do the order they're declared in is important to avoid deadlocks if other MTAs/MUAs are using multiple locking methods as well. Some operating systems don't allow using some of them simultaneously.


 mbox_write_locks = dotlock fcntl::


 mbox_lock_timeout = 300:: Maximum time in seconds to wait for lock (all of them) before aborting.


 mbox_dotlock_change_timeout = 120:: If dotlock exists but the mailbox isn't modified in any way, override the lock file after this many seconds.


 mbox_dirty_syncs = yes:: When mbox changes unexpectedly we have to fully read it to find out what changed. If the mbox is large this can take a long time. Since the change is usually just a newly appended mail, it'd be faster to simply read the new mails. If this setting is enabled, Dovecot does this but still safely fallbacks to re-reading the whole mbox file whenever something in mbox isn't how it's expected to be. The only real downside to this setting is that if some other MUA changes message flags, Dovecot doesn't notice it immediately. Note that a full sync is done with SELECT, EXAMINE, EXPUNGE and CHECK commands.


 mbox_very_dirty_syncs = no:: Like mbox_dirty_syncs, but don't do full syncs even with SELECT, EXAMINE, EXPUNGE or CHECK commands. If this is set, mbox_dirty_syncs is ignored.


 mbox_lazy_writes = yes:: Delay writing mbox headers until doing a full write sync (EXPUNGE and CHECK commands and when closing the mailbox). This is especially useful for POP3 where clients often delete all mails. The downside is that our changes aren't immediately visible to other MUAs.


 mbox_min_index_size = 0:: If mbox size is smaller than this (in kilobytes), don't write index files. If an index file already exists it's still read, just not updated.

== dbox-specific settings ==

 dbox_rotate_size = 2048:: Maximum dbox file size in kilobytes until it's rotated.


 dbox_rotate_min_size = 16:: Minimum dbox file size in kilobytes before it's rotated (overrides dbox_rotate_days)


 dbox_rotate_days = 0:: Maximum dbox file age in days until it's rotated. Day always begins from midnight, so 1 = today, 2 = yesterday, etc. 0 = check disabled.

== IMAP specific settings ==

 protocol imap {::


 login_executable = /usr/libexec/dovecot/imap-login:: Login executable location.


 mail_executable = /usr/libexec/dovecot/imap:: IMAP executable location. Changing this allows you to execute other binaries before the imap process is executed.

This would write rawlogs into user's ~/dovecot.rawlog/, if it exists:
{{{
# mail_executable = /usr/libexec/dovecot/rawlog /usr/libexec/dovecot/imap }}}

[[Debugging/Rawlog]]

This would attach gdb into the imap process and write backtraces into /tmp/gdbhelper.* files:
{{{
# mail_executable = /usr/libexec/dovecot/gdbhelper /usr/libexec/dovecot/imap }}}




 imap_max_line_length = 65536:: Maximum IMAP command line length in bytes. Some clients generate very long command lines with huge mailboxes, so you may need to raise this if you get "Too long argument" or "IMAP command line too large" errors often.


 mail_max_userip_connections = 10:: Maximum number of IMAP connections allowed for a user from each IP address. NOTE: The username is compared case-sensitively.


 mail_plugins = :: Support for dynamically loadable plugins. mail_plugins is a space separated list of plugins to load.


 mail_plugin_dir = /usr/lib/dovecot/imap::


 imap_logout_format = bytes=%i/%o:: IMAP logout format string:
{{{
# %i - total number of bytes read from client
# %o - total number of bytes sent to client }}}


 imap_capability = :: Override the IMAP CAPABILITY response.


 imap_idle_notify_interval = 120:: How many seconds to wait between "OK Still here" notifications when client is IDLEing.


 imap_id_send = :: ID field names and values to send to clients. Using * as the value makes Dovecot use the default value. The following fields have default values currently: name, version, os, os-version, support-url, support-email.


 imap_id_log =:: ID fields sent by client to log. * means everything.


 imap_client_workarounds = :: Workarounds for various client bugs:
{{{
# delay-newmail:
# Send EXISTS/RECENT new mail notifications only when replying to NOOP
# and CHECK commands. Some clients ignore them otherwise, for example OSX
# Mail (<v2.1). Outlook Express breaks more badly though, without this it
# may show user "Message no longer in server" errors. Note that OE6 still
# breaks even with this workaround if synchronization is set to
# "Headers Only".
# netscape-eoh:
# Netscape 4.x breaks if message headers don't end with the empty "end of
# headers" line. Normally all messages have this, but setting this
# workaround makes sure that Netscape never breaks by adding the line if
# it doesn't exist. This is done only for FETCH BOD{{{[HEADER.FIELDS..]}}}
# commands. Note that RFC says this shouldn't be done.
# tb-extra-mailbox-sep:
# With mbox storage a mailbox can contain either mails or submailboxes,
# but not both. Thunderbird separates these two by forcing server to
# accept '/' suffix in mailbox names in subscriptions list. }}}

The list is space-separated.


 }::

== POP3 specific settings ==

 protocol pop3 {::


 login_executable = /usr/libexec/dovecot/pop3-login:: Login executable location.


 mail_executable = /usr/libexec/dovecot/pop3:: POP3 executable location. See IMAP's mail_executable above for examples how this could be changed.


 pop3_no_flag_updates = no:: Don't try to set mails non-recent or seen with POP3 sessions. This is mostly intended to reduce disk I/O. With maildir it doesn't move files from new/ to cur/, with mbox it doesn't write Status-header.


 pop3_enable_last = no:: Support LAST command which exists in old POP3 specs, but has been removed from new ones. Some clients still wish to use this though. Enabling this makes RSET command clear all \Seen flags from messages.


 pop3_reuse_xuidl = no:: If mail has X-UIDL header, use it as the mail's UIDL.


 pop3_lock_session = no:: Keep the mailbox locked for the entire POP3 session.


 pop3_uidl_format = %08Xu%08Xv:: POP3 UIDL (unique mail identifier) format to use. You can use following variables, along with the variable modifiers described in [[Variables]] (e/g. %Uf for the filename in uppercase)


{{{
# %v - Mailbox's IMAP UIDVALIDITY
# %u - Mail's IMAP UID
# %m - MD5 sum of the mailbox headers in hex (mbox only)
# %f - filename (maildir only) }}}



If you want UIDL compatibility with other POP3 servers, use:
{{{
# UW's ipop3d : %08Xv%08Xu
# Courier : %f or %v-%u (both might be used simultaneosly)
# Cyrus (<= 2.1.3) : %u
# Cyrus (>= 2.1.4) : %v.%u
# Dovecot v0.99.x : %v.%u
# tpop3d : %Mf }}}



Note that Outlook 2003 seems to have problems with %v.%u format which was Dovecot's default, so if you're building a new server it would be a good idea to change this. %08Xu%08Xv should be pretty fail-safe.


 pop3_save_uidl = no:: Permanently save UIDLs sent to POP3 clients, so pop3_uidl_format changes won't change those UIDLs. Currently this works only with Maildir.


 pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s:: POP3 logout format string:
{{{
# %i - total number of bytes read from client
# %o - total number of bytes sent to client
# %t - number of TOP commands
# %p - number of bytes sent to client as a result of TOP command
# %r - number of RETR commands
# %b - number of bytes sent to client as a result of RETR command
# %d - number of deleted messages
# %m - number of messages (before deletion)
# %s - mailbox size in bytes (before deletion) }}}


 mail_max_userip_connections = 3:: Maximum number of POP3 connections allowed for a user from each IP address. NOTE: The username is compared case-sensitively.


 mail_plugins = :: Support for dynamically loadable plugins. mail_plugins is a space separated list of plugins to load.


 mail_plugin_dir = /usr/lib/dovecot/pop3::


 pop3_client_workarounds = :: Workarounds for various client bugs:
{{{
# outlook-no-nuls:
# Outlook and Outlook Express hang if mails contain NUL characters.
# This setting replaces them with 0x80 character.
# oe-ns-eoh:
# Outlook Express and Netscape Mail breaks if end of headers-line is
# missing. This option simply sends it if it's missing. }}}

The list is space-separated.


 }::

== LDA specific settings ==

 protocol lda {::


 postmaster_address =:: Address to use when sending rejection mails (e.g. postmaster@example.com).


 hostname = :: Hostname to use in various parts of sent mails, eg. in Message-Id. Default is the system's real hostname.


 mail_plugins = :: Support for dynamically loadable plugins. mail_plugins is a space separated list of plugins to load.


 mail_plugin_dir = /usr/lib/dovecot/lda::


 quota_full_tempfail = no:: If user is over quota, return with temporary failure instead of bouncing the mail.


 deliver_log_format = msgid=%m: %$:: Format to use for logging mail deliveries. You can use variables:
{{{
# %$ - Delivery status message (e.g. "saved to INBOX")
# %m - Message-ID
# %s - Subject
# %f - From address }}}


 sendmail_path = /usr/lib/sendmail:: Binary to use for sending mails.


 rejection_subject = Rejected: %s:: Subject: header to use for rejection mails. You can use the same variables as for rejection_reason below.


 rejection_reason = Your message to <%t> was automatically rejected:%n%r:: Human readable error message for rejection mails. You can use variables:
{{{
# %n = CRLF, %r = reason, %s = original subject, %t = recipient }}}


 auth_socket_path = /var/run/dovecot/auth-master:: UNIX socket path to master authentication server to find users.


 }::

== Authentication processes ==

 auth_executable = /usr/libexec/dovecot/dovecot-auth:: Executable location


 auth_process_size = 256:: Set max. process size in megabytes.


 auth_cache_size = 0:: Authentication cache size in kilobytes. 0 means it's disabled. Note that bsdauth, PAM and vpopmail require cache_key to be set for caching to be used.


 auth_cache_ttl = 3600:: Time to live in seconds for cached data. After this many seconds the cached record is no longer used, *except* if the main database lookup returns internal failure. We also try to handle password changes automatically: If user's previous authentication was successful, but this one wasn't, the cache isn't used. For now this works only with plaintext authentication.


 auth_cache_negative_ttl = 3600:: TTL for negative hits (user not found, password mismatch). 0 disables caching them completely.


 auth_realms =:: Space separated list of realms for SASL authentication mechanisms that need them. You can leave it empty if you don't want to support multiple realms. Many clients simply use the first one listed here, so keep the default realm first.


 auth_default_realm = :: Default realm/domain to use if none was specified. This is used for both SASL realms and appending @domain to username in plaintext logins.


 auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@:: List of allowed characters in username. If the user-given username contains a character not listed in here, the login automatically fails. This is just an extra check to make sure user can't exploit any potential quote escaping vulnerabilities with SQL/LDAP databases. If you want to allow all characters, set this value to empty.


 auth_username_translation =:: Username character translations before it's looked up from databases. The value contains series of from -> to characters. For example "#@/@" means that '#' and '/' characters are translated to '@'.


 auth_username_format =:: Username formatting before it's looked up from databases. You can use the standard variables here, eg. %Lu would lowercase the username, %n would drop away the domain if it was given, or "%n-AT-%d" would change the '@' into "-AT-". This translation is done after auth_username_translation changes.


 auth_master_user_separator =:: If you want to allow master users to log in by specifying the master username within the normal username string (ie. not using SASL mechanism's support for it), you can specify the separator character here. The format is then <username><separator><master username>. UW-IMAP uses "*" as the separator, so that could be a good choice.


 auth_anonymous_username = anonymous:: Username to use for users logging in with ANONYMOUS SASL mechanism


 auth_verbose = no:: Log unsuccessful authentication attempts and the reasons why they failed.


 auth_debug = no:: Even more verbose logging for debugging purposes. Shows for example SQL queries.


 auth_debug_passwords = no:: In case of password mismatches, log the passwords and used scheme so the problem can be debugged. Enabling this also enables auth_debug.


 auth_worker_max_count = 30:: Maximum number of dovecot-auth worker processes. They're used to execute blocking passdb and userdb queries (eg. MySQL and PAM). They're automatically created and destroyed as needed.


 auth_gssapi_hostname =:: Host name to use in GSSAPI principal names. The default is to use the name returned by gethostname(). Use "$ALL" to allow all keytab entries.


 auth_krb5_keytab = :: Kerberos keytab to use for the GSSAPI mechanism. Will use the system default (usually /etc/krb5.keytab) if not specified.


 auth_use_winbind = no:: Do NTLM and GSS-SPNEGO authentication using Samba's winbind daemon and ntlm_auth helper. [[Authentication/Mechanisms/Winbind]]


 auth_winbind_helper_path = /usr/bin/ntlm_auth:: Path for Samba's ntlm_auth helper binary.


 auth_failure_delay = 2:: Number of seconds to delay before replying to failed authentications.


 auth default {::


 mechanisms = plain:: Space separated list of wanted authentication mechanisms:
{{{
# plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
# gss-spnego }}}

NOTE: See also disable_plaintext_auth setting.

Password database is used to verify user's password (and nothing more). You can have multiple passdbs and userdbs. This is useful if you want to allow both system users (/etc/passwd) and virtual users to login without duplicating the system users into virtual database.

[[PasswordDatabase]]

By adding master=yes setting inside a passdb you make the passdb a list of "master users", who can log in as anyone else. Unless you're using PAM, you probably still want the destination user to be looked up from passdb that it really exists. This can be done by adding pass=yes setting to the master passdb. [[Authentication/MasterUsers]]

Users can be temporarily disabled by adding a passdb with deny=yes. If the user is found from that database, authentication will fail. The deny passdb should always be specified before others, so it gets checked first. Here's an example:


 passdb passwd-file {::


 args = /etc/dovecot.deny:: File contains a list of usernames, one per line


 deny = yes::


 }::


 passdb pam {:: PAM authentication. Preferred nowadays by most systems. Note that PAM can only be used to verify if user's password is correct, so it can't be used as userdb. If you don't want to use a separate user database (passwd usually), you can use static userdb. REMEMBER: You'll need /etc/pam.d/dovecot file created for PAM authentication to actually work. [[PasswordDatabase/PAM]]


 args = dovecot:: [session=yes]{{{[setcred=yes]}}}{{{[failure_show_msg=yes]}}}{{{[max_requests=<n>]}}}{{{[cache_key=<key>]}}}{{{[<service name>]}}}

session=yes makes Dovecot open and immediately close PAM session. Some PAM plugins need this to work, such as pam_mkhomedir.

setcred=yes makes Dovecot establish PAM credentials if some PAM plugins need that. They aren't ever deleted though, so this isn't enabled by default.

max_requests specifies how many PAM lookups to do in one process before recreating the process. The default is 100, because many PAM plugins leak memory.

cache_key can be used to enable authentication caching for PAM (auth_cache_size also needs to be set). It isn't enabled by default because PAM modules can do all kinds of checks besides checking password, such as checking IP address. Dovecot can't know about these checks without some help. cache_key is simply a list of variables (see doc/wiki/Variables.txt) which must match for the cached data to be used. Here are some examples:
{{{
# %u - Username must match. Probably sufficient for most uses.
# %u%r - Username and remote IP address must match.
# %u%s - Username and service (ie. IMAP, POP3) must match. }}}



The service name can contain variables, for example %Ls expands to pop3 or imap.

Some examples:
{{{
# args = session=yes %Ls
# args = cache_key=%u dovecot }}}


 }::


 passdb passwd {:: System users (NSS, /etc/passwd, or similiar) In many systems nowadays this uses Name Service Switch, which is configured in /etc/nsswitch.conf. [[AuthDatabase/Passwd]]


 args = :: [blocking=yes] - See userdb passwd for explanation


 }::


 passdb shadow {:: Shadow passwords for system users (NSS, /etc/shadow or similiar). Deprecated by PAM nowadays. [[PasswordDatabase/Shadow]]


 args = :: [blocking=yes] - See userdb passwd for explanation


 }::


 passdb bsdauth {:: PAM-like authentication for OpenBSD. [[PasswordDatabase/BSDAuth]]


 args =:: [cache_key=<key>] - See cache_key in PAM for explanation.


 }::


 passdb passwd-file {:: passwd-like file with specified location [[AuthDatabase/PasswdFile]]


 args = :: [scheme=<default password scheme>]{{{[username_format=<format>]}}} <Path for passwd-file>


 }::


 passdb checkpassword {:: checkpassword executable authentication NOTE: You will probably want to use "userdb prefetch" with this. [[AuthDatabase/CheckPassword]]


 args = :: Path for checkpassword binary


 }::


 passdb sql {:: SQL database [[AuthDatabase/SQL]]


 args = :: Path for SQL configuration file, see doc/dovecot-sql-example.conf


 }::


 passdb ldap {:: LDAP database [[AuthDatabase/LDAP]]


 args = :: Path for LDAP configuration file, see doc/dovecot-ldap-example.conf


 }::


 passdb vpopmail {:: vpopmail authentication [[AuthDatabase/VPopMail]]


 args =:: [cache_key=<key>] - See cache_key in PAM for explanation.{{{[quota_template=<template>]}}} - %q expands to Maildir++ quota
{{{
# (eg. quota_template=quota_rule=*:backend=%q) }}}


 }::

User database specifies where mails are located and what user/group IDs own them. For single-UID configuration use "static".

[[UserDatabase]]


 userdb prefetch {:: "prefetch" user database means that the passdb already provided the needed information and there's no need to do a separate userdb lookup. This can be made to work with SQL and LDAP databases, see their example configuration files for more information how to do it. [[UserDatabase/Prefetch]]


 }::


 userdb passwd {:: System users (NSS, /etc/passwd, or similiar). In many systems nowadays this uses Name Service Switch, which is configured in /etc/nsswitch.conf. [[AuthDatabase/Passwd]]


 args = :: [blocking=yes] - By default the lookups are done in the main dovecot-auth process. This setting causes the lookups to be done in auth worker proceses. Useful with remote NSS lookups that may block. NOTE: Be sure to use this setting with nss_ldap or users might get logged in as each others!


 }::


 userdb passwd-file {:: passwd-like file with specified location [[AuthDatabase/PasswdFile]]


 args =:: [username_format=<format>] <Path for passwd-file>


 }::


 userdb checkpassword {:: checkpassword executable user database lookup [[AuthDatabase/CheckPassword]]


 args = :: Path for checkpassword binary


 }::


 userdb static {:: static settings generated from template [[UserDatabase/Static]]


 args =:: Template for the fields. Can return anything a userdb could normally return. For example:


{{{
# args = uid=500 gid=500 home=/var/mail/%u }}}



If you use deliver, it needs to look up users only from the userdb. This of course doesn't work with static because there is no list of users. Normally static userdb handles this by doing a passdb lookup. This works with most passdbs, with PAM being the most notable exception. If you do the user verification another way, you can add allow_all_users=yes to the args in which case the passdb lookup is skipped.


 }::


 userdb sql {:: SQL database [[AuthDatabase/SQL]]


 args = :: Path for SQL configuration file, see doc/dovecot-sql-example.conf


 }::


 userdb ldap {:: LDAP database [[AuthDatabase/LDAP]]


 args = :: Path for LDAP configuration file, see doc/dovecot-ldap-example.conf


 }::


 userdb vpopmail {:: vpopmail [[AuthDatabase/VPopMail]]


 }::


 user = root:: User to use for the process. This user needs access to only user and password databases, nothing else. Only shadow and pam authentication requires roots, so use something else if possible. Note that passwd authentication with BSDs internally accesses shadow files, which also requires roots. Note that this user is NOT used to access mails. That user is specified by userdb above.


 chroot = :: Directory where to chroot the process. Most authentication backends don't work if this is set, and there's no point chrooting if auth_user is root. Note that valid_chroot_dirs isn't needed to use this setting.


 count = 1:: Number of authentication processes to create


 ssl_require_client_cert = no:: Require a valid SSL client certificate or the authentication fails.


 ssl_username_from_cert = no:: Take the username from client's SSL certificate, using X509_NAME_get_text_by_NID() which returns the subject's DN's CommonName.


 socket listen {:: It's possible to export the authentication interface to other programs:


 master {::


 path = /var/run/dovecot/auth-master:: Master socket provides access to userdb information. It's typically used to give Dovecot's local delivery agent access to userdb so it can find mailbox locations.


 mode = 0600::


 user = :: Default user/group is the one who started dovecot-auth (root)


 group = ::


 }::


 client {::


 path = /var/run/dovecot/auth-client:: The client socket is generally safe to export to everyone. Typical use is to export it to your SMTP server so it can do SMTP AUTH lookups using it.


 mode = 0660::


 }::


 }::


 }::


 auth external {:: If you wish to use another authentication server than dovecot-auth, you can use connect sockets. They are assumed to be already running, Dovecot's master process only tries to connect to them. They don't need any other settings than the path for the master socket, as the configuration is done elsewhere. Note that the client sockets must exist in the login_dir.


 }::
{{{
# socket connect {
# master {
# path = /var/run/dovecot/auth-master
# }
# } }}}

== Dictionary server settings ==
Dictionary can be used by some plugins to store key=value lists, such as quota, expire and acl plugins. The dictionary can be used either directly or though a dictionary server. The following dict block maps dictionary names to URIs when the server is used. These can then be referenced using URIs in format "proxy::<name>".


 dict {::


 quota = mysql:/etc/dovecot-dict-quota.conf ::


 expire = db:/var/lib/dovecot/expire.db::


 }::


 dict_db_config = :: Path to Berkeley DB's configuration file. See doc/dovecot-db-example.conf

== Plugin settings ==

 plugin {::

Here you can give some extra environment variables to mail processes. This is mostly meant for passing parameters to plugins. %variable expansion is done for all values.


 quota = maildir:: Quota plugin. Multiple backends are supported:
{{{
# dirsize: Find and sum all the files found from mail directory.
# Extremely SLOW with Maildir. It'll eat your CPU and disk I/O.
# dict: Keep quota stored in dictionary (eg. SQL)
# maildir: Maildir++ quota
# fs: Read-only support for filesystem quota }}}



Quota limits are set using "quota_rule" parameters, either in here or in userdb. It's also possible to give mailbox-specific limits, for example:
{{{
# quota_rule = *:storage=1048576
# quota_rule2 = Trash:storage=102400 }}}

User has now 1GB quota, but when saving to Trash mailbox the user gets additional 100MB.

Multiple quota roots are also possible, for example:
{{{
# quota = dict:user::proxy::quota
# quota2 = dict:domain:%d:proxy::quota_domain
# quota_rule = *:storage=102400
# quota2_rule = *:storage=1048576 }}}

Gives each user their own 100MB quota and one shared 1GB quota within the domain.

You can execute a given command when user exceeds a specified quota limit. Each quota root has separate limits. Only the command for the first exceeded limit is excecuted, so put the highest limit first. Note that % needs to be escaped as %%, otherwise "% " expands to empty.
{{{
# quota_warning = storage=95%% /usr/local/bin/quota-warning.sh 95
# quota_warning2 = storage=80%% /usr/local/bin/quota-warning.sh 80 }}}


 acl = vfile:/etc/dovecot-acls:cache_secs=300:: ACL plugin. vfile backend reads ACLs from "dovecot-acl" file from maildir directory. You can also optionally give a global ACL directory path where ACLs are applied to all users' mailboxes. The global ACL directory contains one file for each mailbox, eg. INBOX or sub.mailbox. cache_secs parameter specifies how many seconds to wait between stat()ing dovecot-acl file to see if it changed.


 acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes:: To let users LIST mailboxes shared by other users, Dovecot needs a shared mailbox dictionary. For example:


 convert_mail = mbox:%h/mail:: Convert plugin. If set, specifies the source storage path which is converted to destination storage (mail_location) when the user logs in. The existing mail directory is renamed to <dir>-converted.


 convert_skip_broken_mailboxes = no:: Skip mailboxes which we can't open successfully instead of aborting.


 convert_skip_dotdirs = no:: Skip directories beginning with '.'


 convert_alt_hierarchy_char = _:: If source storage has mailbox names with destination storage's hierarchy separators, replace them with this character.


 trash = /etc/dovecot-trash.conf:: Trash plugin. When saving a message would make user go over quota, this plugin automatically deletes the oldest mails from configured mailboxes until the message can be saved within quota limits. The configuration file is a text file where each line is in format: <priority> <mailbox name> Mails are first deleted in lowest -> highest priority number order


 expire = Trash 7 Spam 30:: Expire plugin. Mails are expunged from mailboxes after being there the configurable time. The first expiration date for each mailbox is stored in a dictionary so it can be quickly determined which mailboxes contain expired mails. The actual expunging is done in a nightly cronjob, which you must set up:
{{{
# dovecot --exec-mail ext /usr/libexec/dovecot/expire-tool }}}


 expire_dict = proxy::expire::


 lazy_expunge = .EXPUNGED/ .DELETED/ .DELETED/.EXPUNGED/:: Lazy expunge plugin. Currently works only with maildirs. When a user expunges mails, the mails are moved to a mailbox in another namespace (1st). When a mailbox is deleted, the mailbox is moved to another namespace (2nd) as well. Also if the deleted mailbox had any expunged messages, they're moved to a 3rd namespace. The mails won't be counted in quota, and they're not deleted automatically (use a cronjob or something).


 mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename:: Events to log. Also available: flag_change append


 mail_log_group_events = no:: Group events within a transaction to one line.


 mail_log_fields = uid box msgid size:: Available fields: uid, box, msgid, from, subject, size, vsize, flags size and vsize are available only for expunge and copy events.


 }::


 !include /etc/dovecot/conf.d/*.conf:: Config files can also be included. deliver doesn't support them currently.


 !include_try /etc/dovecot/extra.conf:: Optional configurations, don't give an error if it's not found:

Dovecot configuration file

If you're in a hurry, see QuickConfiguration

"dovecot -n" command gives a clean output of the changed settings. Use it instead of copy&pasting this file when posting to the Dovecot mailing list.

'#' character and everything after it is treated as comments. Extra spaces and tabs are ignored. If you want to use either of these explicitly, put the value inside quotes, eg.: key = "# char and trailing whitespace "

Default values are shown for each setting, it's not required to uncomment those. These are exceptions to this though: No sections (e.g. namespace {}) or plugin settings are added by default, they're listed only as examples. Paths are also just examples with the real defaults being based on configure options. The paths listed here are for configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-ssldir=/etc/ssl

base_dir = /var/run/dovecot/
Base directory where to store runtime data.
protocols = imap imaps
Protocols we want to be serving: imap imaps pop3 pop3s If you only want to use dovecot-auth, you can set this to "none".
listen = *

A space separated list of IP or host addresses where to listen in for connections. "*" listens in all IPv4 interfaces. [::]" listens in all IPv6 interfaces. Use "*,[::]" for listening both IPv4 and IPv6.

If you want to specify ports for each service, you will need to configure these settings inside the protocol imap/pop3 { ... } section, so you can specify different ports for IMAP/POP3. For example:

#   protocol imap {
#     listen = *:10143
#     ssl_listen = *:10943
#     ..
#   }
#   protocol pop3 {
#     listen = *:10100
#     ..
#   } 
disable_plaintext_auth = yes
Disable LOGIN command and all other plaintext authentications unless SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP matches the local IP (ie. you're connecting from the same computer), the connection is considered secure and plaintext authentication is allowed.
shutdown_clients = yes
Should all IMAP and POP3 processes be killed when Dovecot master process shuts down. Setting this to "no" means that Dovecot can be upgraded without forcing existing client connections to close (although that could also be a problem if the upgrade is eg. because of a security fix). This however means that after master process has died, the client processes can't write to log files anymore.

Logging

log_path =
Log file to use for error messages, instead of sending them to syslog. /dev/stderr can be used to log into stderr.
info_log_path =
Log file to use for informational and debug messages. Default is the same as log_path.
log_timestamp = "%b %d %H:%M:%S "
Prefix for each line written to log file. % codes are in strftime(3) format.
syslog_facility = mail
Syslog facility to use if you're logging to syslog. Usually if you don't want to use "mail", you'll use local0..local7. Also other standard facilities are supported.

SSL settings

ssl_listen =
IP or host address where to listen in for SSL connections. Remember to also add imaps and/or pop3s to protocols setting. Defaults to same as "listen" setting if not specified.
ssl = yes

SSL/TLS support: yes, no, required. SSL

ssl_cert_file = /etc/ssl/certs/dovecot.pem
PEM encoded X.509 SSL/TLS certificate and private key. They're opened before dropping root privileges, so keep the key file unreadable by anyone but root. Included doc/mkcert.sh can be used to easily generate self-signed certificate, just make sure to update the domains in dovecot-openssl.cnf
ssl_key_file = /etc/ssl/private/dovecot.pem
ssl_key_password =

If key file is password protected, give the password here. Alternatively give it when starting dovecot with -p parameter. Since this file is often world-readable, you may want to place this setting instead to a different root owned 0600 file by using !include_try <path>.

ssl_ca_file =
File containing trusted SSL certificate authorities. Set this only if you intend to use ssl_verify_client_cert=yes. The CAfile should contain the CA-certificate(s) followed by the matching CRL(s).
ssl_verify_client_cert = no
Request client to send a certificate. If you also want to require it, set ssl_require_client_cert=yes in auth section.
ssl_cert_username_field = commonName
Which field from certificate to use for username. commonName and x500UniqueIdentifier are the usual choices. You'll also need to set ssl_username_from_cert=yes.
ssl_parameters_regenerate = 168
How often to regenerate the SSL parameters file. Generation is quite CPU intensive operation. The value is in hours, 0 disables regeneration entirely.
ssl_cipher_list = ALL:!LOW:!SSLv2
SSL ciphers to use
verbose_ssl = no
Show protocol level SSL errors.

Login processes

LoginProcess

login_dir = /var/run/dovecot/login
Directory where authentication process places authentication UNIX sockets which login needs to be able to connect to. The sockets are created when running as root, so you don't have to worry about permissions. Note that everything in this directory is deleted when Dovecot is started.
login_chroot = yes

chroot login process to the login_dir. Only reason not to do this is if you wish to run the whole Dovecot without roots. Rootless

login_user = dovecot

User to use for the login process. Create a completely new user for this, and don't use it anywhere else. The user must also belong to a group where only it has access, it's used to control access for authentication process. Note that this user is NOT used to access mails. UserIds

login_process_size = 64
Set max. process size in megabytes. If you don't use login_process_per_connection you might need to grow this.
login_process_per_connection = yes
Should each login be processed in it's own process (yes), or should one login process be allowed to process multiple connections (no)? Yes is more secure, espcially with SSL/TLS enabled. No is faster since there's no need to create processes all the time.
login_processes_count = 3
Number of login processes to keep for listening new connections.
login_max_processes_count = 128
Maximum number of login processes to create. The listening process count usually stays at login_processes_count, but when multiple users start logging in at the same time more extra processes are created. To prevent fork-bombing we check only once in a second if new processes should be created - if all of them are used at the time, we double their amount until the limit set by this setting is reached.
login_max_connections = 256
Maximum number of connections allowed per each login process. This setting is used only if login_process_per_connection=no. Once the limit is reached, the process notifies master so that it can create a new login process.
login_greeting = Dovecot ready.
Greeting message for clients.
login_trusted_networks =
Space separated list of trusted network ranges. Connections from these IPs are allowed to override their IP addresses and ports (for logging and for authentication checks). disable_plaintext_auth is also ignored for these networks. Typically you'd specify your IMAP proxy servers here.
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
Space-separated list of elements we want to log. The elements which have a non-empty variable value are joined together to form a comma-separated string.
login_log_format = %$: %s
Login log format. %$ contains login_log_format_elements string, %s contains the data we want to log.

Mailbox locations and namespaces

mail_location =
Location for users' mailboxes. This is the same as the old default_mail_env setting. The default is empty, which means that Dovecot tries to find the mailboxes automatically. This won't work if the user doesn't have any mail yet, so you should explicitly tell Dovecot the full location.

If you're using mbox, giving a path to the INBOX file (eg. /var/mail/%u) isn't enough. You'll also need to tell Dovecot where the other mailboxes are kept. This is called the "root mail directory", and it must be the first path given in the mail_location setting.

There are a few special variables you can use, eg.:

#   %u - username
#   %n - user part in user@domain, same as %u if there's no domain
#   %d - domain part in user@domain, empty if there's no domain
#   %h - home directory 

See Variables for full list/ Some examples:

#   mail_location = maildir:~/Maildir
#   mail_location = mbox:~/mail:INBOX=/var/mail/%u
#   mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n 

MailLocation

namespace private {
If you need to set multiple mailbox locations or want to change default namespace settings, you can do it by defining namespace sections.

You can have private, shared and public namespaces. Private namespaces are for user's personal mails. Shared namespaces are for accessing other users' mailboxes that have been shared. Public namespaces are for shared mailboxes that are managed by sysadmin. If you create any shared or public namespaces you'll typically want to enable ACL plugin also, otherwise all users can access all the shared mailboxes, assuming they have permissions on filesystem level to do so.

REMEMBER: If you add any namespaces, the default namespace must be added explicitly, ie. mail_location does nothing unless you have a namespace without a location setting. Default namespace is simply done by having a namespace with empty prefix.

separator =
Hierarchy separator to use. You should use the same separator for all namespaces or some clients get confused. '/' is usually a good one. The default however depends on the underlying mail storage format.
prefix =
Prefix required to access this namespace. This needs to be different for all namespaces. For example "Public/".
location =
Physical location of the mailbox. This is in same format as mail_location, which is also the default for it.
inbox = no
There can be only one INBOX, and this setting defines which namespace has it.
hidden = yes
If namespace is hidden, it's not advertised to clients via NAMESPACE extension. You'll most likely also want to set list=no. This is mostly useful when converting from another server with different namespaces which you want to deprecate but still keep working. For example you can create hidden namespaces with prefixes "~/mail/", "~%u/mail/" and "mail/".
list = yes
Show the mailboxes under this namespace with LIST command. This makes the namespace visible for clients that don't support NAMESPACE extension. "children" value lists child mailboxes, but hides the namespace prefix.
subscriptions = yes
Namespace handles its own subscriptions. If set to "no", the parent namespace handles them (empty prefix should always have this as "yes")
}
namespace shared {
Example shared namespace configuration
separator = /
prefix = shared/%%u/
Mailboxes are visible under "shared/user@domain/" %%n, %%d and %%u are expanded to the destination user.
location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%u
Mail location for other users' mailboxes. Note that %variables and ~/ expands to the logged in user's data. %%n, %%d, %%u and %%h expand to the destination user's data.
subscriptions = no
Use the default namespace for saving subscriptions.
list = children
List the shared/ namespace only if there are visible shared mailboxes.
}
mail_uid =

System user and group used to access mails. If you use multiple, userdb can override these by returning uid or gid fields. You can use either numbers or names. UserIds

mail_gid =
mail_privileged_group =
Group to enable temporarily for privileged operations. Currently this is used only with INBOX when either its initial creation or dotlocking fails. Typically this is set to "mail" to give access to /var/mail.
mail_access_groups =
Grant access to these supplementary groups for mail processes. Typically these are used to set up access to shared mailboxes. Note that it may be dangerous to set these if users can create symlinks (e.g. if "mail" group is set here, ln -s /var/mail ~/mail/var could allow a user to delete others' mailboxes, or ln -s /secret/shared/box ~/mail/mybox would allow reading it).
mail_full_filesystem_access = no
Allow full filesystem access to clients. There's no access checks other than what the operating system does for the active UID/GID. It works with both maildir and mboxes, allowing you to prefix mailboxes names with eg. /path/ or ~user/.

Mail processes

mail_debug = no
Enable mail process debugging. This can help you figure out why Dovecot isn't finding your mails.
mail_log_prefix = "%Us(%u): "

Log prefix for mail processes. See Variables for list of possible variables you can use/

mail_log_max_lines_per_sec = 10
Max. number of lines a mail process is allowed to log per second before it's throttled. 0 means unlimited. Typically there's no need to change this unless you're using mail_log plugin, which may log a lot. This setting is ignored while mail_debug=yes to avoid pointless throttling.
mmap_disable = no
Don't use mmap() at all. This is required if you store indexes to shared filesystems (NFS or clustered filesystem).
dotlock_use_excl = yes
Rely on O_EXCL to work when creating dotlock files. NFS supports O_EXCL since version 3, so this should be safe to use nowadays by default.
fsync_disable = no
Don't use fsync() or fdatasync() calls. This makes the performance better at the cost of potential data loss if the server (or the file server) goes down.
mail_nfs_storage = no
Mail storage exists in NFS. Set this to yes to make Dovecot flush NFS caches whenever needed. If you're using only a single mail server this isn't needed.
mail_nfs_index = no
Mail index files also exist in NFS. Setting this to yes requires mmap_disable=yes and fsync_disable=no.
lock_method = fcntl
Locking method for index files. Alternatives are fcntl, flock and dotlock. Dotlocking uses some tricks which may create more disk I/O than other locking methods. NFS users: flock doesn't work, remember to change mmap_disable.
mail_drop_priv_before_exec = no
Drop all privileges before exec()ing the mail process. This is mostly meant for debugging, otherwise you don't get core dumps. It could be a small security risk if you use single UID for multiple users, as the users could ptrace() each others processes then.
verbose_proctitle = no
Show more verbose process titles (in ps). Currently shows user name and IP address. Useful for seeing who are actually using the IMAP processes (eg. shared mailboxes or if same uid is used for multiple accounts).
first_valid_uid = 500
Valid UID range for users, defaults to 500 and above. This is mostly to make sure that users can't log in as daemons or other system users. Note that denying root logins is hardcoded to dovecot binary and can't be done even if first_valid_uid is set to 0.
last_valid_uid = 0
first_valid_gid = 1
Valid GID range for users, defaults to non-root/wheel. Users having non-valid GID as primary group ID aren't allowed to log in. If user belongs to supplementary groups with non-valid GIDs, those groups are not set.
last_valid_gid = 0
max_mail_processes = 512
Maximum number of running mail processes. When this limit is reached, new users aren't allowed to log in.
mail_process_size = 256
Set max. process size in megabytes. Most of the memory goes to mmap()ing files, so it shouldn't harm much even if this limit is set pretty high.
mail_max_keyword_length = 50
Maximum allowed length for mail keyword name. It's only forced when trying to create new keywords.
valid_chroot_dirs =

':' separated list of directories under which chrooting is allowed for mail processes (ie. /var/mail will allow chrooting to /var/mail/foo/bar too). This setting doesn't affect login_chroot, mail_chroot or auth chroot settings. If this setting is empty, "/./" in home dirs are ignored. WARNING: Never add directories here which local users can modify, that may lead to root exploit. Usually this should be done only if you don't allow shell access for users. Chrooting

mail_chroot =

Default chroot directory for mail processes. This can be overridden for specific users in user database by giving /./ in user's home directory (eg. /home/./user chroots into /home). Note that usually there is no real need to do chrooting, Dovecot doesn't allow users to access files outside their mail directory anyway. If your home directories are prefixed with the chroot directory, append "/." to mail_chroot. Chrooting

Mailbox handling optimizations

mail_cache_min_mail_count = 0
The minimum number of mails in a mailbox before updates are done to cache file. This allows optimizing Dovecot's behavior to do less disk writes at the cost of more disk reads.
mailbox_idle_check_interval = 30
When IDLE command is running, mailbox is checked once in a while to see if there are any new mails or other changes. This setting defines the minimum time in seconds to wait between those checks. Dovecot can also use dnotify, inotify and kqueue to find out immediately when changes occur.
mail_save_crlf = no
Save mails with CR+LF instead of plain LF. This makes sending those mails take less CPU, especially with sendfile() syscall with Linux and FreeBSD. But it also creates a bit more disk I/O which may just make it slower. Also note that if other software reads the mboxes/maildirs, they may handle the extra CRs wrong and cause problems.

Maildir-specific settings

maildir_stat_dirs = no

By default LIST command returns all entries in maildir beginning with a dot. Enabling this option makes Dovecot return only entries which are directories. This is done by stat()ing each entry, so it causes more disk I/O. (For systems setting struct dirent->d_type, this check is free and it's done always regardless of this setting)

maildir_copy_with_hardlinks = yes
When copying a message, do it with hard links whenever possible. This makes the performance much better, and it's unlikely to have any side effects.
maildir_copy_preserve_filename = no
When copying a message, try to preserve the base filename. Only if the destination mailbox already contains the same name (ie. the mail is being copied there twice), a new name is given. The destination filename check is done only by looking at dovecot-uidlist file, so if something outside Dovecot does similar filename preserving copies, you may run into problems. NOTE: This setting requires maildir_copy_with_hardlinks = yes to work.
maildir_very_dirty_syncs = no
Assume Dovecot is the only MUA accessing Maildir: Scan cur/ directory only when its mtime changes unexpectedly or when we can't find the mail otherwise.

mbox-specific settings

mbox_read_locks = fcntl
Which locking methods to use for locking mbox. There are four available:

#  dotlock: Create <mailbox>.lock file. This is the oldest and most NFS-safe
#           solution. If you want to use /var/mail/ like directory, the users
#           will need write access to that directory.
#  dotlock_try: Same as dotlock, but if it fails because of permissions or
#               because there isn't enough disk space, just skip it.
#  fcntl  : Use this if possible. Works with NFS too if lockd is used.
#  flock  : May not exist in all systems. Doesn't work with NFS.
#  lockf  : May not exist in all systems. Doesn't work with NFS. 

You can use multiple locking methods; if you do the order they're declared in is important to avoid deadlocks if other MTAs/MUAs are using multiple locking methods as well. Some operating systems don't allow using some of them simultaneously.

mbox_write_locks = dotlock fcntl
mbox_lock_timeout = 300
Maximum time in seconds to wait for lock (all of them) before aborting.
mbox_dotlock_change_timeout = 120
If dotlock exists but the mailbox isn't modified in any way, override the lock file after this many seconds.
mbox_dirty_syncs = yes
When mbox changes unexpectedly we have to fully read it to find out what changed. If the mbox is large this can take a long time. Since the change is usually just a newly appended mail, it'd be faster to simply read the new mails. If this setting is enabled, Dovecot does this but still safely fallbacks to re-reading the whole mbox file whenever something in mbox isn't how it's expected to be. The only real downside to this setting is that if some other MUA changes message flags, Dovecot doesn't notice it immediately. Note that a full sync is done with SELECT, EXAMINE, EXPUNGE and CHECK commands.
mbox_very_dirty_syncs = no
Like mbox_dirty_syncs, but don't do full syncs even with SELECT, EXAMINE, EXPUNGE or CHECK commands. If this is set, mbox_dirty_syncs is ignored.
mbox_lazy_writes = yes
Delay writing mbox headers until doing a full write sync (EXPUNGE and CHECK commands and when closing the mailbox). This is especially useful for POP3 where clients often delete all mails. The downside is that our changes aren't immediately visible to other MUAs.
mbox_min_index_size = 0
If mbox size is smaller than this (in kilobytes), don't write index files. If an index file already exists it's still read, just not updated.

dbox-specific settings

dbox_rotate_size = 2048
Maximum dbox file size in kilobytes until it's rotated.
dbox_rotate_min_size = 16
Minimum dbox file size in kilobytes before it's rotated (overrides dbox_rotate_days)
dbox_rotate_days = 0
Maximum dbox file age in days until it's rotated. Day always begins from midnight, so 1 = today, 2 = yesterday, etc. 0 = check disabled.

IMAP specific settings

protocol imap {
login_executable = /usr/libexec/dovecot/imap-login
Login executable location.
mail_executable = /usr/libexec/dovecot/imap
IMAP executable location. Changing this allows you to execute other binaries before the imap process is executed.

This would write rawlogs into user's ~/dovecot.rawlog/, if it exists:

#   mail_executable = /usr/libexec/dovecot/rawlog /usr/libexec/dovecot/imap 

Debugging/Rawlog

This would attach gdb into the imap process and write backtraces into /tmp/gdbhelper.* files:

#   mail_executable = /usr/libexec/dovecot/gdbhelper /usr/libexec/dovecot/imap 
imap_max_line_length = 65536
Maximum IMAP command line length in bytes. Some clients generate very long command lines with huge mailboxes, so you may need to raise this if you get "Too long argument" or "IMAP command line too large" errors often.
mail_max_userip_connections = 10
Maximum number of IMAP connections allowed for a user from each IP address. NOTE: The username is compared case-sensitively.
mail_plugins =
Support for dynamically loadable plugins. mail_plugins is a space separated list of plugins to load.
mail_plugin_dir = /usr/lib/dovecot/imap
imap_logout_format = bytes=%i/%o
IMAP logout format string:

#  %i - total number of bytes read from client
#  %o - total number of bytes sent to client 
imap_capability =
Override the IMAP CAPABILITY response.
imap_idle_notify_interval = 120
How many seconds to wait between "OK Still here" notifications when client is IDLEing.
imap_id_send =
ID field names and values to send to clients. Using * as the value makes Dovecot use the default value. The following fields have default values currently: name, version, os, os-version, support-url, support-email.
imap_id_log =
ID fields sent by client to log. * means everything.
imap_client_workarounds =
Workarounds for various client bugs:

#   delay-newmail:
#     Send EXISTS/RECENT new mail notifications only when replying to NOOP
#     and CHECK commands. Some clients ignore them otherwise, for example OSX
#     Mail (<v2.1). Outlook Express breaks more badly though, without this it
#     may show user "Message no longer in server" errors. Note that OE6 still
#     breaks even with this workaround if synchronization is set to
#     "Headers Only".
#   netscape-eoh:
#     Netscape 4.x breaks if message headers don't end with the empty "end of
#     headers" line. Normally all messages have this, but setting this
#     workaround makes sure that Netscape never breaks by adding the line if
#     it doesn't exist. This is done only for FETCH BOD{{{[HEADER.FIELDS..]

# commands. Note that RFC says this shouldn't be done. # tb-extra-mailbox-sep: # With mbox storage a mailbox can contain either mails or submailboxes, # but not both. Thunderbird separates these two by forcing server to # accept '/' suffix in mailbox names in subscriptions list. }}}

The list is space-separated.

}

POP3 specific settings

protocol pop3 {
login_executable = /usr/libexec/dovecot/pop3-login
Login executable location.
mail_executable = /usr/libexec/dovecot/pop3
POP3 executable location. See IMAP's mail_executable above for examples how this could be changed.
pop3_no_flag_updates = no
Don't try to set mails non-recent or seen with POP3 sessions. This is mostly intended to reduce disk I/O. With maildir it doesn't move files from new/ to cur/, with mbox it doesn't write Status-header.
pop3_enable_last = no
Support LAST command which exists in old POP3 specs, but has been removed from new ones. Some clients still wish to use this though. Enabling this makes RSET command clear all \Seen flags from messages.
pop3_reuse_xuidl = no
If mail has X-UIDL header, use it as the mail's UIDL.
pop3_lock_session = no
Keep the mailbox locked for the entire POP3 session.
pop3_uidl_format = %08Xu%08Xv

POP3 UIDL (unique mail identifier) format to use. You can use following variables, along with the variable modifiers described in Variables (e/g. %Uf for the filename in uppercase)

#  %v - Mailbox's IMAP UIDVALIDITY
#  %u - Mail's IMAP UID
#  %m - MD5 sum of the mailbox headers in hex (mbox only)
#  %f - filename (maildir only) 

If you want UIDL compatibility with other POP3 servers, use:

#  UW's ipop3d         : %08Xv%08Xu
#  Courier             : %f or %v-%u (both might be used simultaneosly)
#  Cyrus (<= 2.1.3)    : %u
#  Cyrus (>= 2.1.4)    : %v.%u
#  Dovecot v0.99.x     : %v.%u
#  tpop3d              : %Mf 

Note that Outlook 2003 seems to have problems with %v.%u format which was Dovecot's default, so if you're building a new server it would be a good idea to change this. %08Xu%08Xv should be pretty fail-safe.

pop3_save_uidl = no
Permanently save UIDLs sent to POP3 clients, so pop3_uidl_format changes won't change those UIDLs. Currently this works only with Maildir.
pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s
POP3 logout format string:

#  %i - total number of bytes read from client
#  %o - total number of bytes sent to client
#  %t - number of TOP commands
#  %p - number of bytes sent to client as a result of TOP command
#  %r - number of RETR commands
#  %b - number of bytes sent to client as a result of RETR command
#  %d - number of deleted messages
#  %m - number of messages (before deletion)
#  %s - mailbox size in bytes (before deletion) 
mail_max_userip_connections = 3
Maximum number of POP3 connections allowed for a user from each IP address. NOTE: The username is compared case-sensitively.
mail_plugins =
Support for dynamically loadable plugins. mail_plugins is a space separated list of plugins to load.
mail_plugin_dir = /usr/lib/dovecot/pop3
pop3_client_workarounds =
Workarounds for various client bugs:

#   outlook-no-nuls:
#     Outlook and Outlook Express hang if mails contain NUL characters.
#     This setting replaces them with 0x80 character.
#   oe-ns-eoh:
#     Outlook Express and Netscape Mail breaks if end of headers-line is
#     missing. This option simply sends it if it's missing. 

The list is space-separated.

}

LDA specific settings

protocol lda {
postmaster_address =

Address to use when sending rejection mails (e.g. postmaster@example.com).

hostname =
Hostname to use in various parts of sent mails, eg. in Message-Id. Default is the system's real hostname.
mail_plugins =
Support for dynamically loadable plugins. mail_plugins is a space separated list of plugins to load.
mail_plugin_dir = /usr/lib/dovecot/lda
quota_full_tempfail = no
If user is over quota, return with temporary failure instead of bouncing the mail.
deliver_log_format = msgid=%m: %$
Format to use for logging mail deliveries. You can use variables:

#  %$ - Delivery status message (e.g. "saved to INBOX")
#  %m - Message-ID
#  %s - Subject
#  %f - From address 
sendmail_path = /usr/lib/sendmail
Binary to use for sending mails.
rejection_subject = Rejected: %s
Subject: header to use for rejection mails. You can use the same variables as for rejection_reason below.
rejection_reason = Your message to <%t> was automatically rejected:%n%r
Human readable error message for rejection mails. You can use variables:

#  %n = CRLF, %r = reason, %s = original subject, %t = recipient 
auth_socket_path = /var/run/dovecot/auth-master
UNIX socket path to master authentication server to find users.
}

Authentication processes

auth_executable = /usr/libexec/dovecot/dovecot-auth
Executable location
auth_process_size = 256
Set max. process size in megabytes.
auth_cache_size = 0
Authentication cache size in kilobytes. 0 means it's disabled. Note that bsdauth, PAM and vpopmail require cache_key to be set for caching to be used.
auth_cache_ttl = 3600
Time to live in seconds for cached data. After this many seconds the cached record is no longer used, *except* if the main database lookup returns internal failure. We also try to handle password changes automatically: If user's previous authentication was successful, but this one wasn't, the cache isn't used. For now this works only with plaintext authentication.
auth_cache_negative_ttl = 3600
TTL for negative hits (user not found, password mismatch). 0 disables caching them completely.
auth_realms =
Space separated list of realms for SASL authentication mechanisms that need them. You can leave it empty if you don't want to support multiple realms. Many clients simply use the first one listed here, so keep the default realm first.
auth_default_realm =
Default realm/domain to use if none was specified. This is used for both SASL realms and appending @domain to username in plaintext logins.
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
List of allowed characters in username. If the user-given username contains a character not listed in here, the login automatically fails. This is just an extra check to make sure user can't exploit any potential quote escaping vulnerabilities with SQL/LDAP databases. If you want to allow all characters, set this value to empty.
auth_username_translation =

Username character translations before it's looked up from databases. The value contains series of from -> to characters. For example "#@/@" means that '#' and '/' characters are translated to '@'.

auth_username_format =
Username formatting before it's looked up from databases. You can use the standard variables here, eg. %Lu would lowercase the username, %n would drop away the domain if it was given, or "%n-AT-%d" would change the '@' into "-AT-". This translation is done after auth_username_translation changes.
auth_master_user_separator =

If you want to allow master users to log in by specifying the master username within the normal username string (ie. not using SASL mechanism's support for it), you can specify the separator character here. The format is then <username><separator><master username>. UW-IMAP uses "*" as the separator, so that could be a good choice.

auth_anonymous_username = anonymous
Username to use for users logging in with ANONYMOUS SASL mechanism
auth_verbose = no
Log unsuccessful authentication attempts and the reasons why they failed.
auth_debug = no
Even more verbose logging for debugging purposes. Shows for example SQL queries.
auth_debug_passwords = no
In case of password mismatches, log the passwords and used scheme so the problem can be debugged. Enabling this also enables auth_debug.
auth_worker_max_count = 30
Maximum number of dovecot-auth worker processes. They're used to execute blocking passdb and userdb queries (eg. MySQL and PAM). They're automatically created and destroyed as needed.
auth_gssapi_hostname =
Host name to use in GSSAPI principal names. The default is to use the name returned by gethostname(). Use "$ALL" to allow all keytab entries.
auth_krb5_keytab =
Kerberos keytab to use for the GSSAPI mechanism. Will use the system default (usually /etc/krb5.keytab) if not specified.
auth_use_winbind = no

Do NTLM and GSS-SPNEGO authentication using Samba's winbind daemon and ntlm_auth helper. Authentication/Mechanisms/Winbind

auth_winbind_helper_path = /usr/bin/ntlm_auth
Path for Samba's ntlm_auth helper binary.
auth_failure_delay = 2
Number of seconds to delay before replying to failed authentications.
auth default {
mechanisms = plain
Space separated list of wanted authentication mechanisms:

#   plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp skey
#   gss-spnego 

NOTE: See also disable_plaintext_auth setting.

Password database is used to verify user's password (and nothing more). You can have multiple passdbs and userdbs. This is useful if you want to allow both system users (/etc/passwd) and virtual users to login without duplicating the system users into virtual database.

PasswordDatabase

By adding master=yes setting inside a passdb you make the passdb a list of "master users", who can log in as anyone else. Unless you're using PAM, you probably still want the destination user to be looked up from passdb that it really exists. This can be done by adding pass=yes setting to the master passdb. Authentication/MasterUsers

Users can be temporarily disabled by adding a passdb with deny=yes. If the user is found from that database, authentication will fail. The deny passdb should always be specified before others, so it gets checked first. Here's an example:

passdb passwd-file {
args = /etc/dovecot.deny
File contains a list of usernames, one per line
deny = yes
}
passdb pam {

PAM authentication. Preferred nowadays by most systems. Note that PAM can only be used to verify if user's password is correct, so it can't be used as userdb. If you don't want to use a separate user database (passwd usually), you can use static userdb. REMEMBER: You'll need /etc/pam.d/dovecot file created for PAM authentication to actually work. PasswordDatabase/PAM

args = dovecot

[session=yes][setcred=yes][failure_show_msg=yes][max_requests=<n>][cache_key=<key>][<service name>]

session=yes makes Dovecot open and immediately close PAM session. Some PAM plugins need this to work, such as pam_mkhomedir.

setcred=yes makes Dovecot establish PAM credentials if some PAM plugins need that. They aren't ever deleted though, so this isn't enabled by default.

max_requests specifies how many PAM lookups to do in one process before recreating the process. The default is 100, because many PAM plugins leak memory.

cache_key can be used to enable authentication caching for PAM (auth_cache_size also needs to be set). It isn't enabled by default because PAM modules can do all kinds of checks besides checking password, such as checking IP address. Dovecot can't know about these checks without some help. cache_key is simply a list of variables (see doc/wiki/Variables.txt) which must match for the cached data to be used. Here are some examples:

#   %u - Username must match. Probably sufficient for most uses.
#   %u%r - Username and remote IP address must match.
#   %u%s - Username and service (ie. IMAP, POP3) must match. 

The service name can contain variables, for example %Ls expands to pop3 or imap.

Some examples:

#   args = session=yes %Ls
#   args = cache_key=%u dovecot 
}
passdb passwd {

System users (NSS, /etc/passwd, or similiar) In many systems nowadays this uses Name Service Switch, which is configured in /etc/nsswitch.conf. AuthDatabase/Passwd

args =
[blocking=yes] - See userdb passwd for explanation
}
passdb shadow {

Shadow passwords for system users (NSS, /etc/shadow or similiar). Deprecated by PAM nowadays. PasswordDatabase/Shadow

args =
[blocking=yes] - See userdb passwd for explanation
}
passdb bsdauth {

PAM-like authentication for OpenBSD. PasswordDatabase/BSDAuth

args =

[cache_key=<key>] - See cache_key in PAM for explanation.

}
passdb passwd-file {

passwd-like file with specified location AuthDatabase/PasswdFile

args =

[scheme=<default password scheme>][username_format=<format>] <Path for passwd-file>

}
passdb checkpassword {

checkpassword executable authentication NOTE: You will probably want to use "userdb prefetch" with this. AuthDatabase/CheckPassword

args =
Path for checkpassword binary
}
passdb sql {

SQL database AuthDatabase/SQL

args =
Path for SQL configuration file, see doc/dovecot-sql-example.conf
}
passdb ldap {

LDAP database AuthDatabase/LDAP

args =
Path for LDAP configuration file, see doc/dovecot-ldap-example.conf
}
passdb vpopmail {

vpopmail authentication AuthDatabase/VPopMail

args =

[cache_key=<key>] - See cache_key in PAM for explanation.[quota_template=<template>] - %q expands to Maildir++ quota

#   (eg. quota_template=quota_rule=*:backend=%q) 
}

User database specifies where mails are located and what user/group IDs own them. For single-UID configuration use "static".

UserDatabase

userdb prefetch {

"prefetch" user database means that the passdb already provided the needed information and there's no need to do a separate userdb lookup. This can be made to work with SQL and LDAP databases, see their example configuration files for more information how to do it. UserDatabase/Prefetch

}
userdb passwd {

System users (NSS, /etc/passwd, or similiar). In many systems nowadays this uses Name Service Switch, which is configured in /etc/nsswitch.conf. AuthDatabase/Passwd

args =
[blocking=yes] - By default the lookups are done in the main dovecot-auth process. This setting causes the lookups to be done in auth worker proceses. Useful with remote NSS lookups that may block. NOTE: Be sure to use this setting with nss_ldap or users might get logged in as each others!
}
userdb passwd-file {

passwd-like file with specified location AuthDatabase/PasswdFile

args =

[username_format=<format>] <Path for passwd-file>

}
userdb checkpassword {

checkpassword executable user database lookup AuthDatabase/CheckPassword

args =
Path for checkpassword binary
}
userdb static {

static settings generated from template UserDatabase/Static

args =
Template for the fields. Can return anything a userdb could normally return. For example:

#  args = uid=500 gid=500 home=/var/mail/%u 

If you use deliver, it needs to look up users only from the userdb. This of course doesn't work with static because there is no list of users. Normally static userdb handles this by doing a passdb lookup. This works with most passdbs, with PAM being the most notable exception. If you do the user verification another way, you can add allow_all_users=yes to the args in which case the passdb lookup is skipped.

}
userdb sql {

SQL database AuthDatabase/SQL

args =
Path for SQL configuration file, see doc/dovecot-sql-example.conf
}
userdb ldap {

LDAP database AuthDatabase/LDAP

args =
Path for LDAP configuration file, see doc/dovecot-ldap-example.conf
}
userdb vpopmail {

vpopmail AuthDatabase/VPopMail

}
user = root
User to use for the process. This user needs access to only user and password databases, nothing else. Only shadow and pam authentication requires roots, so use something else if possible. Note that passwd authentication with BSDs internally accesses shadow files, which also requires roots. Note that this user is NOT used to access mails. That user is specified by userdb above.
chroot =
Directory where to chroot the process. Most authentication backends don't work if this is set, and there's no point chrooting if auth_user is root. Note that valid_chroot_dirs isn't needed to use this setting.
count = 1
Number of authentication processes to create
ssl_require_client_cert = no
Require a valid SSL client certificate or the authentication fails.
ssl_username_from_cert = no

Take the username from client's SSL certificate, using X509_NAME_get_text_by_NID() which returns the subject's DN's CommonName.

socket listen {
It's possible to export the authentication interface to other programs:
master {
path = /var/run/dovecot/auth-master
Master socket provides access to userdb information. It's typically used to give Dovecot's local delivery agent access to userdb so it can find mailbox locations.
mode = 0600
user =
Default user/group is the one who started dovecot-auth (root)
group =
}
client {
path = /var/run/dovecot/auth-client
The client socket is generally safe to export to everyone. Typical use is to export it to your SMTP server so it can do SMTP AUTH lookups using it.
mode = 0660
}
}
}
auth external {
If you wish to use another authentication server than dovecot-auth, you can use connect sockets. They are assumed to be already running, Dovecot's master process only tries to connect to them. They don't need any other settings than the path for the master socket, as the configuration is done elsewhere. Note that the client sockets must exist in the login_dir.
}

#  socket connect {
#    master {
#      path = /var/run/dovecot/auth-master
#    }
#  } 

Dictionary server settings

Dictionary can be used by some plugins to store key=value lists, such as quota, expire and acl plugins. The dictionary can be used either directly or though a dictionary server. The following dict block maps dictionary names to URIs when the server is used. These can then be referenced using URIs in format "proxy::<name>".

dict {
quota = mysql:/etc/dovecot-dict-quota.conf
expire = db:/var/lib/dovecot/expire.db
}
dict_db_config =
Path to Berkeley DB's configuration file. See doc/dovecot-db-example.conf

Plugin settings

plugin {

Here you can give some extra environment variables to mail processes. This is mostly meant for passing parameters to plugins. %variable expansion is done for all values.

quota = maildir
Quota plugin. Multiple backends are supported:

#   dirsize: Find and sum all the files found from mail directory.
#            Extremely SLOW with Maildir. It'll eat your CPU and disk I/O.
#   dict: Keep quota stored in dictionary (eg. SQL)
#   maildir: Maildir++ quota
#   fs: Read-only support for filesystem quota 

Quota limits are set using "quota_rule" parameters, either in here or in userdb. It's also possible to give mailbox-specific limits, for example:

#   quota_rule = *:storage=1048576
#   quota_rule2 = Trash:storage=102400 

User has now 1GB quota, but when saving to Trash mailbox the user gets additional 100MB.

Multiple quota roots are also possible, for example:

#   quota = dict:user::proxy::quota
#   quota2 = dict:domain:%d:proxy::quota_domain
#   quota_rule = *:storage=102400
#   quota2_rule = *:storage=1048576 

Gives each user their own 100MB quota and one shared 1GB quota within the domain.

You can execute a given command when user exceeds a specified quota limit. Each quota root has separate limits. Only the command for the first exceeded limit is excecuted, so put the highest limit first. Note that % needs to be escaped as %%, otherwise "% " expands to empty.

#   quota_warning = storage=95%% /usr/local/bin/quota-warning.sh 95
#   quota_warning2 = storage=80%% /usr/local/bin/quota-warning.sh 80 
acl = vfile:/etc/dovecot-acls:cache_secs=300
ACL plugin. vfile backend reads ACLs from "dovecot-acl" file from maildir directory. You can also optionally give a global ACL directory path where ACLs are applied to all users' mailboxes. The global ACL directory contains one file for each mailbox, eg. INBOX or sub.mailbox. cache_secs parameter specifies how many seconds to wait between stat()ing dovecot-acl file to see if it changed.
acl_shared_dict = file:/var/lib/dovecot/shared-mailboxes
To let users LIST mailboxes shared by other users, Dovecot needs a shared mailbox dictionary. For example:
convert_mail = mbox:%h/mail

Convert plugin. If set, specifies the source storage path which is converted to destination storage (mail_location) when the user logs in. The existing mail directory is renamed to <dir>-converted.

convert_skip_broken_mailboxes = no
Skip mailboxes which we can't open successfully instead of aborting.
convert_skip_dotdirs = no
Skip directories beginning with '.'
convert_alt_hierarchy_char = _
If source storage has mailbox names with destination storage's hierarchy separators, replace them with this character.
trash = /etc/dovecot-trash.conf

Trash plugin. When saving a message would make user go over quota, this plugin automatically deletes the oldest mails from configured mailboxes until the message can be saved within quota limits. The configuration file is a text file where each line is in format: <priority> <mailbox name> Mails are first deleted in lowest -> highest priority number order

expire = Trash 7 Spam 30
Expire plugin. Mails are expunged from mailboxes after being there the configurable time. The first expiration date for each mailbox is stored in a dictionary so it can be quickly determined which mailboxes contain expired mails. The actual expunging is done in a nightly cronjob, which you must set up:

#   dovecot --exec-mail ext /usr/libexec/dovecot/expire-tool 
expire_dict = proxy::expire
lazy_expunge = .EXPUNGED/ .DELETED/ .DELETED/.EXPUNGED/
Lazy expunge plugin. Currently works only with maildirs. When a user expunges mails, the mails are moved to a mailbox in another namespace (1st). When a mailbox is deleted, the mailbox is moved to another namespace (2nd) as well. Also if the deleted mailbox had any expunged messages, they're moved to a 3rd namespace. The mails won't be counted in quota, and they're not deleted automatically (use a cronjob or something).
mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
Events to log. Also available: flag_change append
mail_log_group_events = no
Group events within a transaction to one line.
mail_log_fields = uid box msgid size
Available fields: uid, box, msgid, from, subject, size, vsize, flags size and vsize are available only for expunge and copy events.
}
!include /etc/dovecot/conf.d/*.conf
Config files can also be included. deliver doesn't support them currently.
!include_try /etc/dovecot/extra.conf
Optional configurations, don't give an error if it's not found:

None: MainConfig (last edited 2011-04-25 16:53:54 by generator)