Hello,
I spent the afternoon troubleshooting this, and after hours, I still can't see what I'm missing.
On the older version of Dovecot (2.2) it worked fine to create a new user, then Dovecot would create the home folder under the maildir folder as outlined in the documentation, simply by creating a new user in the database, and opening the new user account in the mail client.
# 2.3.7.2 (3c910f64b): /etc/dovecot/dovecot.conf # Pigeonhole version 0.5.7.2 (7372921a) # Hostname: triata4 auth_debug = yes auth_debug_passwords = yes auth_mechanisms = plain login auth_verbose = yes auth_verbose_passwords = plain debug_log_path = /var/log/dovecot-debug.log deliver_log_format = msgid=%m: from=%f: %$ hostname = triata.globalchange.media info_log_path = /var/log/dovecot-info.log mail_debug = yes mail_fsync = always mail_home = /vmail/%d/%n/home mail_location = maildir:/vmail/%d/%n 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 namespace inbox { inbox = yes location = mailbox Drafts { special_use = \Drafts } mailbox Junk { special_use = \Junk } mailbox Sent { special_use = \Sent } mailbox "Sent Messages" { special_use = \Sent } mailbox Trash { special_use = \Trash } prefix = separator = / type = private } passdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } plugin { mail_log_fields = uid box msgid from flags sieve = file:/vmail/%d/%n/home/sieve;active=/vmail/%d/%n/home/.dovecot.sieve sieve_after = /etc/dovecot/sieve/junk-spam.sieve sieve_before = /etc/dovecot/sieve/junk-spam.sieve sieve_dir = /vmail/%d/%n/home/sieve } protocols = imap lmtp sieve service auth { unix_listener /var/spool/postfix/private/auth { group = postfix mode = 0660 user = postfix } unix_listener auth-master { group = vmail mode = 0660 user = vmail } unix_listener auth-userdb { group = vmail mode = 0666 user = vmail } user = root } service imap-login { inet_listener imap { port = 143 } inet_listener imaps { port = 993 ssl = yes } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0660 user = postfix } } service managesieve-login { inet_listener sieve { port = 4190 } process_min_avail = 0 service_count = 1 vsz_limit = 64 M } service managesieve { process_limit = 1024 } service stats { unix_listener stats-reader { group = vmail mode = 0660 user = vmail } unix_listener stats-writer { group = vmail mode = 0660 user = vmail } } ssl_cert = </etc/letsencrypt/live/triata.globalchange.media/fullchain.pem ssl_key = # hidden, use -P to show it submission_relay_host = triata.globalchange.media submission_relay_port = 587 submission_relay_ssl = starttls submission_relay_trusted = yes userdb { args = /etc/dovecot/dovecot-mysql.conf driver = sql } protocol lmtp { mail_plugins = " sieve" } protocol lda { mail_plugins = }