November 22, 2024

Перенос почты с одного сервера на другой при помощи 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мин в зависимости от размера ящика). Принципиальной разницы я не заметил.

Работать с ней очень просто:

1) Распаковываем архив

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

4) Сделаем копию с Git

git clone https://github.com/imapsync/imapsync.git

5) Собираем пакет

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

2) Распакуем скачанный архива

tar -xvf imapsync-1.678.tar.gz

3) Перейдем в папку

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 но я их не рассматривал т.к. в них невозможно ограничить глубину скачивания в "днях" а только в количествах сообщений из-за чего они мне не подошли.