将Dovecot 0.99迁移到Dovecot 2.x并保留POP UID

我有一台运行Sendmail和Dovecot 0.99的旧服务器。 该服务器上有大约50个电子邮件帐户,与其上托pipe的各种域名相关联。 电子邮件数据在旧服务器上以MBOX格式存储。

我需要将这些电子邮件帐户迁移到运行Postfix和Dovecot 2.x的目标服务器。 目标服务器使用Maildir格式。

使用imapsync,电子邮件本身的迁移很容易。 但是,POP UIDL值不会保留。 这将导致任何使用POP客户端(MS Outlook等)的用户将重复收件箱中的所有邮件重新下载到其邮箱中。

我如何保存UID?

我已经尝试了dovecot dsync,但是文档很差,而且我一直收到错误信息,没有任何意义。

注意:我们不能要求用户从POP切换到IMAP,或更改其客户端软件中的任何设置。 迁移必须对用户透明

提前感谢您的任何build议!

好,我想出了如何做到这一点。 这是答案,任何人可能会觉得有帮助。 这是一个高层次的概述。 如果您对任何特定步骤的详细信息有任何疑问,请告知我们。

  1. 在新服务器上创build用户的邮箱。 将密码设置为已知值。 确保用户名与旧用户名相匹配。

  2. 在旧服务器上复制用户的当前哈希密码。 保存这个string的地方。

  3. 在旧服务器上将用户密码设置为已知值。

  4. 强制dovecot在新服务器上构build相应的邮箱文件:telnet到新服​​务器,端口110,并使用用户名和密码login,然后发出UIDL命令。 这应该列出零消息。

  5. Telnet到旧服务器上的端口110,以用户身份login,并使用UIDL命令转储UID列表。 将此列表保存到NEW服务器上用户帐户的Maildir中的文件中。 叫它uidlist.old

  6. 记下旧服务器上的UIDVALIDITY值,对于Dovecot 0.9x,在发出UIDL命令时,它将成为UID的第一部分:UIDL命令的示例行输出:

    1 1234567890.12345 1 =消息号码1234567890 = UIDVALIDITY 12345 =消息UID

  7. 修改新服务器的dovecotconfiguration,以使用与旧服务器相同的UID格式。 编辑/etc/dovecot/conf.d/20-pop3.conf文件并将pop3_uidl_format设置为所需的格式(对于dovecot 0.9x,它应该是%v。%u)

  8. 在新服务器上停止Dovecot。

  9. 修改用户的dovecot-uidlist文件,将Vxxxxxx值更改为旧帐户的UIDVALIDITY值。 该文件可以在用户的​​主目录/ Maildir中find

  10. 删除用户的Maildir中的任何dovecot.index *文件。

  11. 在新服务器上重新启动Dovecot。

  12. 使用imapsync导入用户的电子邮件。 包括–useuid选项。

  13. 一旦导入,再次远程login到新的服务器,端口110并以用户身份login。 发出UIDL命令。 这迫使Dovecot重build消息列表。

  14. 在新的服务器上再次停止dovecot。

  15. validation新服务器上的dovecot-uidlist文件的格式如下:3 Vx Ny Gz 1 Px.y:z …

第一行包含Vx(uidvalidity),Ny(下一个消息UID)和Gz(全局标识符)。后续行包含单独的消息。 1是消息号Px是uidvalidity值,y是消息ID。 z是消息文件名。

如果该文件不是这种格式,再次telnet到新的服务器端口110并validation为用户,然后再次发出LIST和UIDL命令。 这应该强制Dovecot以这种格式重写文件。

确保消息数量与旧帐户的消息数量相匹配。 有时可能会有一个额外的重复消息。 它可能在顶部,如果是这样,你应该看到文件名是相同的。 只要从dovecot-uidlist文件中删除这一行,如果它是重复的。

  1. 使用以下PHP脚本(需要PHP)用uidlist.old中的正确IDreplacedovecot-uidlist文件中每个消息的消息ID。 将脚本保存为用户的Maildir目录中的uidimport.php。

    http://pastebin.com/x2vvVD9w (试图张贴在这里,但它搞砸了)

  2. 确保uidlist.old或uidlist.new中现在有空行或虚假值。 确保底部没有尾随空行!

  3. 运行uidimport如下:

    php uidimport.php uidlist.old dovecot-uidlist> dovecot-uidlist.new

这将创build一个dovecot-uidlist.new文件,并在每行中放置正确的UID。

  1. 再次停止Dovecot并用上面创build的.new版本replace现有的dovecot-uidlist文件。

  2. 删除任何.index *和.log文件。

  3. 编辑新的dovecot-uidlist文件,并确保第1行的Nxxxx值设置为列表中最后一个消息的UID后面的NEXT号。 这个号码将被用于下一个到达的消息。

  4. 重新启动Dovecot和telnet到新的服务器端口110.以用户身份validation,然后执行UIDL命令并将输出保存到uidlist.new

  5. 做一个uidlist.old和uidlist.new的差异。 如果没有发现任何差异,您已经成功地复制了用户的邮件,同时保留每个邮件的UID! 恭喜!

遵循这些步骤将阻止Outlook和其他POP消息传递应用程序重新下载用户的现有消息。 我已经成功地在收件箱中成功地执行了这些步骤,最多可以收到约7000条消息,成功了!

如果您有任何问题,请随时与我联系。