Миграция IMAP-ящиков с помощью imapsync
Взято: http://dmitriy-trt.blogspot.com/2010/11/dovecot-fetchmail-deliver-no-mda.html
Ваши пользователи наверняка захотят, чтобы все их пометки, папки и другие данные с IMAP-ящиков внешнего сервера полностью перенеслись на локальный сервер.
Чтобы не светить пароли в списке процессов, создаем для каждого пользователя по 2 файла, содержащие пароли от внешнего и локального ящиков. Сначала подготовим папку для них:
# mkdir /home/vmail/.pass
# cd /home/vmail/.pass
Эти процедуры нужно повторить для каждого перемещаемого пользователя:
# touch joe.remote joe.local
# chown root joe.remote joe.local
# chmod 0600 joe.remote joe.local
И затем вписать в созданные файлы соответствующие пароли с помощью вашего любимого текстового редактора.
Далее начинается самое веселье. Нужно методом поиска в интернете, чтения невнятного мануала к imapsync и других магических манипуляций подобрать опции для каждого из IMAP-серверов. Опишу опции, которые пришлось использовать мне. Большинство опций имеют на конце цифру 1 - сервер, с которого будут переноситься письма, или 2 - сервер, на который они будут переноситься. Итак, опции (те, что имеют вариант для каждого из серверов приведены с 1 на конце):
- --host1 imap.external.com
имя сервера
- --port1 993
порт для подключения
- --user1 "joe"
имя пользователя для аутентификации
- --passfile1 /home/vmail/.pass/joe.remote
путь к файлу с паролем
- --ssl1
использовать ли шифроввание при подключении к серверу
- --noauthmd5
общая опция (одна и работает сразу для обоих серверов), отключает использование аутентификации по MD5; нужна, если программа при запуске выдаст ошибку о невозможности использования такого метода аутентификации
- --sep1 "."
--prefix1 ""
префикс и разделитель в именах папок, они нужны если imapsync не может определить их автоматически и явно просит указать одну из них, или возникают проблемы с недопустимыми именами при создании папок в процессе синхронизации; как их определять - расскажу ниже
- --delete
--expunge1
после первой удачной синхронизации нужно добавить эти опции и запустить imapsync еще раз для удаления писем с внешнего сервера; имейте ввиду, что --expunge2 указывать не нужно
Итак, в самом простом случае для каждого аккаунта нужно запустить imapsync 2 раза. Второй раз - только убедившись, что всё перенеслось как следует, для очистки ящика на внешнем сервере. Переносим почту:
# imapsync --ssl1 --ssl2 --noauthmd5 --host1 imap.external.com --port1 993 --host2 imap.localserv.net --port2 993 --user1 "joe" --passfile1 /home/vmail/.pass/joe.remote --user2 joe --passfile2 /home/vmail/.pass/joe.local
Второй раз запускаем уже с опциями удаления:
# imapsync --ssl1 --ssl2 --noauthmd5 --host1 imap.external.com --port1 993 --host2 imap.localserv.net --port2 993 --user1 "joe" --passfile1 /home/vmail/.pass/joe.remote --user2 joe --passfile2 /home/vmail/.pass/joe.local --delete --expunge1
Теперь самое веселое, если imapsync не может определить префиксы и разделители пути на серверах, нужно соединиться с сервером (мы будем использоовать защищенное соединение), вручную залогиниться и запросить перечисление папок. Тогда мы увидим как он представляет папки и сможем это объяснить imapsync.
Соединяемся с сервером:
$ openssl s_client -connect imap.external.com:993
если видим в конце ответа
* OK IMAP4 ready
значит всё в порядке, можно разговаривать с сервером. Проходим аутентификацию:
1 login joe joe-password
видим
1 OK LOGIN Ok.
далее набираем по очереди 2 команды и анализируем их результат:
2 list "*" ""3 list "" "*"
результат будет иметь вид, похожий на следующее:
* LIST (\HasNoChildren) "." "INBOX.Archive"
* LIST (\HasNoChildren) "." "INBOX.Sent"
* LIST (\HasNoChildren) "." "INBOX.Draft"
Это означает, что префикса у пути нет, а разделитель папок - точка. В результате параметры будут
--prefix1 "" --sep1 "."
То же самое нужно повторить и для локального сервера.