Миграция почты¶
- Содержание
- Миграция почты
- Перенос почтовых ящиков
В этой статье мы научимся делать так, чтобы в течение срока миграции оба сервера (старый и новый) работали совместно.
Общий случай¶
Итак, в организации существует сервер с именем 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 в режиме миграции:
- Tegu принимает почту из интернет:
- В случае если значение RCPT TO присутствует в поле "Адреса локальных ящиков", Tegu доставляет сообщение в локальный почтовый ящик;
- В случае если значение RCPT TO отсутствует в поле "Адреса локальных ящиков", Tegu пересылает сообщение на любой из доступных серверов из списка "Другие серверы домена" (согласно очередности описания), заменяя отправителя (только в сессии SMTP, не в заголовках) на получателя, но с виртуальным доменом - virt.tegu.online;
- Tegu принимает почту с сервера, указанного в поле "Другие серверы домена" (и только с него), адресованные пользователям домена virt.tegu.online и обрабатывает их как почту для домена tegu.online:
- В качестве примера. Почтовый ящик ivanov переехал на Tegu. Tegu получает письмо с сервера old_mail.tegu.online, где в адресной части ivanov@virt.tegu.online, изменяет адрес на ivanov@tegu.online, находит этот адрес в списке локальных адресов и доставляет сообщение в локальное хранилище;
- В ряде случаев невозможно указать весь список возможных старых серверов (к примеру, для облачного оператора, у которого сотни нод). В этом случае Tegu будет ориентироваться на записи SPF и принимать правильное решение.
Важно! Для преобразования домена в виртуальный и обратно никаких правил в Маршрутизации создавать не надо.
Итак, наши сервера (старый и новый) в правильной позиции.
Как осуществить миграцию для пользователя ivanov:
- Переносим почтовый ящик ivanov с old_mail.tegu.online на mail.tegu.online;
- Настраиваем для ivanov пользовательскую почтовую программу для работы с mail.tegu.online;
- На Tegu прописывает адрес ivanov@tegu.online в поле "Адреса локальных ящиков";
- На old_mail.tegu.online прописываем безусловное правило пересылки всей почты: ivanov@tegu.online переслать на ivanov@virt.tegu.online.
Частный случай¶
Обратите внимание, что old_mail.tegu.online может быть облачным (on cloud, к примеру Office 365) сервером или локальным (on premise, допустим MS Exchange).
- Для локального случая отличие заключается в том, что виртуальный домен достаточно создать в локальной (непубличной) зоне.
- Для локального случая прописывание MX-записи Tegu в публичной зоне также необязательно в случае если вы настроите пересылку всей почты Tegu через smarthost, в роли которого выступает старый сервер.
- Опции частного случая необязательны и призваны облегчить работу - правила общего случая будут работать всегда.
Перенос почтовых ящиков¶
Для переноса почты с одного IMAP сервера на другой мы рекомендуем использовать утилиту IMAPSync.Эта утилита обладает двумя достоинствами:
- Она чрезвычайно корректно работает (сохраняет правильную структуру каталогов, правильно обрабатывает национальные языки и пр.).
- Эта утилита универсально по своему определению (использует механизм IMAP). Благодаря этому ее можно использовать с любыми типами почтовых серверов будь то Postfix, MS Exchange или Lotus Domino.
- Сервер Tegu внесен в список серверов, совместимость которых с imapsync подтверждена.
Важно понимать, что с помощью IMAPSync можно импортировать только те сообщения, которые находятся с почтовом ящике на сервере. Другими словами, для того, чтобы импортировать локальные сообщения, хранящиеся в форматах mailbox/maildir или pst, необходимо предварительно перенести их в серверный почтовый ящик. Как правило, это делается средствами почтовой программы или с помощью специальных утилит. К примеру, в распоряжении администраторов MS Exchange серверов (начиная с версии 2010 SP1) есть специальная утилита PowerShell: New-MailboxImportReques. Очевидно, что у администратора, выполняющего операцию импорта, должны быть права на каталоги, в которых хранятся PST-файлы пользователей. Данная работа носит подготовительный организационно-технический характер, зависит от архитектуры конкретной системы, и в данной статье не рассматривается.
Установка утилиты¶
Если вам не удалось установить из штатного репозитория вашего дистрибутива операционной системы, то нам поможет сайт французского разработчика imapsync Жиля ЛамирАля (Gilles LAMIRAL), gilles@lamiral.info - 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
Скорость переноса¶
Очевидно, что на данный вопрос мы не можем ответить, т.к. это зависит от пропускной способности конкретных каналов связи, производительности почтовых серверов и объемов почтовых сообщений. Тут вам придется поэкспериментировать самостоятельно.