我有一台运行 Sendmail 和 Dovecot 0.99 的旧服务器。该服务器上大约有 50 个电子邮件帐户,与托管在其上的各种域名相关联。电子邮件数据以 MBOX 格式存储在旧服务器上。
我需要将这些电子邮件帐户迁移到运行 Postfix 和 Dovecot 2.x 的目标服务器。目标服务器使用 Maildir 格式。
使用 imapsync 可以轻松迁移电子邮件本身。但是,不会保留 POP UIDL 值。这会导致任何使用 POP 客户端(MS Outlook 等)的用户将收件箱中的所有邮件作为副本重新下载到他们的邮箱中。
如何保留 UID?
我尝试过 dovecot dsync,但文档很差,而且我不断收到没有意义的错误消息。
注意:我们不能要求用户从 POP 切换到 IMAP,或更改其客户端软件中的任何设置。迁移必须对用户透明。
提前感谢您的任何建议!
好的,我想出了如何做到这一点。这是答案,对于任何可能觉得它有帮助的人。这是一个高级概述。如果您对任何特定步骤的详细信息有疑问,请告诉我。
在新服务器上创建用户邮箱。将密码设置为已知值。确保用户名与旧用户名匹配。
在旧服务器上复制用户当前的哈希密码。将此字符串保存在某处。
将用户密码设置为旧服务器上的已知值。
强制 dovecot 在新服务器上构建适当的邮箱文件:telnet 到新服务器,端口 110 并使用用户名和密码登录,然后发出 UIDL 命令。这应该列出零消息。
Telnet 到 OLD 服务器上的端口 110,以用户身份登录,然后使用 UIDL 命令转储 UID 列表。将此列表保存到 NEW 服务器上用户帐户的 Maildir 中的文件中。称它为 uidlist.old
记下旧服务器上的 UIDVALIDITY 值,对于 Dovecot 0.9x,当发出 UIDL 命令时,该值将是 UID 的第一部分: UIDL 命令的示例行输出:
1 1234567890.12345 1 = 消息号 1234567890 = UIDVALIDITY 12345 = 消息 UID
修改新服务器的 dovecot 配置以使用与旧服务器相同的 UID 格式。编辑 /etc/dovecot/conf.d/20-pop3.conf 文件并将 pop3_uidl_format 设置为所需的格式(对于 dovecot 0.9x,它应该是 %v.%u)
在新服务器上停止 Dovecot。
修改用户的dovecot-uidlist文件,将Vxxxxxx值改为旧账户的UIDVALIDITY值。该文件可以在用户的主目录/Maildir 中找到
删除用户 Maildir 中的所有 dovecot.index* 文件。
在新服务器上重新启动 Dovecot。
使用 imapsync 导入用户的电子邮件。包括 --useuid 选项。
导入后,再次 telnet 到新服务器的 110 端口并以用户身份登录。发出 UIDL 命令。这迫使 Dovecot 重建消息列表。
在新服务器上再次停止 dovecot。
验证新服务器上的 dovecot-uidlist 文件是否采用以下格式: 3 Vx Ny Gz 1 Px.y :z ...
第一行包含 Vx(uidvalidity)、Ny(下一条消息 UID)和 Gz(全局标识符)后续行包含单独的消息。1 是消息号 Px 是 uidvalidity 值,y 是消息 ID。z 是消息文件名。
如果文件不是这种格式,再次 telnet 到新的服务器端口 110 并以用户身份验证,然后再次发出 LIST 和 UIDL 命令。这应该会强制 Dovecot 以这种格式重写文件。
确保消息计数与来自旧帐户的消息计数相匹配。有时可能会有一条额外的重复消息。它可能在顶部,如果是这样,您应该看到文件名是相同的。如果它是重复的,只需从 dovecot-uidlist 文件中删除此行。
使用以下 PHP 脚本(需要 PHP)将 dovecot-uidlist 文件中每条消息的消息 ID 替换为 uidlist.old 中的正确 ID。在用户的 Maildir 目录中将脚本另存为 uidimport.php。
http://pastebin.com/x2vvVD9w (试图在这里发布,但它搞砸了)
确保现在 uidlist.old 或 uidlist.new 中有空行或虚假值。确保底部没有尾随空行!
运行 uidimport 如下:
php uidimport.php uidlist.old dovecot-uidlist > dovecot-uidlist.new
这将创建一个 dovecot-uidlist.new 文件,并在每一行中放置正确的 UID。
再次停止 Dovecot 并将现有的 dovecot-uidlist 文件替换为上面创建的 .new 版本。
删除任何 .index* 和 .log 文件。
编辑新的 dovecot-uidlist 文件并确保第 1 行的 Nxxxx 值设置为列表中 LAST 消息的 UID 之后的 NEXT 编号。此号码将用于下一条到达的消息。
重新启动 Dovecot 并远程登录到新的服务器端口 110。以用户身份进行身份验证,然后执行 UIDL 命令并将输出保存到 uidlist.new
做一个 uidlist.old 和 uidlist.new 的差异。如果没有发现任何差异,则您已成功复制用户的邮件,同时保留了每封邮件的 UID!恭喜!
遵循这些步骤将阻止 Outlook 和其他 POP 消息传递应用程序重新下载用户的现有消息。我已经成功地对收件箱中多达约 7000 条消息的帐户执行了这些步骤,并且成功!
如果您有任何问题,请随时与我联系。