What is the correct way to configure the mail_location option for Mailidr format?

Steffen Kaiser skdovecot at smail.inf.fh-brs.de
Thu Oct 23 08:39:57 UTC 2014

Hash: SHA1

On Wed, 22 Oct 2014, deoren wrote:

> On 10/22/2014 2:29 AM, Steffen Kaiser wrote:
>> On Tue, 21 Oct 2014, deoren wrote:
>>> What is the correct way to configure the mail_location option for
>>> Mailidr format?
>> mail_location = maildir:<path>
>>> I've long had it setup this way:
>>>    mail_location = maildir:/var/vmail/%d/%n
>>> Is that correct?
>> any path is OK, as long:
>> 1) it identifies the mail storage uniquely for the user,
>> 2) does not store any other information in it.
>>> Here is an example error message I ran into:
>>>    stat(/var/vmail/example.com/username/.dovecot.lda-dupes/tmp)
>>> failed: Not a directory
>> That's because you use $HOME == Maildir root.
>>> Looking at some other guides/tutorials shows something more like:
>>>    mail_location = maildir:/var/vmail/%d/%n/Maildir
>> "Maildir" is the default name for "Maildir"-type mail storeage root. No
>> more, no less. If Dovecot is automatically detecting the type of
>> storage, it probes for this directory name in $HOME.
>>> I assume the latter is how it's supposed to be done? If so, that would
>> No, you are not "supposed" to do so.
>>> I did review the official docs here:
>>>    http://wiki2.dovecot.org/MailLocation/Maildir
>>> but I didn't find where it explicitly warns against setting home ==
>>> maildir root. It should probably be apparent, but it wasn't to me when
>>> I first
>> it applies to all mail storages.
> Thanks for the reply and for answering my questions.
> Just to make sure I understand properly, I have a few additional questions 
> that I am hoping will cement really drive the point home so to speak. 
> Regarding the guide that I followed, it suggests the following userdb and 
> mail_location configuration:
> userdb {
>  driver = static
>  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
> }
> mail_location = maildir:/var/mail/vhosts/%d/%n
> This results in the $HOME == Maildir root situation which you mentioned 
> shouldn't be done, correct? Instead mail_location should point to some other 
> directory,


>            perhaps one of:
> * mail_location = /var/mail/vhosts/%d/%n/Maildir
> * mail_location =  ~/Maildir

for instance, yes.

> If I understand properly the mail_location doesn't have to be a subdirectory 
> within the home directory, it just typically is in common examples? If so,

Yes again. And "Maildir" is just common and the default, but you could 
name the last path component anyway you like, even "mbox", "sdbox", or
"mdbox", but such name probably would confuse any admin, that take the 
server over, because the dir name does imply something different than 

> that guide should probably be updated to use one of the above mail_location 
> settings. If you will confirm that is the case I'll submit a GitHub pull 
> request as previously mentioned so it can be corrected.
> Apologies if this is rehashing what you've already said, I'm just looking to 
> make sure I understand this 100%.
> So for cases where I have made the mistake like I mentioned above, how would 
> I (properly) fix the problem?
> After stopping Dovecot, I ended up doing this:
> #1) service dovecot stop
> #2) cd /var/vmail/example.com/username/
> #3) mkdir Maildir
> #4) mv -i * Maildir/
> #5) mv -i .* Maildir/
> #6) chown -R vmail:vmail /var/vmail/example.com/username/
> #7) service dovecot start

#5 will match "..", too.
Better: mv -i * .??* Maildir

That will move the Sieve and LDA files, too, as you found out yourself, 

mkdir Maildir ; mv -i * .??* Maildir && for file in Maildir/.dovecot.*; do
  test -f "$file" && mv "$file" .
done; mv Maildir/sieve_dir .

The 1st "mv" moves all files into Maildir, the for loop is to move the 
sieve files back, and the 3rd mv moves the sieve folder back - you have to 
adjust your name there.

> which moved the content into the Maildir subfolder and fixed permissions back 
> to what is specified in the conf files. I also adjusted mail_location like 
> so:
> mail_location = maildir:~/Maildir
> and I made sure that the home setting is configured as /var/vmail/%d/%n
> That seems to work fine, but I still got error messages like this when using 
> doveadm search
> "Error: Syncing mailbox dovecot.lda-dupes failed: Internal error occurred."
> In my testing I found that I could move the file from this location:
>    /var/vmail/example.com/username/Maildir/.dovecot.ldap-dupes
> to this one:
>    /var/vmail/example.com/username/.dovecot.ldap-dupes
> choosing to overwrite the file if it should be there and the error message 
> would not be generated anymore. This suggests that I shouldn't have moved it 
> in the first place.
> Looking through the mailing list archives I found a message thread titled 
> "Lifetime of redirect info stored by Sieve in .dovecot.lda-dupes" which 
> indicates that the Message-ID and recipient of forwarded messages are stored 
> in .dovecot.ldap-dupes files. I do forward mail daily from the two accounts 
> where doveadm search generates the errors, so it sounds like I would probably 
> be OK to just nuke the file in this location:
>     /var/vmail/example.com/username/Maildir/.dovecot.ldap-dupes
> and let it be auto-generated in the proper location the next time mail is 
> forwarded. Can you confirm whether that is the case?

.dovecot.lda-dupes is not essential, but you might get (seldomly) some 
dupes or some users might get duplicate vacation responses from Sieve.

- -- 
Steffen Kaiser
Version: GnuPG v1.4.11 (GNU/Linux)


More information about the dovecot mailing list