Мигрируйте Dovecot 0,99 в Dovecot 2.x и сохраняйте идентификаторы POP

У меня есть старый сервер под управлением Sendmail и Dovecot 0.99. На этом сервере имеется около 50 учетных записей электронной почты, связанных с различными доменными именами, размещенными на нем. Данные электронной почты хранятся в формате MBOX на старом сервере.

Мне нужно перенести эти учетные записи электронной почты на конечный сервер под управлением Postfix и Dovecot 2.x. Сервер назначения использует формат Maildir.

Миграция электронной почты сама по себе легко с помощью imapsync. ОДНАКО, значения POP UIDL не сохраняются. Это приводит к тому, что все пользователи с клиентами POP (MS Outlook и т. Д.) Повторно загружают все сообщения в папке входящих сообщений как дубликаты в свой почтовый ящик.

Как я могу сохранить UID?

Я пробовал dovecot dsync, но документация плохая, и я продолжаю получать сообщения об ошибках, которые не имеют смысла.

ПРИМЕЧАНИЕ. Мы не можем требовать от пользователей переключения с POP на IMAP или изменения каких-либо настроек в их клиентском программном обеспечении. Миграция должна быть прозрачной для пользователей.

Заранее благодарю за любой совет!

1 ответ

Решение

ОК, я понял, как это сделать. Вот ответ для тех, кто может найти это полезным. Это обзор высокого уровня. Дайте мне знать, если у вас есть вопросы о деталях какого-либо конкретного шага.

  1. Создайте почтовый ящик пользователя на новом сервере. Установите пароль на известное значение. Убедитесь, что имя пользователя совпадает со старым именем пользователя.

  2. Скопируйте текущий хешированный пароль пользователя на старом сервере. Сохраните эту строку где-нибудь.

  3. Установите пароль пользователя на известное значение на старом сервере.

  4. Заставьте dovecot создать соответствующие файлы почтовых ящиков на новом сервере: telnet на новый сервер, порт 110 и войдите в систему с именем пользователя и паролем, затем введите команду UIDL. Это должно перечислить ноль сообщений.

  5. Подключитесь к порту 110 на OLD-сервере, войдите в систему как пользователь и выведите список UID с помощью команды UIDL. Сохраните этот список в файл в Maildir учетной записи пользователя на НОВОМ сервере. Назовите это uidlist.old

  6. Запишите значение UIDVALIDITY на старом сервере, которое для Dovecot 0.9x будет первой частью UID при вводе команды UIDL: Пример вывода строки из команды 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. Удалите все файлы dovecot.index* в Maildir пользователя.

  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 - значение недействительности, а y - идентификатор сообщения. z - имя файла сообщения.

Если файл НЕ в этом формате, снова подключитесь по телнету к новому порту 110 сервера и подтвердите как пользователь, затем снова введите команды LIST и UIDL. Это должно заставить Dovecot переписать файл в этом формате.

Убедитесь, что количество сообщений совпадает с количеством сообщений от старой учетной записи. Иногда может быть одно дополнительное дублированное сообщение. Вероятно, это вверху, и если это так, вы должны увидеть, что имена файлов идентичны. Просто удалите эту строку из файла dovecot-uidlist, если она дублируется.

  1. Используйте следующий сценарий PHP (требуется PHP), чтобы заменить идентификатор сообщения каждого сообщения в файле dovecot-uidlist на правильные идентификаторы из uidlist.old. Сохраните скрипт как uidimport.php в пользовательском каталоге Maildir.

    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 и убедитесь, что для значения Nxxxx в строке 1 установлено значение NEXT после UID сообщения LAST в списке. Этот номер будет использоваться для следующего приходящего сообщения.

  4. Перезапустите Dovecot и telnet на новый порт сервера 110. Авторизуйтесь как пользователь, затем выполните команду UIDL и сохраните вывод в uidlist.new

  5. Сделайте различие uidlist.old и uidlist.new. Если никаких различий не обнаружено, вы успешно продублировали почту пользователя, сохранив UID каждого сообщения! Congrats!

Выполнение этих действий предотвратит повторную загрузку существующих сообщений пользователя Outlook и другими приложениями обмена сообщениями POP. Я успешно выполнил эти шаги на учетных записях с около 7000 сообщений в папке "Входящие" с успехом!

Не стесняйтесь обращаться ко мне, если у вас есть какие-либо вопросы.

Другие вопросы по тегам