Sendmail

將 Dovecot 0.99 遷移到 Dovecot 2.x 並保留 POP UID

  • May 4, 2016

我有一台執行 Sendmail 和 Dovecot 0.99 的舊伺服器。該伺服器上大約有 50 個電子郵件帳戶,與託管在其上的各種域名相關聯。電子郵件數據以 MBOX 格式儲存在舊伺服器上。

我需要將這些電子郵件帳戶遷移到執行 Postfix 和 Dovecot 2.x 的目標伺服器。目標伺服器使用 Maildir 格式。

使用 imapsync 可以輕鬆遷移電子郵件本身。但是,不會保留 POP UIDL 值。這會導致任何使用 POP 客戶端(MS Outlook 等)的使用者將收件箱中的所有郵件作為副本重新下載到他們的郵箱中。

如何保留 UID?

我嘗試過 dovecot dsync,但文件很差,而且我不斷收到沒有意義的錯誤消息。

注意:我們不能要求使用者從 POP 切換到 IMAP,或更改其客戶端軟體中的任何設置。遷移必須對使用者透明

提前感謝您的任何建議!

好的,我想出瞭如何做到這一點。這是答案,對於任何可能覺得它有幫助的人。這是一個高級概述。如果您對任何特定步驟的詳細資訊有疑問,請告訴我。

  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 (試圖在這裡發布,但它搞砸了) 17. 確保現在 uidlist.old 或 uidlist.new 中有空行或虛假值。確保底部沒有尾隨空行! 18. 執行 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 條消息的帳戶執行了這些步驟,並且成功!

如果您有任何問題,請隨時與我聯繫。

引用自:https://serverfault.com/questions/768580