https://wiki.dovecot.org/Migration/MailFormat
If you have not yet, please read this. Conversion can be done in-place.
While doing the in-place migration, I would strongly suggest keeping the users out from the server. While it's possible to do while there are users actively using the server, it is easier when there are no changes going on.
Regards, Aki
On 08/09/2022 20:43 EEST kjohnson@eclypse.org wrote:
What is the recommended procedure to migrate from mbox to maildir on a server already running dovecot? Ideally, this procedure would convert messages in an existing mbox INBOX and in ~/mail mboxes (as defined in my dovecot configuration) to storage in a ~/Maildir. Some of the INBOXs are rather large -- 100's of MB (one of the reasons for migrating).
What I have tried has not worked for me. Below, I describe what I tried, how I tested before I tried, what went wrong, and the current setup (pre-migration).
What I tried:
stop exim4
service dovecot stop
Make dovecot listen only locally, not to external connections.
/etc/dovecot/local.conf
protocol imap { listen = 127.0.0.1:143 ssl_listen = 127.0.0.1:993 }
protocol pop3 { listen = 127.0.0.1:110 ssl_listen = 127.0.0.1:995 }
Modify dovecot configuration for maildir: Watch capitalization!
#in 10-mail.conf:
mail_location = maildir:/home/%u/Maildir
namespace inbox { separator = / }
dovecot -n, to confirm results and perform limited syntax checking.
service dovecot start
for each user, in a bash script:
dsync -v -u "$U" mirror "mbox:/home/$U/mail:INBOX=/var/mail/$U"
(if the conversion worked for all users, then reconfigure exim to use maildir and restart it; reconfigure dovecot to listen to external interfaces and restart.)
How I tested:
Before trying this on the real server, I set up a matching (same versions of Debian, Exim, and Dovecot) VM using mbox, with a couple of accounts. One using POP3, one using IMAP. The IMAP account was accessed from Claws and from Outlook. The test accounts had perhaps a dozen messages on the server. I tried the conversion procedure, and everything I tried worked flawlessly. (Yes, next time I will move some real inbox files from the live server).
What went wrong:
I encountered two types of problems here. The first was several dsync warnings (username changed):
dsync(example): Warning: Mailbox changes caused a desync. You may want to run dsync again: Remote lost mailbox GUID 21bfa11a81f11763ac150000d09efc50 (maybe it was just deleted?)
As I understand it, this can result in some or all messages being downloaded again by clients. My understanding may be wrong. I also don't understand how the mailbox could have changed -- exim4 was stopped, dovecot is only listening on 127.0.0.1, and I am the only user who uses a local mail client on that system, and this was not my account.
The second problem I encountered seems to match Debian Bug report logs - #1011238.
In part of the discussion of that report, the reporter mentions adding -1 to the command, as shown:
dsync -v -u "$U" mirror -1 "mbox:/home/$U/mail:INBOX=/var/mail/$U"
While this seemed to eliminate the dsync panic of #1011238, as far as I can tell, no old messages were actually moved from the old mbox files to the new maildirs. At that point I restored the backup mbox files and undid the changes to dovecot and exim4.
Current setup:
Debian 11.4 Exim 4.94.2-7 dovecot 1:2.3.13+dfsg1-2
The current setup with Dovecot was a successful migration from IMAP-UW in December 2020.
Output from dovecot -n (the list of trusted networks has been removed) # 2.3.13 (89f716dc2): /etc/dovecot/dovecot.conf # Pigeonhole version 0.5.13 (cdd19fe3) # OS: Linux 5.10.0-16-686-pae i686 Debian 11.4 # Hostname: localhost auth_verbose = yes mail_location = mbox:~/mail:INBOX=/var/mail/%u mail_privileged_group = mail 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 = } passdb { driver = pam } pop3_uidl_format = %08Xv%08Xu protocols = " imap pop3" ssl_cert = </etc/dovecot/dovecot.pem ssl_client_ca_dir = /etc/ssl/certs ssl_dh = # hidden, use -P to show it ssl_key = # hidden, use -P to show it userdb { driver = passwd }
Thank you to anyone who read this far.
Ken