Confusion about mailbox_list_layout=fs

Roland Hieber via dovecot <[email protected]> Wed, 22 Jul 2026 14:55:39 +0200
Newsgroups gmane.mail.imap.dovecot
Message-ID <1784722927-cff07a3d58dbfb5e671abd08@pty>
--qnvhfei3phzu5qpg
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

Hi,

I am trying to understand how 'mailbox_list_layout = fs' is working when I
have 'mail_driver = Maildir' (on Dovecot 2.4.1-4 from Debian trixie).
If I look at 'doveconf -a', I see that 'mailbox_list_layout = fs' is already
the default, however, the Maildirs from my freshly created test user are still
created on disk in the format .INBOX.subfolder instead of INBOX/subfolder, which
is in conflict with what the documentation says at
<https://doc.dovecot.org/2.4.3/core/config/mailbox_formats/maildir.html#directory-layout>.

However, if I set 'mailbox_list_layout = fs' *explicitely* in the global
part of /etc/dovecot/conf.d/10-mail.conf, then delete all files and folders in
the mail home of my test user, reload dovecot, send a test mail, and create a
new subfolder for my test user in Thunderbird, the new subfolder gets created on
disk as INBOX/subfolder, just like I expect.

The behaviour is consistently reproducable in both directions: I also get
maildirs with dots again after I delete mailbox_list_layout from 10-mail.conf,
reload dovecot, and clear the mail home of my test user.

What is going on here…? I don't see any change in 'doveconf -a' between these
two use cases (the output is literally identical, and it's both showing
'mailbox_list_layout = fs'), and obviously it's missing from 'doveconf -n'
because it's the default.

I also found out that it is possible to override this setting per user by using
the 'userdb_mailbox_list_layout' option in the extra fields of the userdb, but
I'm not setting any extra fields there for my test user.

Output of 'doveconf -n' (redacted where necessary) is attached.

Regards,

 - Roland

-- 
Roland Hieber, Pengutronix e.K.          | [email protected]          |
Steuerwalder Str. 21                     | https://www.pengutronix.de/ |
31137 Hildesheim, Germany                | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686         | Fax:   +49-5121-206917-5555 |

--qnvhfei3phzu5qpg
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename=doveconf-n

# 2.4.1-4 (7d8c0e5759): /etc/dovecot/dovecot.conf
# Pigeonhole version 2.4.1-4 (0a86619f)
# OS: Linux 6.12.73+deb13-amd64 x86_64 Debian 13.6 
# Hostname: [redacted]
# 4 default setting changes since version 2.4.0
dovecot_config_version = 2.4.0
auth_mechanisms = plain login
auth_username_format = %{user|lower}
auth_verbose = yes
doveadm_password = # hidden, use -P to show it
dovecot_storage_version = 2.4.0
fts_autoindex = yes
fts_autoindex_max_recent_msgs = 999
fts_search_add_missing = yes
lmtp_save_to_detail_mailbox = yes
lmtp_user_concurrency_limit = 200
mail_driver = maildir
mail_home = /srv/mail/%{user}
mail_inbox_path = INBOX
mail_path = %{home}/mail
mail_privileged_group = mail
namespace_separator = /
protocols {
  imap = yes
  lmtp = yes
  sieve = yes
}
sieve_extensions {
  fileinto = yes
  reject = yes
  envelope = yes
  encoded-character = yes
  vacation = yes
  subaddress = yes
  comparator-i;ascii-numeric = yes
  relational = yes
  regex = yes
  imap4flags = yes
  copy = yes
  include = yes
  body = yes
  variables = yes
  enotify = yes
  environment = yes
  mailbox = yes
  date = yes
  index = yes
  ihave = yes
  duplicate = yes
  mime = yes
  foreverypart = yes
  extracttext = yes
  vnd.dovecot.debug = yes
  vnd.dovecot.pipe = yes
  editheader = yes
}
sieve_pipe_bin_dir = /usr/lib/dovecot/sieve-pipe
sieve_pipe_socket_dir = sieve-pipe
sieve_plugins {
  sieve_extprograms = yes
}
sieve_trace_debug = yes
sieve_trace_level = matching
ssl = required
verbose_proctitle = yes
passdb passwd-file {
  auth_username_format = %{user}
  default_password_scheme = crypt
  passwd_file_path = /etc/dovecot/users
}
userdb passwd-file {
  auth_username_format = %{user}
  passwd_file_path = /etc/dovecot/users
}
namespace inbox {
  hidden = no
  inbox = yes
  list = yes
  separator = /
  mailbox Drafts {
    auto = subscribe
    special_use = "\\Drafts"
  }
  mailbox Junk {
    auto = subscribe
    special_use = "\\Junk"
  }
  mailbox Trash {
    auto = subscribe
    special_use = "\\Trash"
  }
  mailbox Sent {
    auto = subscribe
    special_use = "\\Sent"
  }
}
service imap-login {
  inet_listener imap {
  }
  inet_listener imaps {
  }
}
service pop3-login {
}
service submission-login {
}
service lmtp {
  vsz_limit = 400M
  unix_listener lmtp {
    mode = 0660
  }
}
service imap {
}
service pop3 {
}
service submission {
}
service auth {
  unix_listener auth-userdb {
  }
}
service auth-worker {
}
service dict {
  unix_listener dict {
  }
}
ssl_server {
  cert_file = /var/lib/dehydrated/certs/local/fullchain.pem
  key_file = /var/lib/dehydrated/certs/local/privkey.pem
}
protocol lmtp {
  mail_plugins {
    sieve = yes
  }
}
service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
}
service managesieve {
}
service stats {
  inet_listener http {
    port = 9243
    listen = 127.0.0.1 ::1
  }
}
metric auth_success {
  filter = (event=auth_request_finished AND success=yes)
}
sieve_script personal {
  active_path = ~/.dovecot.sieve
  driver = file
  path = ~/sieve
}
sieve_script default {
  driver = file
  name = default
  path = /etc/dovecot/sieve/default/default.sieve
  type = default
}

--qnvhfei3phzu5qpg
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
dovecot mailing list -- [email protected]
To unsubscribe send an email to [email protected]

--qnvhfei3phzu5qpg--