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

2

Рассказываю об Imap-Sync. Почему это хорошо, удобно и круто.

Сайт проекта https://imapsync.lamiral.info/

Документация https://imapsync.lamiral.info/#doc

Вместо вступления

Прошу сразу обратить внимание, что это не инструкция по переносу почтового сервера, это заметка о переносе почты!

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

Причины могут быть разные. Какая-то компания захотела сэкономить на почте (например переехать с Яндекса после того, как он стал платным) или решили, что функционал почты от TimeWeb им нравится больше, чем у VK WorkMail. Да и причина нас мало интересует.

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

В поисках быстрого решения и желательно без геморроя, я наткнулся на IMAP-SYNC.

Установка

Этот разработчик маньяк. Он сделал свой инструмент под все платформы. У каждой платформы свой маленький гайд по запуску.

Я рассмотрю самый простой (для себя) вариант. Установка на Ubuntu.

Подключаемся к серверу по SSH на Ubuntu 22, логимся под рутом и поехали.

Устанавливаем все необходимые компоненты.

Теперь получаем установщик и запускаем его

На этом этапе установка завершена. Разработчик сделал все элегантно и круто.

Перенос писем

Давайте рассмотрим два варианта переноса. По одному ящику и массовый перенос.

Перенос одного ящика (простой пример)

Imap-sync переносит не просто почту, а всю структуру. Папки, состояние письма (прочитано/не прочитано) и флаг важности. Но не переносит правила фильтрации и пересылок. Об этом нужно позаботиться заранее и перенести руками.

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

Давайте рассмотрим, какие параметры мы тут указали

  1. —host1 исходный сервер, откуда мы переносим почту;
  2. —user1 наш исходный ящик, откуда мы переносим почту;
  3. —password1 пароль от ящика, который дает доступ от IMAP к ящику откуда мы переносим почту;
  4. —host2 целевой сервер, куда мы переносим почту;
  5. —user2 целевой ящик, куда мы переносим почту;
  6. —password2 пароль от ящика, который дает доступ от IMAP к ящику куда мы переносим почту;

Хочу обратить внимание на параметры. Это небольшое дополнение для неопытных админов.

Как узнать параметр host: это Ваш адрес imap сервера. Если Вы используете почту от хостинга или какой-то облачный почтовик, то достаточно в гугле вбить «imap %название_сервиса%, с большим шансом Вы попадете на страницу, где будут написаны и адреса и порты.

Параметр password должен давать пароль, который имеет доступ к IMAP. Некоторые почтовые сервисы имеют две разных категории паролей. Например, в Яндексе есть облачный пароль и пароль приложений. Облачный Вас пускает в веб-интерфейс, а пароль приложений пускает по IMAP. Поэтому важно, чтобы пароль пускал нас именно по imap.

Параметр user2 может отличаться от параметра user1. Таким образом мы можем передавать почту между ящиками. Или изменить ящик на стадии переноса.

 

Перенос одного ящика (посложнее пример)

У Imap-Sync, есть различные флаги. Например, если наша задача заключается в том, что нам необходимо перенести письма за последний год. Для этого есть флаг maxage.

Таким образом мы указали, что нам нужно перенести письма НЕ старше 365 дней.

Какие еще есть полезные флаги:

  1. —maxage X: Переносит письма не старше X дней. Например, —maxage 365 для писем за последний год.
  2. —minage X: Переносит письма старше X дней. Например, —minage 30 для писем старше месяца.
  3. -delete2: Удаляет письма на целевом сервере, которых нет на исходном. Осторожно можно потерять данные!
  4. -syncacls: Синхронизирует права доступа к папкам. Полезно, если у тебя есть общие ящики.
  5. -exclude «Folder1|Folder2»: Исключает указанные папки из синхронизации.
  6. —include «Folder1|Folder2»: Синхронизирует только указанные папки.
  7. —dry: Показывает, что будет сделано, но не делает этого. Полезно для проверки настроек.
  8. —automap: Автоматически сопоставляет папки между серверами. Удобно, если названия папок отличаются.
  9. —subscribe: Подписывается на все перенесенные папки на целевом сервере.
  10. —timeout X: Устанавливает таймаут соединения в X секундах. Например, —timeout 300 для 5 минут.
  11. —useheader ‘Message-Id’: Использует заголовок Message-Id для сравнения писем вместо размера и даты.
  12. —skipsize: Пропускает проверку размера файлов. Может ускорить синхронизацию, но будь осторожен.
  13. —nofoldersizes: Не вычисляет размеры папок. Может ускорить работу на больших ящиках.
  14. —fast: Использует быстрый режим синхронизации. Может пропустить некоторые проверки.
  15. —compress: Сжимает данные при передаче. Полезно для медленных соединений.

Массовый перенос

Давайте смоделируем ситуацию. У нас есть домен bite-byte.ru, его почта сейчас находиться на почтовых серверах Яндекс.Почты, а я хочу переместить всю почту на TimeWeb.Почта. Всего там 9 ящиков. И тащить их руками будет долго. Я для себя сделал такую таблицу (лучше скачайте, чтобы корректно все работало).

В этой таблице все максимально просто. Заполем данные от почтовых ящиков.  И в столбце H мы получаем данные, которые нам пригодятся дальше.

Эти строчки нам нужны для скрипта, который запустит поочередную синхронизацию каждого ящика. В качестве разделителя я использую знак «|», потому что все остальные мне попадались в паролях, и все шло не по плану.

На нашей виртуальной машине создаем скрипт, назовем его sync-mail.sh

и добавим такое содержимое (я его честно где-то украл)

И создадим файл email.txt в него мы добавляем содержимое из таблицы, столбец H

Содержимое:

Скрипт берет значение переменных, разделенных знаком «|» и подставляет наши данные. После запуска нам только остается наблюдать за тем, как летят письма.

Пара важных моментов:

  1. Скрипт выполняется пока активна SSH сессия, при ее обрыве скрипт остановится;
  2. Иногда может показаться, что он завис, но нужно подождать, там происходят проверки;

Еще различные варианты использования

Веб-интерфейс

Разработчик сделал веб-интефейс для переноса писем. Посмотреть можно по адресу https://imapsync.lamiral.info/X/

Никогда не использовал, мне как-то проще через консоль и скрипты, но может пригодиться тем, кто не хочет морочиться.

Как я понял, такой же обвес можно и на свой сервер повесить, видел в документации.

Клиенты

Существуют еще различные варианты с gui, например вот такой https://github.com/ridaamirini/ImapSyncClient

Я честно его пытался запустить на тестовых ящиках, но как-то непонятное зависание на половине переноса произошло и я плюнул.