У меня старый сервер с запущенными Sendmail и Dovecot 0.99. На этом сервере около 50 учетных записей электронной почты, связанных с различными доменными именами, размещенными на нем. Данные электронной почты хранятся в формате MBOX на старом сервере.
Мне нужно перенести эти учетные записи электронной почты на целевой сервер с Postfix и Dovecot 2.x. Целевой сервер использует формат Maildir.
С помощью imapsync легко переносить электронные письма. ОДНАКО значения POP UIDL не сохраняются. Это заставляет всех пользователей с POP-клиентами (MS Outlook и т. Д.) Повторно загружать все сообщения в почтовом ящике как дубликаты в свой почтовый ящик.
Как я могу сохранить UID?
Я пробовал dovecot dsync, но документация оставляет желать лучшего, и я продолжаю получать сообщения об ошибках, которые не имеют смысла.
ПРИМЕЧАНИЕ. Мы не можем требовать от пользователей перехода с POP на IMAP или изменения каких-либо настроек в их клиентском программном обеспечении. Миграция должна быть прозрачный пользователям.
Заранее благодарим за любой совет!
ОК, я понял, как это сделать. Вот ответ для всех, кто может найти это полезным. Это общий обзор. Дайте мне знать, если у вас возникнут вопросы о деталях какого-либо конкретного шага.
Создайте почтовый ящик пользователя на новом сервере. Установите пароль на известное значение. Убедитесь, что имя пользователя совпадает со старым именем пользователя.
Скопируйте текущий хешированный пароль пользователя на старый сервер. Сохраните где-нибудь эту строку.
Установите пароль пользователя на известное значение на старом сервере.
Заставьте dovecot создать соответствующие файлы почтовых ящиков на новом сервере: telnet на новый сервер, порт 110 и войдите в систему с именем пользователя и паролем, затем введите команду UIDL. Это должно перечислить ноль сообщений.
Подключитесь по Telnet к порту 110 на СТАРОМ сервере, войдите в систему как пользователь и выгрузите список UID с помощью команды UIDL. Сохраните этот список в файл в Maildir учетной записи пользователя на НОВОМ сервере. Назовите это uidlist.old
Запишите значение UIDVALIDITY на старом сервере, которое для Dovecot 0.9x будет первой частью UID при вводе команды UIDL: Пример строкового вывода команды 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.
Удалите все файлы dovecot.index * в Maildir пользователя.
Перезапустите Dovecot на новом сервере.
Импортируйте электронные письма пользователя с помощью imapsync. Включите параметр --useuid.
После импорта снова подключитесь к новому серверу через порт 110 и войдите в систему как пользователь. Выполните команду UIDL. Это заставляет Dovecot перестроить список сообщений.
Снова остановите dovecot на новом сервере.
Убедитесь, что файл dovecot-uidlist на новом сервере имеет следующий формат: 3 Vx Ny Gz 1 Px.y: z ...
Первая строка содержит Vx (uidvalidity), Ny (UID следующего сообщения) и Gz (глобальный идентификатор). Последующие строки содержат отдельные сообщения. 1 - номер сообщения, Px - значение uidvalidity, y - идентификатор сообщения. z - имя файла сообщения.
Если файл НЕ в этом формате, снова подключитесь по telnet к новому порту 110 сервера и подтвердите права пользователя, а затем снова выполните команды LIST и UIDL. Это должно заставить Dovecot переписать файл в этом формате.
Убедитесь, что количество сообщений совпадает с количеством сообщений из старой учетной записи. Иногда может быть одно лишнее дублированное сообщение. Вероятно, он вверху, и если да, вы должны увидеть, что имена файлов идентичны. Просто удалите эту строку из файла dovecot-uidlist, если она дублируется.
Используйте следующий сценарий PHP (требуется PHP), чтобы заменить идентификатор сообщения каждого сообщения в файле dovecot-uidlist на правильные идентификаторы из uidlist.old. Сохраните сценарий как uidimport.php в каталоге Maildir пользователя.
http://pastebin.com/x2vvVD9w (пытался опубликовать здесь, но все испортилось)
Убедитесь, что в uidlist.old или uidlist.new есть пустые строки или ложные значения. УБЕДИТЕСЬ, что внизу нет завершающей пустой строки!
Запустите uidimport следующим образом:
php uidimport.php uidlist.old dovecot-uidlist> dovecot-uidlist.new
Это создает файл dovecot-uidlist.new с правильным UID, помещенным в каждую строку.
Снова остановите Dovecot и замените существующий файл dovecot-uidlist на созданную выше новую версию.
Удалите все файлы .index * и .log.
Отредактируйте новый файл dovecot-uidlist и убедитесь, что значение Nxxxx в строке 1 установлено на СЛЕДУЮЩИЙ номер после UID ПОСЛЕДНЕГО сообщения в списке. Этот номер будет использован для следующего приходящего сообщения.
Перезапустите Dovecot и telnet на новый порт сервера 110. Авторизуйтесь как пользователь, затем выполните команду UIDL и сохраните вывод в uidlist.new
Сделайте разницу между uidlist.old и uidlist.new. Если НЕТ различий, значит вы успешно скопировали почту пользователя, сохранив UID каждого сообщения! Поздравляю!
Выполнение этих шагов предотвратит повторную загрузку существующих сообщений пользователя Outlook и другими приложениями для обмена сообщениями POP. Я успешно выполнил эти шаги для учетных записей, содержащих до 7000 сообщений в почтовом ящике!
Не стесняйтесь обращаться ко мне, если у вас возникнут вопросы.