Перенос почтовых ящиков между серверами при помощи imapsync

Переход на новую почтовую систему немыслим без переноса уже существующей почты, так как у многих пользователей там скопилось немало ценной информации, зачастую заботливо разложенной по достаточно сложной структуре директорий. Все это требуется не только сохранить, но перенести с наименьшими неудобствами. А если ящиков много, то безусловно хочется автоматизировать эту процедуру. Справиться с этой задачей нам поможет imapsync - простая, но в тоже время мощная утилита для миграции почтовых ящиков по протоколу IMAP.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Основное преимущество imapsync - это то, что ее не нужно устанавливать на почтовый сервер и, скажем больше, мы не советуем этого делать. Почему? Утилита написана на Perl и для работы требует достаточно много библиотек и зависимостей, засорять которыми сервер очень не хотелось бы, тем более что задача, по сути, одноразовая.

Поэтому лучше всего использовать отдельный ПК на Linux, виртуалку или контейнер. Из DEB-систем поддерживаются Debian и Ubuntu, хотя утилита будет работать в любой системе, если вы, конечно, обеспечите ей все необходимые библиотеки. В нашем случае будет использоваться рабочий ПК на Debian.

Прежде всего откроем /etc/apt/sources.list и убедимся, что у репозиториев подключен раздел contrib, если это не так, то в каждую строку после

1main

необходимо добавить

1contrib

Более подробно об этом вы можете прочитать в нашей статье:

После чего не забываем обновить список пакетов:

1apt update

После чего обращаемся на сайт разработчика за инструкциями по установке. Для Debian они выглядят следующим образом:

 1apt install \
 2 libauthen-ntlm-perl \
 3 libcgi-pm-perl \
 4 libcrypt-openssl-rsa-perl \
 5 libdata-uniqid-perl \
 6 libencode-imaputf7-perl \
 7 libfile-copy-recursive-perl \
 8 libfile-tail-perl \
 9 libio-socket-inet6-perl \
10 libio-socket-ssl-perl \
11 libio-tee-perl \
12 libhtml-parser-perl \
13 libjson-webtoken-perl \
14 libmail-imapclient-perl \
15 libparse-recdescent-perl \
16 libproc-processtable-perl \
17 libmodule-scandeps-perl \
18 libreadonly-perl \
19 libregexp-common-perl \
20 libsys-meminfo-perl \
21 libterm-readkey-perl \
22 libtest-mockobject-perl \
23 libtest-pod-perl \
24 libunicode-string-perl \
25 liburi-perl \
26 libwww-perl \
27 libtest-nowarnings-perl \
28 libtest-deep-perl \
29 libtest-warn-perl \
30 make \
31 time \
32 cpanminus

Впечатляет? Самое лучшее что можно сделать - это скопировать данное заклинание в терминал и нажать Enter. Потом еще раз посмотреть на предлагаемый набор пакетов и убедиться в правильности своего решения о том, что тащить все это "добро" на почтовый сервер не нужно.

После того, как мы скачали все необходимые зависимости перейдем в домашнюю директорию и скачаем саму утилиту:

1cd
2wget -N https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync

И сразу сделаем ее исполняемой:

1chmod +x imapsync

Официальная инструкция также советует скопировать файл в**/usr/bin**, однако мы не видим в этом особого смысла.

Использование утилиты достаточно просто. Но, прежде всего, стоит ознакомиться с терминологией: сервер-источник именуется как host1, сервер-приемник - host2 и все опции с индексом 1 относятся к источнику, а с индексом 2 - к приемнику, например, user1 или password2.

В простейшем случае перенос ящика будет выглядеть так:

1./imapsync \
2 --host1 imap.yandex.ru \
3 --user1 user@mydomain.ru \
4 --password1 "Pa$$word1" \
5 --host2 mk-61.it-31,ru \
6 --user2 user@it-31.ru \
7 --password2 "Pa$$word1"

Мы применили перенос каждой опции на новую строку исключительно для удобочитаемости команды, в реальности можете смело писать все в одну строку. Сами опции в особых комментариях не нуждаются, сначала мы указываем хост-источник и параметры доступа к почтовому ящику на нем, затем хост-приемник и параметры учетной записи, в которую мы переносим почту.

Если все сделано правильно, то очень скоро мы увидим в терминале лог переноса писем.

Скорость синхронизации зависит от многих факторов, но основное значение будет играть количество сообщений, а не их размер. Средняя скорость переноса с Яндекса на тестовый сервер у нас получилась около 2,5 сообщений в секунду.

При этом imapsync - умная утилита, она заботливо переносит не только структуру, но и статус писем. Если какие-то письма были помечены как непрочитанные в старом ящике, то они также станут непрочитанными в новом. Также вы можете запускать синхронизацию несколько раз, скачиваться будут только новые или измененные письма.

Теперь давайте посмотрим на результат. Было:

Стало:

В целом - очень неплохо, с учетом того, что мы просто перенесли ящик 1:1.

После первого переноса в директории откуда мы запускали утилиту появится папка LOG_imapsync, в которой содержатся логи переноса. Советуем внимательно их изучить. На основе полученной информации вы можете изменить сопоставление папок в источнике и приемнике или исключить некоторые из них из синхронизации.

Для исключения следует использовать опцию --exclude, которая поддерживает регулярные выражения. Скажем, уберем из синхронизации папку Спам и Корзину:

1--exclude 'Spam|Trash'

Если вам нужно явно указать соответствие папок, то добавьте опцию:

1--f1f2   Outbox=Sent

В данном случае мы указываем, что содержимое папки Outbox ящика-источника следует поместить в папку Sent ящика-приемника.

Еще одной полезной опцией является указание возраста писем, допустим мы хотим перенести корреспонденцию только за текущий год, не проблема, указываем:

1--maxage 365

В итоге будут синхронизированы только письма не старше 365 дней.

А что делать с остальными? А можно перенести их в другой, архивный ящик, в этом нам поможет другая опция:

1--minage 365

Теперь мы перенесем только письма с возрастом старше одного года.

Также эти опции можно комбинировать, они сочетаются по принципу И:

1--maxage 730 --minage 365

Такая конструкция перенесет письма только за прошлый год (не старше двух лет и не моложе года).

А если указать наоборот?

1--maxage 365 --minage 730

То мы перенесем все письма за текущий год, и те, которые старше двух лет (не старше 1 года и не моложе 2 лет).

Подобных опций достаточно много и все они перечислены в документации, поэтому советуем подробно с ней ознакомиться. Там же имеются готовые советы и рецепты для многих публичных служб и почтовых серверов.

С синтаксисом немного разобрались, но как быть, если ящиков много? Конечно же автоматизировать, для этого в официальной документации приведен пример скрипта:

1#!/bin/sh
2{ while IFS=';' read h1 u1 p1 h2 u2 p2 fake
3  do
4   imapsync --host1 "$h1" --user1 "$u1" --password1 "$p1" \
5   --host2 "$h2" --user2 "$u2" --password2 "$p2" "$@"
6  done
7} < file.txt

Данный скрипт не блещет изысканными решениями и прост как табуретка. На его вход подается файл file.txt, который следует создать в одной директории со скриптом и из которого берутся адреса и учетные данные для узлов источника и приемника. Сам файл file.txt должен содержать строки:

1host1;user1_1;password11_1;host2;user2_1;password2_1;
2host1;user1_2;password11_2;host2;user2_2;password2_2;
3host1;user1_3;password11_3;host2;user2_3;password2_3;
4host1;user1_4;password11_4;host2;user2_4;password2_4;

Дополнительные опции вы можете указать после "$@" или передать интерактивно при запуске скрипта, тогда они войдут в переменную $@.

Это достаточно примитивный, но при этом полностью рабочий скрипт. С более продвинутыми вариантами скриптов вы можете ознакомиться в Wiki Zimbra. Ну и помните, что в Linux нет догм и единых способов решения задачи, вы всегда можете выбрать тот, который наиболее подходим именно вам.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал