I’m trying to configure dovecot to use mailbox subfolders that look like both foo/bar on the IMAP client and the filesystem.
But the subfolders created all look like foo.bar, not foo/bar with a proper nesting structure.
This also happens when the folder ‘bar’ is moved into the folder ‘foo’—A new folder `foo.bar’ is created.
I believe that i’m following the configuration rules at https://wiki.dovecot.org/MailboxFormat/Maildir#Maildir_and_filesystems and https://wiki.dovecot.org/MailLocation/Maildir. This issue happens whether I set separator to its default, ‘.’, or ‘/’:
mail_location = mdbox:/private/var/mail/tld.hostname.mail/%Ln/mdbox:LAYOUT=fs
namespace inbox {
…
separator = /
…
}
The IMAP client is macOS Mail.app version 14.0.
I’d greatly appreciate any help or pointers to fix this configuration issue.
dovecot -n
2.3.13 (): /opt/local/etc/dovecot/dovecot.conf
Pigeonhole version 0.5.13 ()
OS: Darwin 20.4.0 x86_64 apfs
Hostname: mail.hostname.tld
aps_topic = com.apple.mail.XServer.ffffffff-ffff-fff-ffffffffff
auth_cache_size = 10 M
auth_gssapi_hostname = $ALL
auth_krb5_keytab = /opt/local/etc/dovecot/imap.keytab
auth_mechanisms = plain gssapi
auth_realms =mail.hostname.tld
auth_socket_path = /opt/local/var/run/dovecot/auth-userdb
auth_username_format = %Ln
debug_log_path = /opt/local/var/log/mail/mail-debug.log
disable_plaintext_auth = no
first_valid_gid = 6
first_valid_uid = 6
imap_id_log = *
imap_id_send = "name" * "version" *
imap_idle_notify_interval = 29 mins
imap_urlauth_submit_user = submit
info_log_path = /opt/local/var/log/mail/mail-info.log
last_valid_gid = 100
lda_mailbox_autocreate = yes
log_path = /opt/local/var/log/mail/mail-err.log
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l mpid=%e %c
mail_access_groups = mail
mail_attachment_dir = /private/var/mail/tld.hostname.mail/attachments
mail_attachment_fs = sis posix:mode=0666
mail_gid = mail
mail_home = /private/var/mail/tld.hostname.mail
mail_location = mdbox:/private/var/mail/tld.hostname.mail/%Ln/mdbox:LAYOUT=fs
mail_log_prefix = "%s(pid %p user %u): "
mail_plugins = quota zlib acl fts fts_solr fts_lucene
mail_privileged_group = mail
mail_uid = _dovecot
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext imapsieve vnd.dovecot.imapsieve
mdbox_rotate_size = 200 M
namespace inbox {
inbox = yes
location =
mailbox Archive {
auto = subscribe
special_use = \Archive
}
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Junk {
auto = create
special_use = \Junk
}
mailbox Notspam_train {
auto = create
special_use = \Junk
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Spam_train {
auto = create
special_use = \Junk
}
mailbox Trash {
auto = create
special_use = \Trash
}
prefix =
separator = /
}
passdb {
driver = pam
name = pam
}
plugin {
fts = solr
fts_autoindex = yes
fts_autoindex_exclude = \Junk
fts_solr = url=http://127.0.0.1:8983/solr/dovecot/
imapsieve_mailbox1_before = file:/opt/local/etc/dovecot/sieve/report-spam.sieve
imapsieve_mailbox1_causes = COPY APPEND
imapsieve_mailbox1_name = Spam_train
imapsieve_mailbox2_before = file:/opt/local/etc/dovecot/sieve/report-ham.sieve
imapsieve_mailbox2_causes = COPY APPEND
imapsieve_mailbox2_name = Notspam_train
mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
mail_log_fields = uid box msgid from subject size flags
quota_grace = 10%%
quota_rule = *:storage=16G
quota_rule2 = Trash:storage=+256M
quota_warning = storage=100%% quota-exceeded %u
quota_warning2 = storage=80%% quota-warning %u
recipient_delimiter = +
sieve = /private/var/mail/tld.hostname.mail/rules/%Ln/dovecot.sieve
sieve_after = /opt/local/etc/dovecot/sieve-after.d
sieve_before = /opt/local/etc/dovecot/sieve-before.d
sieve_dir = /private/var/mail/tld.hostname.mail/rules/%Ln/%u
sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
sieve_pipe_bin_dir = /opt/local/etc/dovecot/sieve
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_quota_max_storage = 50M
}
postmaster_address = postmaster@hostname.tld
protocols = imap lmtp sieve
quota_full_tempfail = yes
sendmail_path = /opt/local/sbin/sendmail
service auth-worker {
group = mail
user = root
}
service auth {
extra_groups = _keytabusers
idle_kill = 15 mins
unix_listener /opt/local/var/spool/postfix/private/auth {
group = mail
mode = 0660
user = _postfix
}
}
service dns-client {
unix_listener dns-client {
mode = 0600
}
}
service imap-login {
inet_listener imap {
address = 127.0.0.1, ::1
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
process_min_avail = 6
service_count = 0
vsz_limit = 2 G
}
service imap {
process_limit = 200
process_min_avail = 6
}
service lmtp {
unix_listener /opt/local/var/spool/postfix/private/dovecot-lmtp {
group = mail
mode = 0660
user = _postfix
}
}
ssl = required
ssl_ca = </opt/local/etc/certificates/cert.chain.pem
ssl_cert = </opt/local/etc/certificates/cert.cert.pem
ssl_cipher_list = ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
ssl_dh = # hidden, use -P to show it
ssl_key = # hidden, use -P to show it
ssl_min_protocol = TLSv1.2
ssl_prefer_server_ciphers = yes
userdb {
driver = passwd
name = passwd
}
verbose_proctitle = yes
protocol lda {
mail_fsync = optimized
mail_plugins = quota zlib acl fts fts_solr fts_lucene sieve push_notify
}
protocol imap {
mail_max_userip_connections = 50
mail_plugins = quota zlib acl fts fts_solr fts_lucene imap_acl imap_quota imap_zlib imap_sieve
}
protocol lmtp {
mail_fsync = optimized
mail_plugins = quota zlib acl fts fts_solr fts_lucene sieve
}