我有一台运行 Sendmail 和 Dovecot 0.99 的旧服务器。该服务器上有大约 50 个电子邮件帐户,与托管在其上的各种域名相关联。电子邮件数据以 MBOX 格式存储在旧服务器上。
我需要将这些电子邮件帐户迁移到运行 Postfix 和 Dovecot 2.x 的目标服务器。目标服务器使用 Maildir 格式。
使用 imapsync 可以轻松迁移电子邮件本身。但是,不会保留 POP UIDL 值。这会导致任何使用 POP 客户端(MS Outlook 等)的用户将收件箱中的所有邮件作为重复邮件重新下载到他们的邮箱中。
我该如何保存 UID?
我尝试过 dovecot dsync,但是文档很差,而且我不断收到毫无意义的错误消息。
注意:我们不能要求用户从 POP 切换到 IMAP,或更改其客户端软件中的任何设置。迁移必须透明的对于用户来说。
提前感谢您的任何建议!
答案1
好的,我知道如何做到这一点。以下是答案,希望对任何可能觉得有帮助的人有所帮助。这是一个高层次的概述。如果您对任何特定步骤的细节有疑问,请告诉我。
在新服务器上创建用户邮箱。将密码设置为已知值。确保用户名与旧用户名匹配。
在旧服务器上复制用户当前的哈希密码。将此字符串保存在某处。
将用户密码设置为旧服务器上的已知值。
强制 dovecot 在新服务器上构建适当的邮箱文件:telnet 到新服务器,端口 110,使用用户名和密码登录,然后发出 UIDL 命令。这应该会列出零条消息。
Telnet 到旧服务器上的端口 110,以用户身份登录,然后使用 UIDL 命令转储 UID 列表。将此列表保存到新服务器上用户帐户的 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 并用上面创建的 .new 版本替换现有的 dovecot-uidlist 文件。
删除所有 .index* 和 .log 文件。
编辑新的 dovecot-uidlist 文件,并确保第 1 行的 Nxxxx 值设置为列表中最后一条消息的 UID 后的下一个数字。此数字将用于下一条到达的消息。
重新启动 Dovecot 并远程登录到新服务器端口 110。以用户身份进行身份验证,然后执行 UIDL 命令并将输出保存到 uidlist.new
对 uidlist.old 和 uidlist.new 进行差异分析。如果未发现任何差异,则表示您已成功复制用户的邮件,同时保留了每封邮件的 UID!恭喜!
遵循这些步骤将阻止 Outlook 和其他 POP 消息应用程序重新下载用户的现有邮件。我已成功对收件箱中邮件数量最多约为 7000 封的帐户执行了这些步骤!
如果您有任何疑问,请随时联系我。