Рассказываю об Imap-Sync. Почему это хорошо, удобно и круто.
Сайт проекта https://imapsync.lamiral.info/
Документация https://imapsync.lamiral.info/#doc
Содержание
Вместо вступления
Прошу сразу обратить внимание, что это не инструкция по переносу почтового сервера, это заметка о переносе почты!
На самом деле задача по переносу почты не такая уж и часто встречаемая, но, когда работаешь на аутсорсе нет-да-нет прилетают эти задачи.
Причины могут быть разные. Какая-то компания захотела сэкономить на почте (например переехать с Яндекса после того, как он стал платным) или решили, что функционал почты от TimeWeb им нравится больше, чем у VK WorkMail. Да и причина нас мало интересует.
По неопытности я переносил руками через Outlook или нечто подобное. И переносы у меня занимали времени, как у дурака, который реку переносит ведрами в другое место.
В поисках быстрого решения и желательно без геморроя, я наткнулся на IMAP-SYNC.
Установка
Этот разработчик маньяк. Он сделал свой инструмент под все платформы. У каждой платформы свой маленький гайд по запуску.
Я рассмотрю самый простой (для себя) вариант. Установка на Ubuntu.
Подключаемся к серверу по SSH на Ubuntu 22, логимся под рутом и поехали.
Устанавливаем все необходимые компоненты.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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 |
Теперь получаем установщик и запускаем его
1 2 3 |
cd wget -N https://raw.githubusercontent.com/imapsync/imapsync/master/imapsync chmod +x imapsync |
На этом этапе установка завершена. Разработчик сделал все элегантно и круто.
Перенос писем
Давайте рассмотрим два варианта переноса. По одному ящику и массовый перенос.
Перенос одного ящика (простой пример)
Imap-sync переносит не просто почту, а всю структуру. Папки, состояние письма (прочитано/не прочитано) и флаг важности. Но не переносит правила фильтрации и пересылок. Об этом нужно позаботиться заранее и перенести руками.
Для того, чтобы начать перенос одного ящика, нам нужно запустить команду.
1 2 3 4 5 6 7 |
./imapsync \ --host1 imap.yandex.ru \ --user1 me@bite-byte.ru\ --password1 "KakoytoParol" \ --host2 imap.timeweb.ru \ --user2 me@bite-byte.ru \ --password2 "SovsemDrugoiParol" |
Давайте рассмотрим, какие параметры мы тут указали
- —host1 исходный сервер, откуда мы переносим почту;
- —user1 наш исходный ящик, откуда мы переносим почту;
- —password1 пароль от ящика, который дает доступ от IMAP к ящику откуда мы переносим почту;
- —host2 целевой сервер, куда мы переносим почту;
- —user2 целевой ящик, куда мы переносим почту;
- —password2 пароль от ящика, который дает доступ от IMAP к ящику куда мы переносим почту;
Хочу обратить внимание на параметры. Это небольшое дополнение для неопытных админов.
Как узнать параметр host: это Ваш адрес imap сервера. Если Вы используете почту от хостинга или какой-то облачный почтовик, то достаточно в гугле вбить «imap %название_сервиса%, с большим шансом Вы попадете на страницу, где будут написаны и адреса и порты.
Параметр password должен давать пароль, который имеет доступ к IMAP. Некоторые почтовые сервисы имеют две разных категории паролей. Например, в Яндексе есть облачный пароль и пароль приложений. Облачный Вас пускает в веб-интерфейс, а пароль приложений пускает по IMAP. Поэтому важно, чтобы пароль пускал нас именно по imap.
Параметр user2 может отличаться от параметра user1. Таким образом мы можем передавать почту между ящиками. Или изменить ящик на стадии переноса.
Перенос одного ящика (посложнее пример)
У Imap-Sync, есть различные флаги. Например, если наша задача заключается в том, что нам необходимо перенести письма за последний год. Для этого есть флаг maxage.
1 2 3 4 5 6 7 8 |
./imapsync \ --host1 imap.yandex.ru \ --user1 me@bite-byte.ru\ --password1 "KakoytoParol" \ --host2 imap.timeweb.ru \ --user2 me@bite-byte.ru \ --password2 "SovsemDrugoiParol" --maxage 365 |
Таким образом мы указали, что нам нужно перенести письма НЕ старше 365 дней.
Какие еще есть полезные флаги:
Массовый перенос
Давайте смоделируем ситуацию. У нас есть домен bite-byte.ru, его почта сейчас находиться на почтовых серверах Яндекс.Почты, а я хочу переместить всю почту на TimeWeb.Почта. Всего там 9 ящиков. И тащить их руками будет долго. Я для себя сделал такую таблицу (лучше скачайте, чтобы корректно все работало).
В этой таблице все максимально просто. Заполем данные от почтовых ящиков. И в столбце H мы получаем данные, которые нам пригодятся дальше.
Эти строчки нам нужны для скрипта, который запустит поочередную синхронизацию каждого ящика. В качестве разделителя я использую знак «|», потому что все остальные мне попадались в паролях, и все шло не по плану.
На нашей виртуальной машине создаем скрипт, назовем его sync-mail.sh
1 |
sudo nano sync-mail.sh |
и добавим такое содержимое (я его честно где-то украл)
1 2 3 4 5 6 7 |
#!/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 } < email.txt |
И создадим файл email.txt в него мы добавляем содержимое из таблицы, столбец H
1 |
sudo nano email.txt |
Содержимое:
1 2 3 4 5 6 7 8 9 |
imap.yandex.ru|me@bite-byte.ru|9X8dUaoJ|imap.timeweb.ru|me@bite-byte.ru|35eQe6DL imap.yandex.ru|admin@bite-byte.ru|zTPOOfre|imap.timeweb.ru|admin@bite-byte.ru|vCOaUuci imap.yandex.ru|support@bite-byte.ru|Ma240Nx4|imap.timeweb.ru|support@bite-byte.ru|FhyVk26D imap.yandex.ru|sales@bite-byte.ru|bzjbQo5J|imap.timeweb.ru|sales@bite-byte.ru|ATxhljQ8 imap.yandex.ru|info@bite-byte.ru|5MyyeWPU|imap.timeweb.ru|info@bite-byte.ru|kdl5tnpb imap.yandex.ru|dev@bite-byte.ru|w8sMb35n|imap.timeweb.ru|dev@bite-byte.ru|CHRopifa imap.yandex.ru|hr@bite-byte.ru|69J8Fuav|imap.timeweb.ru|hr@bite-byte.ru|Fjw8xH6A imap.yandex.ru|marketing@bite-byte.ru|kDBf1N3K|imap.timeweb.ru|marketing@bite-byte.ru|9bQLIgjM imap.yandex.ru|projects@bite-byte.ru|YGSCq390|imap.timeweb.ru|projects@bite-byte.ru|wP00Ihzb |
Скрипт берет значение переменных, разделенных знаком «|» и подставляет наши данные. После запуска нам только остается наблюдать за тем, как летят письма.
Пара важных моментов:
- Скрипт выполняется пока активна SSH сессия, при ее обрыве скрипт остановится;
- Иногда может показаться, что он завис, но нужно подождать, там происходят проверки;
Еще различные варианты использования
Веб-интерфейс
Разработчик сделал веб-интефейс для переноса писем. Посмотреть можно по адресу https://imapsync.lamiral.info/X/
Никогда не использовал, мне как-то проще через консоль и скрипты, но может пригодиться тем, кто не хочет морочиться.
Как я понял, такой же обвес можно и на свой сервер повесить, видел в документации.
Клиенты
Существуют еще различные варианты с gui, например вот такой https://github.com/ridaamirini/ImapSyncClient
Я честно его пытался запустить на тестовых ящиках, но как-то непонятное зависание на половине переноса произошло и я плюнул.
При использовании ключа pidfile можно указать, собственно, pid-файл и ничего не отвалится даже при обрыве ssh-сессии. Как раз для массовых переносов исключительно удобно
Да или использоваться tmux