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

Модератор: padonki

Ответить
Аватара пользователя
Padonak
padonki
Сообщения: 3803
Зарегистрирован: 14 авг 2006, 20:43
Контактная информация:

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

Сообщение Padonak »

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

Установка для Debian они выглядят следующим образом:

Код: Выделить всё

apt install \
 libauthen-ntlm-perl \
 libcgi-pm-perl \
 libcrypt-openssl-rsa-perl \
 libdata-uniqid-perl \
 libencode-imaputf7-perl \
 libfile-copy-recursive-perl \
 libfile-tail-perl \
 libio-socket-inet6-perl \
 libio-socket-ssl-perl \
 libio-tee-perl \
 libhtml-parser-perl \
 libjson-webtoken-perl \
 libmail-imapclient-perl \
 libparse-recdescent-perl \
 libproc-processtable-perl \
 libmodule-scandeps-perl \
 libreadonly-perl \
 libregexp-common-perl \
 libsys-meminfo-perl \
 libterm-readkey-perl \
 libtest-mockobject-perl \
 libtest-pod-perl \
 libunicode-string-perl \
 liburi-perl \
 libwww-perl \
 libtest-nowarnings-perl \
 libtest-deep-perl \
 libtest-warn-perl \
 make \
 time \
 cpanminus
как скачали все необходимые зависимости перейдем в директорию и скачаем саму утилиту:

Код: Выделить всё

cd /usr/local/bin
wget -N https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync
И сразу сделаем ее исполняемой:

Код: Выделить всё

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

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

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

Код: Выделить всё

./imapsync  --host1 imap.yandex.ru  --user1 user@mydomain.ru  --password1 "Password1"  --host2 imap.mail.ru  --user2 user2@mail.ru  --password2 "Pa$Sword2"

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

Код: Выделить всё

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

Код: Выделить всё

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

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

Код: Выделить всё

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

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

Код: Выделить всё

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

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

Код: Выделить всё

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

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

Код: Выделить всё

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

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

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

Код: Выделить всё

#!/bin/sh
{ while IFS=';' read h1 u1 p1 h2 u2 p2 fake
  do 
   imapsync --host1 "$h1" --user1 "$u1" --password1 "$p1" \
   --host2 "$h2" --user2 "$u2" --password2 "$p2" "$@" 
  done 
} < file.txt
Данный скрипт не блещет изысканными решениями и прост как табуретка. На его вход подается файл file.txt, который следует создать в одной директории со скриптом и из которого берутся адреса и учетные данные для узлов источника и приемника. Сам файл file.txt должен содержать строки:

Код: Выделить всё

host1;user1_1;password11_1;host2;user2_1;password2_1;
host1;user1_2;password11_2;host2;user2_2;password2_2;
host1;user1_3;password11_3;host2;user2_3;password2_3;
host1;user1_4;password11_4;host2;user2_4;password2_4;
Дополнительные опции вы можете указать после "$@" или передать интерактивно при запуске скрипта, тогда они войдут в переменную $@.
Моя характеристика с детского сада: Хорошо кушает, спит, гуляет! Прошло много лет, ничего не изменилось.
Изображение
Ответить