Перенос почты с одного сервера на другой при помощи imapsync
Вроде бы тривиальная задача, но оказывается что средств для её решения толком нет.
Основные варианты которые предлагаются это загрузка ящика в MS Outlook или Thunderbird или любой другой аналог, а из него уже в новый ящик.
Да вариант не плохой, но как быть если ящик очень большой 100+ Гб MS Outlook качает письма очень шустро, но у него ограничение в размере PST файла в 50Гб (да есть варианты его обхода, но хрен знает как он с этим файлом потом будет работать было на моей памяти что он с файлом в 10+гб то зависает да и файл профиля переносить такой геморрой что проще не трогать, а через symlink перенести в другое место). Thunderbird же очень медленно качает письма (то что сделал Outlook за пару часов Thunderbird не осилил и за ночь).
Был найден ещё один вариант достаточно хороший. Это скрипт написанный на Perl называющийся imapsync. Ссылка на GitHub разработчика тут https://github.com/imapsync/imapsync. Я же брал уже скомпилированные образы под Windows тут https://imapsync.lamiral.info/dist2/old_releases/ использовал версию imapsync_1.678 т.к. самая последняя imapsync_2.290 как мне казалась зависала (на самом деле она тоже полностью рабочая просто нужно подождать иногда больше 15-20мин в зависимости от размера ящика). Принципиальной разницы я не заметил.
2) На примере файла imapsync_example.bat создаем свой файл конфигурации
Для этого достаточно внести следующие изменения:
.\imapsync.exe
--host1 imap.host1.ru --user1 email1@domen.com --password1 "pass" -ssl1^
--host2 imap.host2.ru --user2 email1@domen.com --password2 "pass" -ss2^
--automap
Параметры --justfolders --dry стираем т.к. первый говорит что работаем только с папками, а второй говорит что всё происходит виртуально т.е. в консоль изменения выведутся, но на сервере ни чего не изменится (для теста)
host1 сервер откуда качаем host2 куда грузим
с ящиками email1 и email2 тоже самое
параметры -ssl1 и -ssl2 говорят что используется ssl сертификат при авторизации
Самое главное не забыть разделитель "^" в конце строчки, а то будет ошибка.
Я еще добавлял параметр --maxage 365, что означает что необходимо перенести письма не старше 365 дней.
Есть ещё дополнительные параметры они все хорошо описаны в README.txt
3) Запускаем bat файл с нашей конфигурацией и терпеливо ждем, т.к. процесс это не быстрый(на Windows максимальная скорость которую я видел была 0,60 писем в сек всё зависит от размера ящика и чуть чуть от интернета)
Если вам нужно перекачать много ящиком, то необходимо настраивать конфигурацию на примере файла sync_loop_windows.bat, но это уже самостоятельно.
Большие же ящики я рекомендую все же переносить из под Linux систем т.к. это просто происходит быстрее. К примеру на арендованном в ДЦ сервере скорость была 1.70 писем в секунду. Установка на Linux достаточно простая
Рассмотрим пример установки на Ubuntu
1) Убедимся что наша система обновлена
sudo apt update && sudo apt upgrade -y
2) Установим все необходимые пакеты Perl
sudo apt-get install git rcs make makepasswd cpanminus \ gcc libssl-dev libauthen-ntlm-perl \ libclass-load-perl libcrypt-ssleay-perl liburi-perl \ libdata-uniqid-perl libdigest-hmac-perl libdist-checkconflicts-perl \ libfile-copy-recursive-perl libio-compress-perl libio-socket-inet6-perl \ libio-socket-ssl-perl libio-tee-perl libmail-imapclient-perl \ libmodule-scandeps-perl libnet-ssleay-perl libpar-packer-perl \ libreadonly-perl libsys-meminfo-perl libterm-readkey-perl \ libtest-fatal-perl libtest-mock-guard-perl libtest-pod-perl \ libtest-requires-perl libtest-simple-perl libunicode-string-perl
3) Доставим необходимые (могут потребоваться ещё какие-нибудь если что смотрим лог сборки при компиляции)
sudo cpanm Crypt::OpenSSL::RSA Crypt::OpenSSL::Random --force sudo cpanm Mail::IMAPClient JSON::WebToken Test::MockObject sudo cpanm Unicode::String Data::Uniqid
git clone https://github.com/imapsync/imapsync.git
cd imapsync mkdir -p dist sudo make install
6) Запускается всё так же как и на Windows командой
./imapsync --host1 imap.source.example.com \ --user1 user@example.com \ --password1 S0urcePassw0rd \ --ssl1 \ --host2 imap.dest.example.com \ --user2 user@example.com \ --password2 Dest1nat10NPassw0rd \ --ssl2 --automap
Ещё хотелось бы добавить что можно взять уже скомпилированную версию из архива, тогда не нужно компилировать самому и ставить кучу модулей, возможно даже не нужно устанавливать Perl, но у меня он на этот момент уже стоял так что сказать точно не могу.
В таком случае операция будет проще
1) Качаем архив нужной версии из раздела Releases Tags
wget https://github.com/imapsync/imapsync/archive/refs/tags/imapsync-1.678.tar.gz
tar -xvf imapsync-1.678.tar.gz
cd imapsync-1.678
4) Ну а дальше просто запускаем
./imapsync --host1 imap.source.example.com \ --user1 user@example.com \ --password1 S0urcePassw0rd \ --ssl1 \ --host2 imap.dest.example.com \ --user2 user@example.com \ --password2 Dest1nat10NPassw0rd \ --ssl2 --automap
Хотелось бы добавить что на Linux с более новыми версиями проблема таже в какой то момент в самом начале всё останавливается и ничего не происходит и кажется что всё зависло но нет нужно просто подождать.
Ещё один момент не забываем запускать процесс желательно под screen (что это объясняю в статье Использование Screen в Ubuntu, как защиты от срыва сессии SSH) т.к. в случае если нас выкинет из консоли процесс остановится.
P.S. Если процесс запустить повторно то просто докачаются те письма которые не скачались, а скопированные пропустятся. Так же если в конце у вас выходит предупреждение с предложением добавить параметр --delete2 не пугайтесь это всего лишь обозначает, что на севере назначения есть письма которых нет на сервере источнике, и в данном предложении программа вам говорит "Если хотите полную идентичность то добавьте параметр --delete2, тогда лишние письма с host2 будут удалены.
Ещё есть неплохие программы для Linux isync и на его основе mbsync но я их не рассматривал т.к. в них невозможно ограничить глубину скачивания в "днях" а только в количествах сообщений из-за чего они мне не подошли.