User Tools

Site Tools


imapsync

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

imapsync – простая, но в то же время мощная утилита для миграции почтовых ящиков по протоколу IMAP.

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

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

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

main

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

contrib

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

apt update

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

apt install -y            \
  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

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

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

wget -N https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync
chmod +x imapsync

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

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

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

./imapsync \
 --host1 imap.yandex.ru \
 --user1 user@mydomain.ru \
 --password1 "P@$$w0rd" \
 --host2 mx-21.nevvad.com \
 --user2 user@nevvad.com \
 --password2 "P@$$w0rd"

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

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

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

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

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

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

--exclude 'Spam|Trash'

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

--f1f2 Outbox=Sent

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

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

--maxage 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;

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

imapsync.txt · Last modified: 2023/04/06 10:28 (external edit)