AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 768580
Accepted
Ryan Griggs
Ryan Griggs
Asked: 2016-04-07 06:58:59 +0800 CST2016-04-07 06:58:59 +0800 CST 2016-04-07 06:58:59 +0800 CST

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

  • 772

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

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

使用 imapsync 可以轻松迁移电子邮件本身。但是,不会保留 POP UIDL 值。这会导致任何使用 POP 客户端(MS Outlook 等)的用户将收件箱中的所有邮件作为副本重新下载到他们的邮箱中。

如何保留 UID?

我尝试过 dovecot dsync,但文档很差,而且我不断收到没有意义的错误消息。

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

提前感谢您的任何建议!

sendmail
  • 1 1 个回答
  • 606 Views

1 个回答

  • Voted
  1. Best Answer
    Ryan Griggs
    2016-05-05T09:08:30+08:002016-05-05T09:08:30+08:00

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

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

    2. 在旧服务器上复制用户当前的哈希密码。将此字符串保存在某处。

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

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

    5. Telnet 到 OLD 服务器上的端口 110,以用户身份登录,然后使用 UIDL 命令转储 UID 列表。将此列表保存到 NEW 服务器上用户帐户的 Maildir 中的文件中。称它为 uidlist.old

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

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

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

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

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

    10. 删除用户 Maildir 中的所有 dovecot.index* 文件。

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

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

    13. 导入后,再次 telnet 到新服务器的 110 端口并以用户身份登录。发出 UIDL 命令。这迫使 Dovecot 重建消息列表。

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

    15. 验证新服务器上的 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 文件中删除此行。

    1. 使用以下 PHP 脚本(需要 PHP)将 dovecot-uidlist 文件中每条消息的消息 ID 替换为 uidlist.old 中的正确 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

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

    1. 再次停止 Dovecot 并将现有的 dovecot-uidlist 文件替换为上面创建的 .new 版本。

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

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

    4. 重新启动 Dovecot 并远程登录到新的服务器端口 110。以用户身份进行身份验证,然后执行 UIDL 命令并将输出保存到 uidlist.new

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

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

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

    • 1

相关问题

  • 如何使用远程 SMTP 配置 php.ini?

  • Linux sendmail 垃圾邮件?

  • 使 php mail() 函数在 ubuntu-server 上工作的步骤是什么?

  • 如何配置 sendmail 以拒绝日期标题与实时相差太远的电子邮件?

  • 什么是好的 sendmail 日志分析器?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve