Hi Timo No, I don't have mailbox_list_index_very_dirty_syncs=yes, using default no value. I can no longer reproduce this problem since having upgraded from 2.4.3 to 2.4.4, no single "Error: Failed to rename mailbox '...' for NFC normalization" error since then. Previously, on Dovecot 2.4.3, the Errors also popped up on regular umlauts, even after renaming those characters to regular umlauts to make sure those were not represented as NFD. But on Dovecot 2.4.4 all good, without any further workarounds needed. May this be related to this changelog entry? - lib-storage: Auto-rename non-NFC subscription file entries to NFC on read. Kind regards, Philip
On 16 May 2026, at 13:53, Timo Sirainen via dovecot <dovecot@dovecot.org> wrote:
Do you have mailbox_list_index_very_dirty_syncs=yes? If yes, does the problem go away if you run: doveadm -o mailbox_list_index_very_dirty_syncs=no mailbox list -u $user
Alternatively, try doveadm force-resync -u $user '*'
Yet another possibility to try rm dovecot.list.index*
Also, there is this patch that possibly helps:
diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index a4363fc73c..b42053bc1a 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -1557,11 +1557,7 @@ int mailbox_rename_nfc_forced(struct mailbox_list *list, const char *vname_raw,
ret = mailbox_rename(box_old, box_new); if (ret < 0 && - mailbox_get_last_mail_error(box_old) == MAIL_ERROR_NOTFOUND) { - /* ignore */ - ret = 0; - } else if (ret < 0 && - mailbox_get_last_mail_error(box_old) == MAIL_ERROR_EXISTS) { + mailbox_get_last_mail_error(box_old) == MAIL_ERROR_EXISTS) { /* generate a new unique name */ guid_128_t guid; guid_128_generate(guid); @@ -1572,6 +1568,16 @@ int mailbox_rename_nfc_forced(struct mailbox_list *list, const char *vname_raw, box_new = mailbox_alloc(list, *vname_new_r, 0); ret = mailbox_rename(box_old, box_new); } + if (ret < 0 && + mailbox_get_last_mail_error(box_old) == MAIL_ERROR_NOTFOUND) { + /* Source doesn't exist on disk anymore (e.g. backing store + already renamed externally while the list index still has + the old non-NFC entry). Treat as no-op rather than fail + the iteration: return the plain NFC name so the caller + doesn't expose the unique-suffix fallback name. */ + *vname_new_r = vname_nfc; + ret = 0; + } if (ret < 0) *error_r = mailbox_get_last_error(box_old, NULL); mailbox_free(&box_old);
On 12. May 2026, at 15.43, Philip Iezzi via dovecot <dovecot@dovecot.org> wrote:
Thanks Jan for reporting this. I also experience this Bug since having upgraded Dovecot 2.4.2 -> 2.4.3 on 2026-03-27, leading to such errors in mail.log:
Error: Failed to rename mailbox 'INBOX/Zürich' for NFC normalization: Mailbox doesn't exist: INBOX/Zürich
- Zürich (in above log line) uses a decomposed sequence: a plain u (U+0075) followed by a combining diaeresis (U+0308), which the renderer stacks on top. - Zürich (which we usually type) uses a precomposed character: ü is a single code point, U+00FC (LATIN SMALL LETTER U WITH DIAERESIS).
Such errors lead to broken folder structure - the user is no longer able to list the whole folder structure (except INBOX) and on mail clients like Roundcube, all folders appear as no longer subscribed. Renaming the "ü" to "ü" fixes the problem. But I have a bunch of other customers which use such characters and in previous Dovecot versions <= 2.4.2 this was never a problem.
Is there any known issue / will this be addressed in the next minor version?
Kind regards, Philip
On 5 May 2026, at 16:04, Jan Münnich via dovecot <dovecot@dovecot.org> wrote:
Following up on my own thread in case anyone hits the same issue:
The failed NFC rename in 2.4 left behind a duplicate mailbox with a 32-hex GUID suffix, but only for mailboxes that had subfolders. So for every affected name we ended up with two entries:
Anträge Anträge-e078d427706eda694b210000a386c91b
The original kept its (broken) name with no message access, and the GUID-suffixed sibling held the actual mail. Both showed up as real folders in IMAP clients.
I figured out from the source code that the failed rename hits a fallback path that creates the GUID-suffixed sibling, but not what triggers the failure in the first place. I also found a hidden option there that is not listed in documentation, which works as a workaround to stop new occurrences: 'mailbox_list_normalize_names_to_nfc = no'.
Fix for already-affected mailboxes: for each one, create a temporary ASCII-named replacement at the same hierarchy level, move the subfolders into it, move messages from the GUID-suffixed mailbox into it, delete the GUID-suffixed mailbox (the broken original then disappears), and rename the replacement back to the original name. The final rename runs through the regular code path (without NFC normalisation) and works fine.
Kind regards, Jan
On 11 Apr 2026, at 17:25, Jan Münnich via dovecot <dovecot@dovecot.org> wrote:
Hi,
We just upgraded from 2.3 to 2.4.3 and are now getting errors like this for any mailbox with German umlauts in the name:
"Error: Failed to rename mailbox 'Anträge' for NFC normalization: Mailbox doesn't exist: Anträge"
The mailboxes work fine otherwise, doveadm mailbox status shows them with correct message counts. The errors show up on IMAP access but don't seem to break anything.
We're using mdbox. On disk the directory is stored as mUTF-7:
Antr&AOQ-ge
doveadm mailbox list gives back the name with c3 a4 for the ä, which is already NFC. We double-checked with python3 unicodedata and it confirms the name is NFC. So it seems like dovecot is trying to rename something that doesn't need renaming, and then failing.
Is there a way to turn off this automatic rename? Or is this a known issue with mdbox and mUTF-7 directory names?
Any help would be appreciated to find out if this is a bug or a configuration issue on our side!
Thanks, Jan
_______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org
_______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org
_______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org
_______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org
Hi Timo No, I don't have mailbox_list_index_very_dirty_syncs=yes, using default no value. I can no longer reproduce this problem since having upgraded from 2.4.3 to 2.4.4, no single "Error: Failed to rename mailbox '...' for NFC normalization" error since then. Previously, on Dovecot 2.4.3, the Errors also popped up on regular umlauts, even after renaming those characters to regular umlauts to make sure those were not represented as NFD. But on Dovecot 2.4.4 all good, without any further workarounds needed. May this be related to this changelog entry? - lib-storage: Auto-rename non-NFC subscription file entries to NFC on read. Kind regards, Philip On 16 May 2026, at 13:53, Timo Sirainen via dovecot <dovecot@dovecot.org> wrote: Do you have mailbox_list_index_very_dirty_syncs=yes? If yes, does the problem go away if you run: doveadm -o mailbox_list_index_very_dirty_syncs=no mailbox list -u $user Alternatively, try doveadm force-resync -u $user '*' Yet another possibility to try rm dovecot.list.index* Also, there is this patch that possibly helps: diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index a4363fc73c..b42053bc1a 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -1557,11 +1557,7 @@ int mailbox_rename_nfc_forced(struct mailbox_list *list, const char *vname_raw, ret = mailbox_rename(box_old, box_new); if (ret < 0 && - mailbox_get_last_mail_error(box_old) == MAIL_ERROR_NOTFOUND) { - /* ignore */ - ret = 0; - } else if (ret < 0 && - mailbox_get_last_mail_error(box_old) == MAIL_ERROR_EXISTS) { + mailbox_get_last_mail_error(box_old) == MAIL_ERROR_EXISTS) { /* generate a new unique name */ guid_128_t guid; guid_128_generate(guid); @@ -1572,6 +1568,16 @@ int mailbox_rename_nfc_forced(struct mailbox_list *list, const char *vname_raw, box_new = mailbox_alloc(list, *vname_new_r, 0); ret = mailbox_rename(box_old, box_new); } + if (ret < 0 && + mailbox_get_last_mail_error(box_old) == MAIL_ERROR_NOTFOUND) { + /* Source doesn't exist on disk anymore (e.g. backing store + already renamed externally while the list index still has + the old non-NFC entry). Treat as no-op rather than fail + the iteration: return the plain NFC name so the caller + doesn't expose the unique-suffix fallback name. */ + *vname_new_r = vname_nfc; + ret = 0; + } if (ret < 0) *error_r = mailbox_get_last_error(box_old, NULL); mailbox_free(&box_old); On 12. May 2026, at 15.43, Philip Iezzi via dovecot <dovecot@dovecot.org> wrote: Thanks Jan for reporting this. I also experience this Bug since having upgraded Dovecot 2.4.2 -> 2.4.3 on 2026-03-27, leading to such errors in mail.log: Error: Failed to rename mailbox 'INBOX/Zuerich' for NFC normalization: Mailbox doesn't exist: INBOX/Zuerich - Zuerich (in above log line) uses a decomposed sequence: a plain u (U+0075) followed by a combining diaeresis (U+0308), which the renderer stacks on top. - Zuerich (which we usually type) uses a precomposed character: ue is a single code point, U+00FC (LATIN SMALL LETTER U WITH DIAERESIS). Such errors lead to broken folder structure - the user is no longer able to list the whole folder structure (except INBOX) and on mail clients like Roundcube, all folders appear as no longer subscribed. Renaming the "ue" to "ue" fixes the problem. But I have a bunch of other customers which use such characters and in previous Dovecot versions <= 2.4.2 this was never a problem. Is there any known issue / will this be addressed in the next minor version? Kind regards, Philip On 5 May 2026, at 16:04, Jan Muennich via dovecot <dovecot@dovecot.org> wrote: Following up on my own thread in case anyone hits the same issue: The failed NFC rename in 2.4 left behind a duplicate mailbox with a 32-hex GUID suffix, but only for mailboxes that had subfolders. So for every affected name we ended up with two entries: Antraege Antraege-e078d427706eda694b210000a386c91b The original kept its (broken) name with no message access, and the GUID-suffixed sibling held the actual mail. Both showed up as real folders in IMAP clients. I figured out from the source code that the failed rename hits a fallback path that creates the GUID-suffixed sibling, but not what triggers the failure in the first place. I also found a hidden option there that is not listed in documentation, which works as a workaround to stop new occurrences: 'mailbox_list_normalize_names_to_nfc = no'. Fix for already-affected mailboxes: for each one, create a temporary ASCII-named replacement at the same hierarchy level, move the subfolders into it, move messages from the GUID-suffixed mailbox into it, delete the GUID-suffixed mailbox (the broken original then disappears), and rename the replacement back to the original name. The final rename runs through the regular code path (without NFC normalisation) and works fine. Kind regards, Jan On 11 Apr 2026, at 17:25, Jan Muennich via dovecot <dovecot@dovecot.org> wrote: Hi, We just upgraded from 2.3 to 2.4.3 and are now getting errors like this for any mailbox with German umlauts in the name: "Error: Failed to rename mailbox 'Antraege' for NFC normalization: Mailbox doesn't exist: Antraege" The mailboxes work fine otherwise, doveadm mailbox status shows them with correct message counts. The errors show up on IMAP access but don't seem to break anything. We're using mdbox. On disk the directory is stored as mUTF-7: Antr&AOQ-ge doveadm mailbox list gives back the name with c3 a4 for the ae, which is already NFC. We double-checked with python3 unicodedata and it confirms the name is NFC. So it seems like dovecot is trying to rename something that doesn't need renaming, and then failing. Is there a way to turn off this automatic rename? Or is this a known issue with mdbox and mUTF-7 directory names? Any help would be appreciated to find out if this is a bug or a configuration issue on our side! Thanks, Jan _______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org _______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org _______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org _______________________________________________ dovecot mailing list -- dovecot@dovecot.org To unsubscribe send an email to dovecot-leave@dovecot.org