Перенос почты между сервисами с помощью IMAP Sync

Иногда у администраторов возникает необходимость перенести почтовый сервер: либо на другое железо, либо даже в какой-нибудь облачный сервис. Задача обычно выглядит простой: на новом месте заводятся аккаунты для всех пользователей, затем копируется почта и наконец правятся MX-записи.

Однако в реальности с переносом почты могут возникнуть трудности: например при переносе в облачный сервис нет прямого доступа к диску, и может не быть удобных средств миграции. В этом случае может выручить утилита imapsync, о которой и пойдёт речь далее.

Допустим что миграция осуществляется с частного почтового сервера в Google Suite и мы уже подошли к тому шагу, когда созданы новые учётные записи в Google Suite. Склонируем репозиторий с исходным кодом mailsync на какую-нибудь машину под управлением Ubuntu 18.04:

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

Переходим в директорию с исходным кодом:

cd imapsync

Устанавливаем необходимые библиотеки (подробности в файле «INSTALL.d/INSTALL.Ubuntu.txt»):

sudo apt install \
libauthen-ntlm-perl \
libclass-load-perl \
libcrypt-ssleay-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 \
libregexp-common-perl \
libssl-dev \
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 \
liburi-perl \
libtest-nowarnings-perl \
libtest-deep-perl \
libtest-warn-perl

После этого создадим файл «mails.csv», в котором каждая строка будет иметь вид:

old_login|old_pass|new_login|new_pass|

Здесь «old_login» и «old_pass» — логин и пароль пользователя на старом сервере, а «new_login» и «new_pass» — логин и пароль пользователя на новом сервере.

Если вы мигрируете в Google Suite то вам надо будет зайти в настройки безопасности -> «Основные настройки» -> «Приложения, не обладающие надежной защитой» и на время миграции разрешить приложения, не обладающие надёжной защитой. Без этой настройки может не получится подключиться к IMAP.
После этого остаётся написать небольшой скрипт, который последовательно выполнит imapsync для каждого из наших пользователей. Примерный листинг скрипта:

#!/bin/bash

cd `dirname $0`

for line in `cat mails.csv | grep -v ^#`; do
M_USER=`echo ${line} | cut -d '|' -f1`
M_PASS=`echo ${line} | cut -d '|' -f2`
N_USER=`echo ${line} | cut -d '|' -f3`
N_PASS=`echo ${line} | cut -d '|' -f4`
echo "Processing ${M_USER}..."
./imapsync \
--host1 mail.company.com --user1 ${M_USER} --password1 ${M_PASS} \
--host2 imap.gmail.com:993 --user2 ${N_USER} --password2 ${N_PASS} --ssl2
if [ $? -ne "0" ]; then
echo ${M_USER} >> mail_errors
fi
done

После выполнения скрипта в файл «mail_errors» будут записаны логины пользователей, для которых перенос почты не удался. Обычно это связано либо с большим объёмом почты (превышение квоты), либо с наличием спецсимволов в паролях. Поэтому лучше заранее проверить размеры ящиков и хотя бы на время миграции установить на ящики пароли, не содержащие символов, которые при подстановке в команды оболочки могут быть интерпретированы не правильно (например знак доллара или обратный слэш).

В последних ревизиях mailsync появилась поддержка аккаунтов GMail и MS Exchange. Однако в силу ряда причин у автора этих строк не было возможности протестировать этот функционал.

На этом всё. Приятной работы!