dovecot
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
May 2008
- 160 participants
- 201 discussions
Need Help!!
Server : AIX 5.3
Compile Error Message
configure
---------------------------------
checking jfs/quota.h usability... no
checking jfs/quota.h presence... yes
configure: WARNING: jfs/quota.h: present but cannot be compiled
configure: WARNING: jfs/quota.h: check for missing prerequisite headers?
configure: WARNING: jfs/quota.h: see the Autoconf documentation
configure: WARNING: jfs/quota.h: section "Present But Cannot Be
Compiled"
configure: WARNING: jfs/quota.h: proceeding with the preprocessor's result
configure: WARNING: jfs/quota.h: in the future, the compiler will take
precedence
configure: WARNING: ## ---------------------------------- ##
configure: WARNING: ## Report this to dovecot(a)dovecot.org ##
configure: WARNING: ## ---------------------------------- ##
checking for jfs/quota.h... yes
checking mntent.h usability... yes
make
--------------------------
et/libcharset.a ../../../src/lib/liblib.a -liconv
+ exec /usr/vacpp/bin/xlc -g -bexpall -brtl -o convert-tool convert-tool.o
./../../src/lib-storage/register/libstorage-register.a ../../../src/lib-
storage/index/maildir/libstorage_maildir.a ../../../src/lib-
storage/index/mbox/libstorage_mbox.a ../../../src/lib-
storage/index/libstorage_index.a ../../../src/lib-index/libindex.a
./../../src/lib-storage/libstorage.a ../../../src/lib-storage/subscription-
file/libstorage_subscription_file.a ../../../src/lib-imap/libimap.a ../../..
/src/lib-mail/libmail.a ../../../src/lib-charset/libcharset.a
./../../src/lib/liblib.a -liconv -bE:.libs/libstorage-register.exp -
bE:.libs/libstorage_maildir.exp -bE:.libs/libstorage_mbox.exp -
bE:.libs/libstorage_index.exp -bE:.libs/libindex.exp -
bE:.libs/libstorage.exp -bE:.libs/libstorage_subscription_file.exp -
bE:.libs/libimap.exp -bE:.libs/libmail.exp -bE:.libs/libcharset.exp -
bE:.libs/liblib.exp
Target "all" is up to date.
Making all in quota
source='quota.c' object='quota.lo' libtool=yes DEPDIR=.deps
depmode=aix /bin/sh ../../../depcomp /bin/sh ../../../libtool --tag=CC --
mode=compile /apps1/bea8/domains/eipDomain/handy/down/dovecot/imap/dovecot-
1.0.13/dovecot-cc -DHAVE_CONFIG_H -I. -I. -I../../.. -I../../../src/lib -
I../../../src/lib-dict -I../../../src/lib-index -I../../../src/lib-mail -
I../../../src/lib-storage -I../../../src/lib-storage/index -
I../../../src/lib-storage/index/maildir -g -c -o quota.lo quota.c
mkdir .libs
/apps1/bea8/domains/eipDomain/handy/down/dovecot/imap/dovecot-
1.0.13/dovecot-cc -DHAVE_CONFIG_H -I. -I. -I../../.. -I../../../src/lib -I..
/../../src/lib-dict -I../../../src/lib-index -I../../../src/lib-mail -I../..
/../src/lib-storage -I../../../src/lib-storage/index -I../../../src/lib-
storage/index/maildir -g -c -M quota.c -DPIC -o .libs/quota.o
+ exec /usr/vacpp/bin/xlc -DHAVE_CONFIG_H -I. -I. -I../../.. -
I../../../src/lib -I../../../src/lib-dict -I../../../src/lib-index -
I../../../src/lib-mail -I../../../src/lib-storage -I../../../src/lib-
storage/index -I../../../src/lib-storage/index/maildir -g -c -M quota.c -
DPIC -o .libs/quota.o
"/usr/include/sys/ras.h", line 273.49: 1506-207 (W) Integer constant
0x5200000000000110ul out of range.
"/usr/include/sys/ras.h", line 273.1: 1506-195 (S) Integral constant
expression with a value greater than zero is required.
"/usr/include/sys/ras.h", line 276.49: 1506-207 (W) Integer constant
0x5200000000000210ul out of range.
"/usr/include/sys/ras.h", line 276.1: 1506-195 (S) Integral constant
expression with a value greater than zero is required.
"/usr/include/sys/ras.h", line 279.49: 1506-207 (W) Integer constant
0x5200000000000310ul out of range.
"/usr/include/sys/ras.h", line 279.1: 1506-195 (S) Integral constant
expression with a value greater than zero is required.
"/usr/include/sys/ras.h", line 283.49: 1506-207 (W) Integer constant
0x5200000000000120ul out of range.
"/usr/include/sys/ras.h", line 283.1: 1506-195 (S) Integral constant
expression with a value greater than zero is required.
"/usr/include/sys/ras.h", line 286.49: 1506-207 (W) Integer constant
0x5200000000000220ul out of range.
"/usr/include/sys/ras.h", line 286.1: 1506-195 (S) Integral constant
expression with a value greater than zero is required.
"/usr/include/sys/ras.h", line 289.49: 1506-207 (W) Integer constant
0x5200000000000320ul out of range.
"/usr/include/sys/ras.h", line 289.1: 1506-195 (S) Integral constant
expression with a value greater than zero is required.
make: 1254-004 The error code from the last command is 1.
Stop.
make: 1254-004 The error code from the last command is 1.
Stop.
make: 1254-004 The error code from the last command is 1.
Stop.
make: 1254-004 The error code from the last command is 1.
Stop.
make: 1254-004 The error code from the last command is 2.
2
1
Hi,
while testing out dovecot 1.1, I found that when you set
quota_full_tempfail = yes in dovecot.conf and use the deliver -e command
line flag, no deferral reason is printed, thus breaking my fancy
quota_exceeded_message.
This appears to be because of the if() block in lines 1003-1009 in
src/deliver/deliver.c, and should be easily fixable (if it is indeed a bug,
and not intended behavior).
However, I shied away from creating a patch because either there is a
mismatch between the documentation and deliver's actual behavior, or I
misunderstood the code (likely, since I'm not really a C programmer).
The lines in question (in src/deliver/deliver.c) read:
| 1003 if (error != MAIL_ERROR_NOSPACE ||
| 1004 getenv("QUOTA_FULL_TEMPFAIL") != NULL) {
Does this mean that the corresponding block gets executed whenever
quota_full_tempfail is set? If so, setting it transforms all errors into
TEMPFAILs, and not only those relating to quota/space issues. I think
dovecot-example.conf should at least mention this it's inteded; otherwise,
the code should be changed (I'm not completely sure what Timo's intensions
are, so I won't comment on possible solutions).
Regards,
Ulrich
PS: All line numbers are taken from rev 080dd4d2fd94, which was the most
recent at the time of writing.
4
3
I'll probably be implementing multi-master replication this summer. My
previous thoughts about it are here:
http://dovecot.org/list/dovecot/2007-December/027284.html
Below is a description of how the replication protocol will probably
work. It should work just as well for master-slave and multi-master
setups. Comments welcome. I'll write later a separate mail about how
it'll be implemented to Dovecot.
Goals
-----
1. If a single (or configurable number of) server dies, no mails must be
lost that have been reported to IMAP/SMTP clients as being successfully
stored.
2. Must be able to automatically recover from a server desynchronization,
such as:
- server has been offline for a long time
- some mail files have been manually added/deleted
- corrupted data/mail files if they're noticed
3. In multi-master setup if the link between servers die, the servers must
be able to proceed autonomously (kind of conflicts with goal 1 though).
When the link comes back, the changes are replicated as soon as possible.
4. Normal IMAP commands must not be able to cause desynchronization between
servers. For example making conflicting flag changes simultaneously in two
servers must not result in the servers having different flags.
5. Must perform well with at least 3 servers in a multi-master setup,
preferrably still with tens of servers.
6. Latency shouldn't be increased noticeably when using servers distributed
into 3 or more data centers. Must be usable over high-latency links (in
optimistic async mode).
7. In normal operation send minimal incremental changes.
Protocol
--------
There are two major parts in the protocol: Handling the normal incremental
changes and fixing desynchronization.
Originally I thought that maybe the changes could be sent using the same
format as Dovecot's transaction logs, but now I'm beginning to think that
it's probably not that good idea. The code reuse potential is quite minimal
and the format would still have to be extended in several ways so that it
won't be directly compatible anyway.
So I'm thinking the protocol could be something text-based. The main
benefit is that text-based protocols are easier to debug. Stream
compression should drop most of the extra overhead if bandwidth is a
problem.
The exact on-wire protocol anyway doesn't matter in the design that's
discussed below.
The commands have tags similar to IMAP commands, because some commands may
have to be forwarded to other servers and it may take a while to get a
reply. During the wait the server may process other commands.
Mailbox master
--------------
Each mailbox has a single master server selected. In multi-master setups
the master server may be moved by having the destination server simply
request it from the current master. The current master must then give it
up. If link is lost to the current master, one of the remaining servers
will become the new master within the remaining servers.
Each server must be connected to the current master server. Since each
mailbox can have a different master server, this typically means all
servers are connected to each others. However it's possible to create
setups where server connects to only one other server, which in turn
connect to more servers. This is useful if there are bandwidth bottlenecks
between some servers. This kind of a situation can also happen if in a
network A-B-C the link A-C dies, but A-B and B-C continues to work. Because
of this all commands must be able to function in a way that the server
proxies them to the current master, instead of failing the command and
trying to make it the caller's problem to resend the command to the actual
master.
When the cluster starts up, a single server is selected as the root master
for all mailboxes. If a server doesn't know who the current mailbox master
is, it asks from the root. All servers cache the currently known mailbox
masters to avoid constant requests to the root.
If the root server dies, another server is selected as the root. Because
the new root doesn't know what masters have been requested (and asking all
of them from all servers would just waste bandwidth), all the servers are
expected to flush their master caches and drop their own master status. The
new root doesn't respond to any requests before all servers have notified
that they've dropped being a master.
The master status doesn't have to be at mailbox level granularity. It could
just as well be configured to move at user, domain or even global level.
Perhaps this could be done dynamically, so that higher granularity is used
when the master is beginning to change too often between servers.
Mailbox ID
----------
Mailbox IDs are session-specific numbers dynamically assigned for
user+mailbox+UIDVALIDITY combinations. All connections have different
mailbox IDs. Also send and receive directions have different IDs. This
allows the sender to easily replace existing IDs to point to new mailboxes
without causing any confusion.
MBOX:
- Mailbox ID
- User name
- Mailbox name
- Mailbox UIDVALIDITY
- Mailbox UIDNEXT
- Mailbox message count
If the receiver finds out it has a different UIDVALIDITY, the mailbox
requires a full resync. Message count and UIDNEXT may also be used to
determine if replication servers are out of sync.
Requesting master status
------------------------
MASTER-MOVE:
- Mailbox ID
- [Destination SID] (if forwarding)
The command is sent to the last known master for the mailbox. The server
will keep forwarding the command until it reaches the current master.
During the forwarding other servers may want to request something from the
master. These requests must be delayed by the forwarding servers until the
move is finished.
Saving messages
---------------
SAVE:
- Mailbox IDs
- Received date
- [IMAP UID] (only if we're the master)
- Global UID (stays the same when copying the message)
- Message text
Reply:
- [IMAP UID] (only if not specified in parameters)
- [Current mailbox master SID] (if it was moved)
If current server is not the master, the SAVE is sent to the master which
gives the message its UID. The master server then replicates the message to
other servers with the UID parameter set.
The mailbox master may have already changed by the time server receives a
save request. If server receives a SAVE without IMAP UID parameter, it's
responsible for finding out the new mailbox master and sending a new SAVE
request to it. Once the new master replies with the IMAP UID, the server
can reply to the original SAVE request, also providing the new master SID
so the future requests can be sent there directly.
To be sure the message doesn't get lost, the server should not reply OK to
the IMAP/SMTP client until it has received a reply from SAVE.
Copying messages
----------------
COPY:
- Source mailbox ID
- Destination mailbox ID
- Source IMAP UID
- Global UID
- [Destination IMAP UID] (only if we're the master)
- Destination received date
Reply:
- [Destination IMAP UID] (only if not specified in parameters)
- [Current mailbox master SID] (if it was moved)
Source mailbox ID + source IMAP UID identifies the message to be copied.
It's expected to contain the given global UID (which is just an extra
sanity check). Otherwise it works the same way as SAVE.
Since the message already exists, it's probably not necessary to wait for a
reply before replying OK to originating IMAP client.
Expunging messages
------------------
EXPUNGE:
- Mailbox ID
- UID range
(No reply)
Expunges also have to be sent via master server (the same way as SAVE) to
avoid COPY command failing in some servers because it was just expunged.
Changing message flags
----------------------
STORE:
- Mailbox ID
- UID range
- Added flags/keywords
- Removed flags/keywords
- [Current modseq] (master sends)
- [Highest modseq of the messages before this change] (non-master sends)
- [flag: this is a CONDSTORE STORE UNCHANGEDSINCE] (non-master may send)
[Reply:
- UIDs where STORE was rejected to (if CONDSTORE flag was used)
]
Stores also have to be sent via master server to avoid flag
desynchronization. Master first checks if it has higher modseqs in the
messages. Then it applies all the changes and forwards the changes to other
servers. For messages that had higher initial modseqs their flags are sent
to the server sending the STORE to fix a potential desync.
If CONDSTORE flag is set, the change is rejected for messages that had a
higher modseq. Non-masters shouldn't reply to a STORE UNCHANGEDSINCE
command before the change has been replicated to master and the rejections
have been processed.
Mailbox synchronization
-----------------------
If a mailbox is determined to have changed externally (e.g. network
connection down for too long, causing replication logs to get full) the
mailbox state needs to be synchronized between servers.
SYNC:
- UIDVALIDITY
- UIDNEXT
- Message count
- For each message:
- UID
- Global UID
- Modseq
- Flags and keywords
- Received date
Reply:
- (Sync finished)
Receiving server compares the parameters with its own mailbox state. If it
finds previously unseen global UIDs, their message texts are requested:
FETCH:
- Mailbox ID
- UID
Reply:
- Message text
SAVE, EXPUNGE and STORE commands are used to synchronize the mailbox.
A special case is when two servers have been saving messages independently
from each others. In this case it's possible that the servers have used the
same UIDs for different messages (different global UIDs). These need to be
resolved by giving both conflicting UIDs new unused UIDs, otherwise IMAP
clients may show them as wrong messages from their caches.
FIXME: If the other server had expunged a conflicting UID it still should
be given a new UID. How do we find out this has happened?
4
13
Is --with-file-offset-size no longer supported in 1.1?
# ./configure \
--prefix=/usr/local/dovecot-1.1 \
--with-mysql \
--with-file-offset-size=32 \
--with-ioloop=best \
--with-pop3d \
--with-ssl \
--with-deliver \
...
checking for _FILE_OFFSET_BITS value needed for large files... 64
...
Install prefix ...................... : /usr/local/dovecot-1.1
File offsets ........................ : 64bit
I/O loop method ..................... : epoll
File change notification method ..... : dnotify
Building with SSL support ........... : yes (OpenSSL)
Building with IPv6 support .......... : yes
Building with pop3 server ........... : yes
Building with mail delivery agent .. : yes
Building with GSSAPI support ........ : no
Building with user database modules . : static prefetch passwd
passwd-file checkpassword sql nss
Building with password lookup modules : passwd passwd-file shadow pam
checkpassword sql
Building with SQL drivers ............: mysql
# cat /etc/redhat-release
Red Hat Enterprise Linux ES release 4 (Nahant Update 6)
# uname -r
2.6.9-42.0.10.ELsmp
2
2
I'm trying to set up a pop3 server for a project for class, but it keeps giving me the following error:
Error: Login user doesn't exist: dovecot
Fatal: Invalid configuration in /usr/local/etc/dovecot.conf
And I have no clue what's wrong. I've look and modifying the dovecot.conffile for days and I am not having any luck.
## Dovecot configuration file
# If you're in a hurry, see http://wiki.dovecot.org/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
# any of the lines. Exception to this are paths, they're 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 directory where to store runtime data.
base_dir = /var/run/dovecot/
# Protocols we want to be serving: imap imaps pop3 pop3s
# If you only want to use dovecot-auth, you can set this to "none".
protocols = imap imaps pop3 pop3s
# 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, but may also listen in all IPv4 interfaces depending on the
# operating system. 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
# ..
# }
listen = *:143
# 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.
disable_plaintext_auth = no
# 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.
#shutdown_clients = yes
##
## Logging
##
# Log file to use for error messages, instead of sending them to syslog.
# /dev/stderr can be used to log into stderr.
log_path = /var/log/dovecot.log
# Log file to use for informational and debug messages.
# Default is the same as log_path.
info_log_path = /var/log/dovecot-info.log
# Prefix for each line written to log file. % codes are in strftime(3)
# format.
log_timestamp = "%b %d %H:%M:%S "
# 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.
#syslog_facility = mail
##
## SSL settings
##
# 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 = yes
# 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
# If key file is password protected, give the password here. Alternatively
# give it when starting dovecot with -p parameter.
#ssl_key_password =
# 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_ca_file =
# Request client to send a certificate. If you also want to require it, set
# ssl_require_client_cert=yes in auth section.
#ssl_verify_client_cert = no
# 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_cert_username_field = commonName
# 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 = 168
# SSL ciphers to use
#ssl_cipher_list = ALL:!LOW:!SSLv2
# Show protocol level SSL errors.
#verbose_ssl = no
##
## Login processes
##
# <doc/wiki/LoginProcess.txt>
# 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 = usr/local/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. <doc/wiki/Rootless.txt>
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. <doc/wiki/UserIds.txt>
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 = 64
# 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 keep for listening new connections.
#login_processes_count = 3
# 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_processes_count = 128
# 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_max_connections = 256
# Greeting message for clients.
#login_greeting = Shall we play a game???
# 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
##
## Mailbox locations and namespaces
##
# 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 doc/wiki/Variables.txt 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
#
# <doc/wiki/MailLocation.txt>
#
mail_location = mbox:/var/empty:INBOX=/var/mail/%u:INDEX=MEMORY
# If you need to set multiple mailbox locations or want to change default
# namespace settings, you can do it by defining namespace sections.
# NOTE: Namespaces currently work ONLY with IMAP! POP3 and LDA currently ignore
# namespaces completely, they use only the mail_location setting.
#
# 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. 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.
#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.
# The default however depends on the underlying mail storage format.
#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
# mail_location, 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. 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/".
#hidden = yes
# Show the mailboxes under this namespace with LIST command. This makes the
# namespace visible for clients that don't support NAMESPACE extension.
#list = yes
# Namespace handles its own subscriptions. If set to "no", the parent
# namespace handles them (empty prefix should always have this as "yes")
#subscriptions = yes
#}
# 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. <doc/wiki/UserIds>
#mail_uid =
#mail_gid =
# Group to enable temporarily for privileged operations. Currently this is
# used only for creating mbox dotlock files when creation fails for INBOX.
# Typically this is set to "mail" to give access to /var/mail.
mail_privileged_group = mail
# 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_access_groups =
# 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
##
## Mail processes
##
# Enable mail process debugging. This can help you figure out why Dovecot
# isn't finding your mails.
mail_debug = yes
# Log prefix for mail processes. See doc/wiki/Variables.txt for list of
# possible variables you can use.
mail_log_prefix = "%Us(%u): "
# 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.
#mail_log_max_lines_per_sec = 10
# Don't use mmap() at all. This is required if you store indexes to shared
# filesystems (NFS or clustered filesystem).
#mmap_disable = no
# 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.
#dotlock_use_excl = yes
# 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.
#fsync_disable = 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_storage = no
# Mail index files also exist in NFS. Setting this to yes requires
# mmap_disable=yes and fsync_disable=no.
#mail_nfs_index = 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. NFS users: flock doesn't work, remember to change mmap_disable.
#lock_method = fcntl
# 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
# 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 = yes
# 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 = 1000
last_valid_uid = 5000
# 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
# Maximum number of running mail processes. When this limit is reached,
# new users aren't allowed to log in.
max_mail_processes = 2048
# 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
# Maximum allowed length for mail keyword name. It's only forced when trying
# to create new keywords.
#mail_max_keyword_length = 50
# ':' 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.
# 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. <doc/wiki/Chrooting.txt>
#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. <doc/wiki/Chrooting.txt>
#mail_chroot =
##
## Mailbox handling optimizations
##
# 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.
#mail_cache_min_mail_count = 0
# 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.
#mailbox_idle_check_interval = 30
# 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.
#mail_save_crlf = no
##
## Maildir-specific settings
##
# 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_stat_dirs = no
# 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_with_hardlinks = yes
# 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_copy_preserve_filename = no
##
## mbox-specific settings
##
# 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_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 = 120
# 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 = 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_lazy_writes = yes
# 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.
#mbox_min_index_size = n
##
## dbox-specific settings
##
# Maximum dbox file size in kilobytes until it's rotated.
#dbox_rotate_size = 2048
# Minimum dbox file size in kilobytes before it's rotated
# (overrides dbox_rotate_days)
#dbox_rotate_min_size = 16
# Maximum dbox file age in days until it's rotated. Day always begins from
# midnight, so 1 = today, 2 = yesterday, etc. 0 = check disabled.
#dbox_rotate_days = 0
##
## IMAP specific settings
##
protocol imap {
# Login executable location.
#login_executable = /usr/libexec/dovecot/imap-login
# IMAP executable location. Changing this allows you to execute other
# binaries before the imap process is executed.
#
# This would write rawlogs into ~/dovecot.rawlog/ directory:
# mail_executable = /usr/libexec/dovecot/rawlog /usr/libexec/dovecot/imap
#
# 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
#
#mail_executable = /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
# Maximum number of IMAP connections allowed for a user from each IP address.
# NOTE: The username is compared case-sensitively.
#mail_max_userip_connections = 10
# Support for dynamically loadable plugins. mail_plugins is a space separated
# list of plugins to load.
#mail_plugins =
#mail_plugin_dir = /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
# IMAP logout format string:
# %i - total number of bytes read from client
# %o - total number of bytes sent to client
#imap_logout_format = bytes=%i/%o
# Override the IMAP CAPABILITY response.
#imap_capability =
# 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 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.
# The list is space-separated.
#imap_client_workarounds =
}
##
## POP3 specific settings
##
protocol pop3 {
# Login executable location.
login_executable = /usr/local/libexec/dovecot/pop3-login
# POP3 executable location. See IMAP's mail_executable above for examples
# how this could be changed.
mail_executable = /usr/local/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
# If mail has X-UIDL header, use it as the mail's UIDL.
#pop3_reuse_xuidl = no
# Keep the mailbox locked for the entire POP3 session.
#pop3_lock_session = no
# POP3 UIDL (unique mail identifier) format to use. You can use following
# variables, along with the variable modifiers described in
# doc/wiki/Variables.txt (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_uidl_format = %08Xu%08Xv
# 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)
#pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s
# Maximum number of POP3 connections allowed for a user from each IP address.
# NOTE: The username is compared case-sensitively.
#mail_max_userip_connections = 3
# Support for dynamically loadable plugins. mail_plugins is a space separated
# list of plugins to load.
#mail_plugins =
#mail_plugin_dir = /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.
# The list is space-separated.
#pop3_client_workarounds =
}
##
## LDA specific settings
##
protocol lda {
# Address to use when sending rejection mails.
postmaster_address = postmaster(a)example.com
# Hostname to use in various parts of sent mails, eg. in Message-Id.
# Default is the system's real hostname.
#hostname =
# Support for dynamically loadable plugins. mail_plugins is a space separated
# list of plugins to load.
#mail_plugins =
#mail_plugin_dir = /usr/lib/dovecot/lda
# If user is over quota, return with temporary failure instead of
# bouncing the mail.
#quota_full_tempfail = no
# 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
#deliver_log_format = msgid=%m: %$
# Binary to use for sending mails.
#sendmail_path = /usr/lib/sendmail
# Human readable error message for rejection mails. Use can use variables:
# %n = CRLF, %r = reason, %s = subject, %t = recipient
#rejection_reason = Your message to <%t> was automatically rejected:%n%r
# UNIX socket path to master authentication server to find users.
#auth_socket_path = /var/run/dovecot/auth-master
}
##
## Authentication processes
##
# Executable location
auth_executable = /usr/local/libexec/dovecot/dovecot-auth
# Set max. process size in megabytes.
auth_process_size = 256
# 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_size = 0
# 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_ttl = 3600
# TTL for negative hits (user not found). 0 disables caching them completely.
#auth_cache_negative_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 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_username_format =
# 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_master_user_separator =
# 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
# In case of password mismatches, log the passwords and used scheme so the
# problem can be debugged. Requires auth_debug=yes to be set.
#auth_debug_passwords = 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
# Number of auth requests to handle before destroying the process. This may
# be useful if PAM plugins leak memory.
#auth_worker_max_request_count = 0
# Host name to use in GSSAPI principal names. The default is to use the
# name returned by gethostname().
#auth_gssapi_hostname =
# Kerberos keytab to use for the GSSAPI mechanism. Will use the system
# default (usually /etc/krb5.keytab) if not specified.
#auth_krb5_keytab =
# Do NTLM authentication using Samba's winbind daemon and ntlm_auth helper.
# <doc/wiki/Authentication/Mechanisms/Winbind.txt>
#auth_ntlm_use_winbind = no
# Path for Samba's ntlm_auth helper binary.
#auth_winbind_helper_path = /usr/bin/ntlm_auth
# Number of seconds to delay before replying to failed authentications.
#auth_failure_delay = 2
auth default {
# 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.
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.
#
# <doc/wiki/PasswordDatabase.txt>
#
# 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. <doc/wiki/Authentication.MasterUsers.txt>
# 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 {
# File contains a list of usernames, one per line
#args = /etc/dovecot.deny
#deny = yes
#}
# 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. <doc/wiki/PasswordDatabase.PAM.txt>
passdb pam {
# [session=yes] [setcred=yes] [failure_show_msg=yes]
# [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.
#
# 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
#args = dovecot
}
# System users (NSS, /etc/passwd, or similiar)
# In many systems nowadays this uses Name Service Switch, which is
# configured in /etc/nsswitch.conf. <doc/wiki/AuthDatabase.Passwd.txt>
passdb passwd {
# [blocking=yes] - See userdb passwd for explanation
#args =
}
# Shadow passwords for system users (NSS, /etc/shadow or similiar).
# Deprecated by PAM nowadays.
# <doc/wiki/PasswordDatabase.Shadow.txt>
passdb shadow {
# [blocking=yes] - See userdb passwd for explanation
#args =
}
# PAM-like authentication for OpenBSD.
# <doc/wiki/PasswordDatabase.BSDAuth.txt>
#passdb bsdauth {
# [cache_key=<key>] - See cache_key in PAM for explanation.
#args =
#}
# passwd-like file with specified location
# <doc/wiki/AuthDatabase.PasswdFile.txt>
passdb passwd-file {
# [scheme=<default password scheme>] [username_format=<format>]
# <Path for passwd-file>
driver = passwd-file
args = /usr/local/etc/dovecot.passdb
}
# checkpassword executable authentication
# NOTE: You will probably want to use "userdb prefetch" with this.
# <doc/wiki/PasswordDatabase.CheckPassword.txt>
#passdb checkpassword {
# Path for checkpassword binary
#args =
#}
# SQL database <doc/wiki/AuthDatabase.SQL.txt>
#passdb sql {
# Path for SQL configuration file, see doc/dovecot-sql-example.conf
#args =
#}
# LDAP database <doc/wiki/AuthDatabase.LDAP.txt>
#passdb ldap {
# Path for LDAP configuration file, see doc/dovecot-ldap-example.conf
#args =
#}
# vpopmail authentication <doc/wiki/AuthDatabase.VPopMail.txt>
#passdb vpopmail {
# [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)
#args =
#}
#
# User database specifies where mails are located and what user/group IDs
# own them. For single-UID configuration use "static".
#
# <doc/wiki/UserDatabase.txt>
#
# System users (NSS, /etc/passwd, or similiar). In many systems nowadays this
# uses Name Service Switch, which is configured in /etc/nsswitch.conf.
# <doc/wiki/AuthDatabase.Passwd.txt>
userdb passwd {
# [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!
#user = root
#args =
}
# passwd-like file with specified location
# <doc/wiki/AuthDatabase.PasswdFile.txt>
userdb passwd-file {
# [username_format=<format>] <Path for passwd-file>
driver = passwd-file
args = /usr/local/etc/dovecot.passdb
}
# static settings generated from template <doc/wiki/UserDatabase.Static.txt>
#userdb static {
# 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.
#
#args =
#}
# SQL database <doc/wiki/AuthDatabase.SQL.txt>
#userdb sql {
# Path for SQL configuration file, see doc/dovecot-sql-example.conf
#args =
#}
# LDAP database <doc/wiki/AuthDatabase.LDAP.txt>
#userdb ldap {
# Path for LDAP configuration file, see doc/dovecot-ldap-example.conf
#args =
#}
# vpopmail <doc/wiki/AuthDatabase.VPopMail.txt>
#userdb vpopmail {
#}
# "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.
# <doc/wiki/UserDatabase.Prefetch.txt>
#userdb prefetch {
#}
# 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
# Take the username from client's SSL certificate, using
# X509_NAME_get_text_by_NID() which returns the subject's DN's
# CommonName.
#ssl_username_from_cert = no
# It's possible to export the authentication interface to other programs:
socket listen {
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.
path = /var/run/dovecot/auth-master
mode = 0600
# Default user/group is the one who started dovecot-auth (root)
user = dovecot
group = mail
}
#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.
#path = /var/run/dovecot/auth-client
#mode = 0660
#}
}
}
# 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.
#auth external {
# socket connect {
# master {
# path = /var/run/dovecot/auth-master
# }
# }
#}
##
## Dictionary server settings
##
# Dictionary can be used by some plugins to store key=value lists.
# Currently this is only used by dict quota backend. 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
}
##
## 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 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
#quota = maildir
# 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 = vfile:/etc/dovecot-acls:cache_secs=300
# 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_mail = mbox:%h/mail
# Skip mailboxes which we can't open successfully instead of aborting.
#convert_skip_broken_mailboxes = no
# Skip directories beginning with '.'
#convert_skip_dotdirs = no
# If source storage has mailbox names with destination storage's hierarchy
# separators, replace them with this character.
#convert_alt_hierarchy_char = _
# 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
#trash = /etc/dovecot-trash.conf
# 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 = Trash 7 Spam 30
#expire_dict = db:/var/lib/dovecot/expire.db
# 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).
#lazy_expunge = .EXPUNGED/ .DELETED/ .DELETED/.EXPUNGED/
# Events to log. Default is all.
#mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
# Group events within a transaction to one line.
#mail_log_group_events =
# Available fields: uid, box, msgid, size, vsize
# size and vsize are available only for expunge and copy events.
#mail_log_fields = uid box msgid size
}
And here's what's in the dovecot.passdb file
Yoda:{PLAIN}littlegreenjedi:1001:1001:User 1 Name:/var/mail/folders/Yoda
DVader:{PLAIN}DarkMaster:1002:1002: User 2 Name: /var/mail/folders/DVader
HSolo:{PLAIN}Gokissawookiee:1003:1003: User 3 Name: /var/mail/folders/HSolo
LSkywalker{PLAIN}Jediknight:1004:1004: User 4 Name: /var/mail/folders/LSkywalker
Thanks for any help.
____________________________________________________________________________________
Be a better friend, newshound, and
know-it-all with Yahoo! Mobile. Try it now. http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ
3
2
On Fri, May 2, 2008 at 7:54 AM, Odhiambo Washington <odhiambo(a)gmail.com> wrote:
>
> Is thunderbird set to use pop3 or imap?
It can do both. I'd rather use imap but I am that kind of guy. ;)
> Anyway, I don't support thunderbird as I have never used it, but I can tell
> you how to connect to imap via telnet:
>
> telnet mail.thespider.com 143
> 1 login boris(a)mail.thespider.com creepycrawly
> 1 logout
>
> You can see this:
> http://www.macgeekery.com/tips/troubleshooting/troubleshooting_imap
>
This is what happened:
[raub@yakko ~]$ telnet mail.thespider.com 143
Trying 192.168.1.12...
Connected to mail.thespider.com (192.168.1.12).
Escape character is '^]'.
* OK dovecot ready.
1 login boris(a)mail.thespider.com creepycrawly
1 NO Authentication failed.
1 login boris(a)thespider.com creepycrawly
1 OK Logged in.
1 logout
* BYE Logging out
1 OK Logout completed.
Connection closed by foreign host.
[raub@yakko ~]$
I wonder if it has to do with the fact the virtual mailbox domain I
created in postfix is defined as thespider.com while the machine
running postfix/dovecot is mail.thespider.com.
> --
> Best regards,
> Odhiambo WASHINGTON,
> Nairobi,KE
> +254733744121/+254722743223
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
>
> "Oh My God! They killed init! You Bastards!"
> --from a /. post
1
0
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi,
I have put together a preliminary patchset for dovecot 1.1 at:
http://people.freebsd.org/~delphij/misc/dovecot-1.1-rc4.diff
My intention is to repocopy the current dovecot port to dovecot11 and
make changes on the latter. In this version of patchset, I have
intentionally removed the following chunk of change which by default
allows gid=0 users to log in.
%%%
@@ -333,6 +338,7 @@
~ # belongs to supplementary groups with non-valid GIDs, those groups are
~ # not set.
~ #first_valid_gid = 1
+first_valid_gid = 0
~ #last_valid_gid = 0
~ # Maximum number of running mail processes. When this limit is reached,
%%%
Please let me know if you want more features, have comments, etc., for
the FreeBSD port. I am subscribed to this list but I would appreciate
if you could use 'Reply all' which will give me more opportunity to get
your e-mail from the thousands I receive :)
Cheers,
- --
Xin LI <delphij(a)delphij.net> http://www.delphij.net/
FreeBSD - The Power to Serve!
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.9 (FreeBSD)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iEYEARECAAYFAkgY420ACgkQi+vbBBjt66CKNACfdGlItaGCo88W4ZdlLjkZ+Dlb
ug8AoJkp9z9nMzwU3K/LLpzOKwD2KDXK
=UzzN
-----END PGP SIGNATURE-----
3
2
Odd situation started recently whereby emails that are delivered into a
maildir folder are being truncated when read. The emails are delivered
via Exim and I can see the emails are complete when I look inside them.
However, when viewing the emails via Thunderbird or a webmail client,
they are truncated.
*** START 'dovecot -n' ***
# 1.0.13: /etc/dovecot/dovecot.conf
base_dir: /var/run/dovecot/
log_path: /var/log/mail.log
info_log_path: /var/log/mail.log
protocols: imap imaps pop3 pop3s
ssl_cert_file: /etc/ssl/server_certs/mail.example.com.crt
ssl_key_file: /etc/ssl/server_certs/mail.example.com.key
ssl_cipher_list: ALL:!LOW
disable_plaintext_auth: no
login_dir: /var/run/dovecot//login
login_executable(default): /usr/libexec/dovecot/imap-login
login_executable(imap): /usr/libexec/dovecot/imap-login
login_executable(pop3): /usr/libexec/dovecot/pop3-login
login_greeting: Welcome to the example IMAP server
first_valid_uid: 8
mail_access_groups: mail
mail_location: maildir:/home/vmail/%d/%n/mail
mail_debug: yes
mail_executable(default): /usr/libexec/dovecot/imap
mail_executable(imap): /usr/libexec/dovecot/imap
mail_executable(pop3): /usr/libexec/dovecot/pop3
mail_plugins(default): quota imap_quota
mail_plugins(imap): quota imap_quota
mail_plugins(pop3): quota
mail_plugin_dir(default): /usr/lib/dovecot/imap
mail_plugin_dir(imap): /usr/lib/dovecot/imap
mail_plugin_dir(pop3): /usr/lib/dovecot/pop3
imap_client_workarounds(default): delay-newmail outlook-idle
netscape-eoh tb-extra-mailbox-sep
imap_client_workarounds(imap): delay-newmail outlook-idle netscape-eoh
tb-extra-mailbox-sep
imap_client_workarounds(pop3): outlook-idle
pop3_uidl_format(default):
pop3_uidl_format(imap):
pop3_uidl_format(pop3): %08Xu%08Xv
pop3_client_workarounds(default):
pop3_client_workarounds(imap):
pop3_client_workarounds(pop3): outlook-no-nuls oe-ns-eoh
namespace:
type: private
separator: .
location: maildir:/home/vmail/%d/%n/mail
inbox: yes
auth default:
passdb:
driver: sql
args: /etc/dovecot/dovecot-sql.conf
userdb:
driver: sql
args: /etc/dovecot/dovecot-sql.conf
socket:
type: listen
master:
path: /var/spool/mail/dovecot/auth-master
mode: 511
user: root
plugin:
trash: /etc/dovecot-trash.conf
quota: maildir:storage=102400
*** END ***
I've deleted the dovecot cache and rebuilt, but there's no change here.
This is running on a Gentoo Linux server (Xen) with kernel 2.6.20.
Any ideas?
Iain.
2
4
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi everybody,
I have a little problem, when i am trying to read an email
via imap my thunderbird is trying (for ever) to read it.
My dovecot tells me :
dovecot: Apr 29 22:47:23 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
dovecot: Apr 29 22:47:24 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
dovecot: Apr 29 22:47:24 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
dovecot: Apr 29 22:47:25 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
dovecot: Apr 29 22:47:25 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
dovecot: Apr 29 22:47:25 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
dovecot: Apr 29 22:47:26 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
dovecot: Apr 29 22:47:26 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
dovecot: Apr 29 22:47:27 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
dovecot: Apr 29 22:47:27 Error: IMAP(ebalaskas): FETCH for mailbox
oreilly UID 24 got too little data: 2041 vs 2471
...
dovecot: Apr 29 22:47:27 Info: IMAP(ebalaskas): Disconnected: Disconnected
dovecot: Apr 29 22:47:27 Info: auth(default): new auth connection: pid=19349
dovecot: Apr 29 22:47:27 Info: auth(default): new auth connection: pid=19350
dovecot: Apr 29 22:47:27 Info: auth(default): new auth connection: pid=19351
dovecot: Apr 29 22:47:27 Info: auth(default): new auth connection: pid=19352
dovecot: Apr 29 22:47:27 Info: auth(default): new auth connection: pid=19353
dovecot: Apr 29 22:47:27 Info: auth(default): new auth connection: pid=19354
...
It's seems that the for the specific mail the dovecot tries to reconnect
for EVER.
But why ?
Why i cant read this specific mail ?
i have more than 72.000 but in some messages i get problems
like that. And there are not corrupted
(the messages, it's an oreilly newsletter mail for god shake :p ).
Any ideas ?
i think this is relative to Authentication Cache options.
dovecot 1.0.13
$ dovecot -n
base_dir: /usr/local/var/run/
log_path: /var/log/dovecot.log
info_log_path: /var/log/dovecot.info.log
protocols: imap
listen: *:143
ssl_disable: yes
disable_plaintext_auth: no
login_dir: /usr/local/var/run//login
login_executable: /usr/local/libexec/dovecot/imap-login
login_greeting: Hi buddy, have an account ?
max_mail_processes: 512
verbose_proctitle: yes
first_valid_uid: 1000
last_valid_uid: 5000
mail_privileged_group: mail
mail_location:
maildir:/var/mail/folders/%u:INDEX=/var/mail/index/%u:CONTROL=/var/mail/control/%u
mbox_read_locks: dotlock fcntl
imap_client_workarounds: tb-extra-mailbox-sep
auth default:
cache_size: 10240
cache_ttl: 18000
verbose: yes
debug: yes
debug_passwords: yes
passdb:
driver: passwd-file
args: /usr/local/etc/dovecot.passdb
userdb:
driver: passwd-file
args: /usr/local/etc/dovecot.passdb
socket:
type: listen
master:
path: /usr/local/var/run/dovecot-auth-master
mode: 432
user: dovecot
group: mail
PS: Btw timo this is the only one problem i have from
the very start with dovecot (almost 2 years)
Sorry for bad English !
Evaggelos Balaskas - http://ebalaskas.gr
Unix System Engineer
Informatics Engineer Technological Education
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org
iD8DBQFIF4GGWIK+Pe9twhoRAvW3AJ9C01bRQkbF7vGdmzc5yorzmSLxEACgo7YE
kB2QtWrkf8l+qIWpOKk70C4=
=PlnJ
-----END PGP SIGNATURE-----
2
2
Changes:
- Added goal 8 and rewrote mailbox synchronization plan.
- Added new SELECT command to change active mailbox and removed mailbox
ID from command parameters
Goals
-----
1. If a single (or configurable number of) server dies, no mails must be
lost that have been reported to IMAP/SMTP clients as being successfully
stored.
2. Must be able to automatically recover from a server desynchronization,
such as:
- server has been offline for a long time
- some mail files have been manually added/deleted
- corrupted data/mail files if they're noticed
3. In multi-master setup if the link between servers die, the servers must
be able to proceed autonomously (kind of conflicts with goal 1 though).
When the link comes back, the changes are replicated as soon as possible.
4. Normal IMAP commands must not be able to cause desynchronization between
servers. For example making conflicting flag changes simultaneously in two
servers must not result in the servers having different flags.
5. Must perform well with at least 3 servers in a multi-master setup,
preferrably still with tens of servers.
6. Latency shouldn't be increased noticeably when using servers distributed
into 3 or more data centers. Must be usable over high-latency links (in
optimistic async mode).
7. In normal operation send minimal incremental changes.
8. Make non-incremental synchronization fast enough to allow replication
with users' untrusted Dovecot servers which may connect only rarely.
Support also super high latency replication (e.g. using USB sticks).
Protocol
--------
There are two major parts in the protocol: Handling the normal incremental
changes and fixing desynchronization.
Originally I thought that maybe the changes could be sent using the same
format as Dovecot's transaction logs, but now I'm beginning to think that
it's probably not that good idea. The code reuse potential is quite minimal
and the format would still have to be extended in several ways so that it
won't be directly compatible anyway.
So I'm thinking the protocol could be something text-based. The main
benefit is that text-based protocols are easier to debug. Stream
compression should drop most of the extra overhead if bandwidth is a
problem.
The exact on-wire protocol anyway doesn't matter in the design that's
discussed below.
The commands have tags similar to IMAP commands, because some commands may
have to be forwarded to other servers and it may take a while to get a
reply. During the wait the server may process other commands.
Mailbox master
--------------
Each mailbox has a single master server selected. In multi-master setups
the master server may be moved by having the destination server simply
request it from the current master. The current master must then give it
up. If link is lost to the current master, one of the remaining servers
will become the new master within the remaining servers.
Each server must be connected to the current master server. Since each
mailbox can have a different master server, this typically means all
servers are connected to each others. However it's possible to create
setups where server connects to only one other server, which in turn
connect to more servers. This is useful if there are bandwidth bottlenecks
between some servers. This kind of a situation can also happen if in a
network A-B-C the link A-C dies, but A-B and B-C continues to work. Because
of this all commands must be able to function in a way that the server
proxies them to the current master, instead of failing the command and
trying to make it the caller's problem to resend the command to the actual
master.
When the cluster starts up, a single server is selected as the root master
for all mailboxes. If a server doesn't know who the current mailbox master
is, it asks from the root. All servers cache the currently known mailbox
masters to avoid constant requests to the root.
If the root server dies, another server is selected as the root. Because
the new root doesn't know what masters have been requested (and asking all
of them from all servers would just waste bandwidth), all the servers are
expected to flush their master caches and drop their own master status. The
new root doesn't respond to any requests before all servers have notified
that they've dropped being a master.
The master status doesn't have to be at mailbox level granularity. It could
just as well be configured to move at user, domain or even global level.
Perhaps this could be done dynamically, so that higher granularity is used
when the master is beginning to change too often between servers.
Mailbox ID
----------
Mailbox IDs are session-specific numbers dynamically assigned for
user+mailbox+UIDVALIDITY combinations. All connections have different
mailbox IDs. Also send and receive directions have different IDs. This
allows the sender to easily replace existing IDs to point to new mailboxes
without causing any confusion.
MBOX:
- Mailbox ID
- User name
- Mailbox name
- Mailbox UIDVALIDITY
Reply:
- [Mailbox UIDVALIDITY] (if changed - command failed)
- Mailbox UIDNEXT
- Highest modseq
If the receiver finds out it has a different UIDVALIDITY, the mailbox
requires a full resync. UIDNEXT and modseq can be used to determine if
replication servers are out of sync.
After mailbox ID has been assigned, the active mailbox can be changed using
a command:
SELECT:
- Mailbox ID
Requesting master status
------------------------
MASTER-MOVE:
- [Destination SID] (if forwarding)
The command is sent to the last known master for the selected mailbox. The
server will keep forwarding the command until it reaches the current
master. During the forwarding other servers may want to request something
from the master. These requests must be delayed by the forwarding servers
until the move is finished.
Saving messages
---------------
SAVE:
- Received date
- [IMAP UID] (only if we're the master)
- Global UID (stays the same when copying the message)
- Message text
Reply:
- [IMAP UID] (only if not specified in parameters)
- [Current mailbox master SID] (if it was moved)
If current server is not the master, the SAVE is sent to the master which
gives the message its IMAP UID. The master server then replicates the
message to other servers with the IMAP UID parameter set.
The mailbox master may have already changed by the time server receives a
save request. If server receives a SAVE without IMAP UID parameter, it's
responsible for finding out the new mailbox master and sending a new SAVE
request to it. Once the new master replies with the IMAP UID, the server
can reply to the original SAVE request, also providing the new master SID
so the future requests can be sent there directly.
To be sure the message doesn't get lost, the server should not reply OK to
the IMAP/SMTP client until it has received a reply from SAVE.
Copying messages
----------------
FIXME: Source or destination mailbox ID parameter should probably be
removed and the selected mailbox's ID used instead.
COPY:
- Source mailbox ID
- Destination mailbox ID
- Source IMAP UID
- Global UID
- [Destination IMAP UID] (only if we're the master)
- Destination received date
Reply:
- [Destination IMAP UID] (only if not specified in parameters)
- [Current mailbox master SID] (if it was moved)
Source mailbox ID + source IMAP UID identifies the message to be copied.
It's expected to contain the given global UID (which is just an extra
sanity check). Otherwise it works the same way as SAVE.
Since the message already exists, it's probably not necessary to wait for a
reply before replying OK to originating IMAP client.
Expunging messages
------------------
EXPUNGE:
- IMAP UIDs
(No reply)
Expunges also have to be sent via master server (the same way as SAVE) to
avoid COPY command failing in some servers because it was just expunged.
Changing message flags
----------------------
STORE:
- IMAP UIDs
- Added flags/keywords
- Removed flags/keywords
- [Current modseq] (master sends)
- [Highest modseq of the messages before this change] (non-master sends)
- [flag: this is a CONDSTORE STORE UNCHANGEDSINCE] (non-master may send)
[Reply:
- IMAP UIDs where STORE was rejected to (if CONDSTORE flag was used)
]
Stores also have to be sent via master server to avoid flag
desynchronization. Master first checks if it has higher modseqs in the
messages. Then it applies all the changes and forwards the changes to other
servers. For messages that had higher initial modseqs their flags are sent
to the server sending the STORE to fix a potential desync.
If CONDSTORE flag is set, the change is rejected for messages that had a
higher modseq. Non-masters shouldn't reply to a STORE UNCHANGEDSINCE
command before the change has been replicated to master and the rejections
have been processed.
Mailbox synchronization
-----------------------
Network connections to other servers are always initiated by the same
servers. From replication point of view they could be thought of as
client/server.
The clients keep track of the last seen server state for all mailboxes:
- UIDVALIDITY
- UIDNEXT
- Highest modseq
Client requests mailbox ID with MBOX command. If UIDVALIDITY changed, state
is reset by setting UIDNEXT=1 and highest modseq=0. MBOX command is then
resent using the updated UIDVALIDITY.
If server's UIDNEXT (server-UIDNEXT) is higher than last seen UIDNEXT
(old-UIDNEXT), it means the server has added new messages and we want to
fetch them. If the client's UIDNEXT (client-UIDNEXT) is higher than the
old-UIDNEXT, it means the client has added new messages and they need to be
sent to the server. All messages with UID >= old-UIDNEXT and UID <
min(client-UIDNEXT, server-UIDNEXT) have an UID conflict and they must be
given new unused UIDs.
The synchronization is done in two batches of commands. Client first
selects the mailbox and then starts the sync:
SYNC-BEGIN:
- server's last highest modseq
- client's current highest modseq
- QRESYNC-like sequence + IMAP UID lists for optimizing EXPUNGE replies
Client then proceeds to send all its changes using SAVE, EXPUNGE and STORE
commands. The sync is finished with SYNC-END command.
Server replies with:
- List of expunged IMAP UIDs (EXPUNGE command):
- IMAP UIDs
- Added messages (SAVE command?):
- IMAP UID
- Global UID
- Modseq
- Flags and keywords
- Received date
- [Message text]
- Changed flags/keywords/modseqs (STORE commands):
- IMAP UID
- Modseq
- Changed flags and keywords (or if not easily determined,
their current values)
- IMAP UID conflict fixes (UIDFIX command):
- Source IMAP UIDs
- Destination IMAP UIDs
- Sync finish:
- Updated UIDNEXT
- Updated highest modseq
Server may also reply with STORE commands that change nothing except
modseqs. This is needed to get the modseqs synchronized.
If in high-latency + high-bandwidth mode the message texts are always sent.
The message texts are also sent if the server can determine that the client
couldn't have previously seen the message (i.e. the message was saved, not
copied). Otherwise they have to be requested for the messages with
previously unseen global UIDs:
FETCH:
- IMAP UIDs
Reply:
- Message texts
By the time client receives the reply from server, it may already have done
further changes. This means it may have to fix modseqs and IMAP UIDs
internally as well.
3
6