Проект

Общее

Профиль

Миграция почты

Choose a language: RU | EN | ZH

Table of contents

В этой статье мы научимся делать так, чтобы в течение срока миграции оба сервера (старый и новый) работали совместно.

Общий случай

Итак, в организации существует сервер с именем old_mail.tegu.online и IP-адресом 79.137.210.126, интегрированный с сервером каталогов dc.tegu.online.
old_mail.tegu.online прописан в DNS как Mail exchanger с приоритетом 10.

old_mail.tegu.online.        IN    A    79.137.210.126
tegu.online.        IN    MX    10    old_mail.tegu.online. 
tegu.online.        IN    TXT    "v=spf1 mx -all" 

А также PRT-запись:

126.210.137.79.in-addr.arpa. 3600 IN    PTR    old_mail.tegu.online.

Подробнее смотрите об этом в статье Настройка DNS-зоны.

Задача установить почтовый сервер Tegu, работающий с ним параллельно.
С этой целью Tegu с именем mail.tegu.online устанавливается на IP-адресе 79.137.210.127.
mail.tegu.online должен быть интегрирован с сервером каталогов dc.tegu.online,
mail.tegu.online должен быть прописан в DNS как Mail exchanger с приоритетом 20.

mail.tegu.online.        IN    A    79.137.210.127
tegu.online.        IN    MX    20    mail.tegu.online. 

А также PRT-запись:

127.210.137.79.in-addr.arpa. 3600 IN    PTR    mail.tegu.online.

Получилось, что оба сервера опубликованы в интернет и могут как отправлять, так и принимать почту для домена tegu.online. При этом приоритет old_mail.tegu.online выше и, следовательно, большая часть будет приходить на него.

Теперь необходимо создать домен для пересылки почты. С этой целью создадим MX-запись для домена virt.tegu.online (указывающую на Tegu). PTR-для этого сервера прописывать не надо, т.к. отправка с этого сервера с виртуальными адресами не предполагается.

virt.tegu.online.        IN    MX    10    mail.tegu.online.
virt.tegu.online. IN TXT "v=spf1 mx -all" 

Теперь нам надо научить сервера правильно разбирать полученную почту в зависимости от того, где в настоящий момент находится почтовый ящик пользователя. На начальном этапе ящики всех пользователей находятся на старом сервере old_mail.tegu.online.

С этой целью необходимо перевести Tegu в специальный режим работы - Режим миграции.
Для этого включить чекбокс в меню "Основные настройки / Включить режим миграции с другого сервера".

После перехода в "Режим миграции" в левом сайдбаре меню появляется опция "Мигрируемые домены".
В исходном состоянии на странице "Мигрируемые домены" вы найдете "Нет настроенных параметров миграции".
Добавляем необходимый домен из списка кнопкой "Добавить домен".
Открывается диалог "Параметры миграции", который предлагает для заполнения следующие поля:

  • Домен (выбор из списка ранее настроенных доменов);
  • Виртуальный домен: в нашем случае принимает значение virt.tegu.online;
  • Другие серверы домена (хост:порт - по одному на строку) - список серверов, которым необходимо пересылать почту пользователей, почтовые ящики которых не находятся на Tegu (т.е. не являются локальными для Tegu);
  • Адреса локальных ящиков (по одному на строку) - здесь указываются почтовые ящики, которые уже переехали на Tegu и являются для него локальными. В начале миграции этот список пуст, и Tegu пересылает всю почту на old_mail. После миграции каждого ящика необходимо добавить его адрес в это поле. Теперь Tegu считает его локальным, не будет пересылать, а будет доставлять в локальный адрес. В финале миграции, в этом поле должны быть указаны все почтовые ящики домена.

Важно! Tegu должен знать всех пользователей вне зависимости от того, перенесён ли тот или иной ящик. Это значит, что в настройках БД пользователей либо должны быть указаны параметры общей со старым почтовым сервером базы,
либо в новую базу должны быть внесены все пользователи с их адресами email.

Что делает Tegu в режиме миграции:

  1. Tegu принимает почту из интернет:
    • В случае если значение RCPT TO присутствует в поле "Адреса локальных ящиков", Tegu доставляет сообщение в локальный почтовый ящик;
    • В случае если значение RCPT TO отсутствует в поле "Адреса локальных ящиков", Tegu пересылает сообщение на любой из доступных серверов из списка "Другие серверы домена" (согласно очередности описания), заменяя отправителя (только в сессии SMTP, не в заголовках) на получателя, но с виртуальным доменом - virt.tegu.online;
  2. Tegu принимает почту с сервера, указанного в поле "Другие серверы домена" (и только с него), адресованные пользователям домена virt.tegu.online и обрабатывает их как почту для домена tegu.online:
    • В качестве примера. Почтовый ящик ivanov переехал на Tegu. Tegu получает письмо с сервера old_mail.tegu.online, где в адресной части , изменяет адрес на , находит этот адрес в списке локальных адресов и доставляет сообщение в локальное хранилище;
    • В ряде случаев невозможно указать весь список возможных старых серверов (к примеру, для облачного оператора, у которого сотни нод). В этом случае Tegu будет ориентироваться на записи SPF и принимать правильное решение.

Важно! Для преобразования домена в виртуальный и обратно никаких правил в Маршрутизации создавать не надо.

Итак, наши сервера (старый и новый) в правильной позиции.
Как осуществить миграцию для пользователя ivanov:

  • Переносим почтовый ящик ivanov с old_mail.tegu.online на mail.tegu.online;
  • Настраиваем для ivanov пользовательскую почтовую программу для работы с mail.tegu.online;
  • На Tegu прописывает адрес в поле "Адреса локальных ящиков";
  • На old_mail.tegu.online прописываем безусловное правило пересылки всей почты: переслать на .

Частный случай

Обратите внимание, что old_mail.tegu.online может быть облачным (on cloud, к примеру Office 365) сервером или локальным (on premise, допустим MS Exchange).

  • Для локального случая отличие заключается в том, что виртуальный домен достаточно создать в локальной (непубличной) зоне.
  • Для локального случая прописывание MX-записи Tegu в публичной зоне также необязательно в случае если вы настроите пересылку всей почты Tegu через smarthost, в роли которого выступает старый сервер.
  • Опции частного случая необязательны и призваны облегчить работу - правила общего случая будут работать всегда.

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

Для переноса почты с одного IMAP сервера на другой мы рекомендуем использовать утилиту IMAPSync.
Эта утилита обладает двумя достоинствами:
  1. Она чрезвычайно корректно работает (сохраняет правильную структуру каталогов, правильно обрабатывает национальные языки и пр.).
  2. Эта утилита универсально по своему определению (использует механизм IMAP). Благодаря этому ее можно использовать с любыми типами почтовых серверов будь то Postfix, MS Exchange или Lotus Domino.
  3. Сервер Tegu внесен в список серверов, совместимость которых с imapsync подтверждена.

Важно понимать, что с помощью IMAPSync можно импортировать только те сообщения, которые находятся с почтовом ящике на сервере. Другими словами, для того, чтобы импортировать локальные сообщения, хранящиеся в форматах mailbox/maildir или pst, необходимо предварительно перенести их в серверный почтовый ящик. Как правило, это делается средствами почтовой программы или с помощью специальных утилит. К примеру, в распоряжении администраторов MS Exchange серверов (начиная с версии 2010 SP1) есть специальная утилита PowerShell: New-MailboxImportReques. Очевидно, что у администратора, выполняющего операцию импорта, должны быть права на каталоги, в которых хранятся PST-файлы пользователей. Данная работа носит подготовительный организационно-технический характер, зависит от архитектуры конкретной системы, и в данной статье не рассматривается.

Установка утилиты


Если вам не удалось установить из штатного репозитория вашего дистрибутива операционной системы, то нам поможет сайт французского разработчика imapsync Жиля ЛамирАля (Gilles LAMIRAL), - https://imapsync.lamiral.info/ .
Я не просто так написал тут его email - о себе Жиль пишет так "Понимаю, что звучит безумно, но я отвечаю на все письма".

Предварительно установим необходимые пакеты.

sudo 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 \
  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://imapsync.lamiral.info/imapsync

Присваиваем исполняемые права:

chmod +x imapsync

Утилита готова к работе.
Запущенная без параметров она возвращает синопсис:

$ ./imapsync 
Name:

 imapsync - Email IMAP tool for syncing, copying, migrating and archiving
 email mailboxes between two imap servers, one way, and without duplicates.

Version:

 This documentation refers to Imapsync $Revision: 2.200 $

Usage:

  To synchronize the source imap account
    "test1" on server "test1.lamiral.info" with password "secret1" 
  to the destination imap account
    "test2" on server "test2.lamiral.info" with password "secret2" 
  do:

   imapsync \
    --host1 test1.lamiral.info --user1 test1 --password1 secret1 \
    --host2 test2.lamiral.info --user2 test2 --password2 secret2

Настройка синхронизации

Рассмотрим следующую модель переноса.

Следуя инструкции, получаем примерно следующую команду для синхронизации одного почтового ящика:

imapsync \
--host1 mail.mbk-lab.ru --user1 ikalmetov@mbk-lab.ru --password1 МойПароль1 --ssl1 \
--host2 mail.test.tegu.online --user2 ikalmetov@test.tegu.online --password2 МойПароль2 --ssl2 \
--dry

Ключ --dry говорит, что выполнять перенос сообщений не надо, надо только показать, как все это будет выглядеть (проверочный режим). Рекомендуется отладить команду с использованием этого ключа, и только затем убрать его из команды, чтобы выполнить перенос.

Обратите внимание, что для работы утилиты необходимо указать логины и пароли каждого пользователя.
На серверах Tegu для этой цели можно воспользоваться функцией мастер-пользователя - это заметно упрощает практическую работу, не требуя данных каждого пользователя.

Чаще всего аналогичные права можно задать и на других почтовых серверах, и это первое, что вы должны уточнить.
" Если нет, оставьте это чтение, возьмите носовой платок и поплачьте " - советует нам Жиль.

Для примера несколько серверов, поддерживающих мастер-пользователей:

  • Exchange 2003/2007/2010/2013/2016
  • Office365
  • Gmail
  • Dovecot
  • Zimbra
  • Kerio
  • Cyrus-imap
  • James
  • UW-imap

Перенос почты в пакетном режиме

Создаем несложный скрипт imapsync_batch:

#!/bin/bash

{ while IFS=';' read  u1 p1 u2 p2; do
       imapsync --host1 mail.mbk-lab.ru --user1 "$u1" --password1 "$p1" \
                --host2 mail.test.tegu.online --user2 "$u2" --password2 "$p2" 
done ; } < file.txt

Очевидно, что скрипт построчно читает файл с параметрами, после чего вызываем imapsync с указанными параметрами.

Создаем файл параметров users.csv :

ikalmetov@mbk-lab.ru;МойПароль1;ikalmetov@test.tegu.online;МойПароль2
user002_1;password002_1;user002_2;password002_2
user003_1;password003_1;user003_2;password003_2

Остается выполнить:

imapsync_batch < users.csv

В финале вы получите что-то похожее на это:

Host1 Total size:            2635716542 bytes (2.455 GiB)
Host2 Total size:            2561889417 bytes (2.386 GiB)

Host1 Biggest message:         34710913 bytes (33.103 MiB)
Host2 Biggest message:         34710913 bytes (33.103 MiB)

Time spent on sizing:         4.9 seconds
++++ Statistics
Transfer started on                     : Пятница 22 апреля 2022-04-22 10:55:20 +0300 MSK
Transfer ended on                       : Пятница 22 апреля 2022-04-22 13:04:25 +0300 MSK
Transfer time                           : 7744.8 sec
Folders synced                          : 11/11 synced
Messages transferred                    : 7354 
Messages skipped                        : 249
Messages found duplicate on host1       : 248
Messages found duplicate on host2       : 12
Messages found crossduplicate on host2  : 0
Messages void (noheader) on host1       : 0  
Messages void (noheader) on host2       : 0
Messages found in host1 not in host2    : 2 messages
Messages found in host2 not in host1    : 33 messages
Messages deleted on host1               : 0
Messages deleted on host2               : 0
Total bytes transferred                 : 2480216436 (2.310 GiB)
Total bytes skipped                     : 15442 (15.080 KiB)
Message rate                            : 0.9 messages/s
Average bandwidth rate                  : 312.7 KiB/s
Reconnections to host1                  : 0
Reconnections to host2                  : 2
Memory consumption at the end           : 335.7 MiB (started with 171.8 MiB)
Load end is                             : 1.61 1.34 1.02 1/1241 on 4 cores
CPU time and %cpu                       : 1679.15 sec 21.7 %cpu 5.4 %allcpus
Log file is LOG_imapsync/2022_04_22_10_55_20_476_ikalmetov@mbk-lab.ru_ikalmetov@test.tegu.online.txt

Скорость переноса

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