imapsync: перенос почты пошагово — Linux, Docker, Windows
АйТи Фреш
Серверы и инфраструктура

Перенос почты через imapsync: пошаговая инструкция с командами, проверенными на стенде

Автор: , директор ООО «АйТи-Фреш» · · ~15 мин чтения
Слева горит облачный дата-центр, справа тихий домик со своим сервером у воды
imapsync забирает переписку из облака на ваш сервер — подальше от чужих аварий.

imapsync — главный инструмент переезда с облачной почты на собственный сервер: он копирует письма с Яндекс 360 или любого другого IMAP-сервиса на ваш сервер вместе с папками и отметками «прочитано», «важное», «отвечено». Небольшой ящик переносится за секунды, ящик на десятки гигабайт — за часы, повторный запуск безопасен: уже перенесённые письма пропускаются, поэтому перенос можно прерывать и продолжать, а перед переключением MX сделать короткий дозаливочный проход. Так компания забирает свою переписку из чужого облака и перестаёт зависеть от его аварий. Ниже — порядок работ и команды, которые мы прогнали на тестовом стенде из двух серверов Dovecot 2.4 с imapsync 2.326.

Своя почта вместо облака: варианты решения

Облачная почта — это ваша переписка на чужом сервере: когда у провайдера авария, вы ждёте вместе со всеми. Собственный почтовый сервер возвращает компании контроль. Основные варианты:

mailcow

Почта, антиспам и веб-почта SOGo с календарями в контейнерах Docker; обновление одной командой.

Carbonio CE

Наследник Zimbra: привычный веб-клиент с календарями и адресными книгами, как в облаке.

iRedMail

Postfix, Dovecot, антиспам и веб-почта на обычном Linux-сервере; от 4 ГБ памяти.

Stalwart

Современный сервер «всё в одном»: IMAP, SMTP, CalDAV, CardDAV; скромные требования.

Почта на инфраструктуре АйТи Фреш

Carbonio CE или mailcow на наших серверах в ЦОД МТС, антиспам и ежедневные бэкапы — от 150 ₽/мес за ящик.

Подберём вариант под вашу компанию и перенесём почту →

Что делает imapsync и чем он лучше переноса через почтовую программу

Задача, ради которой imapsync чаще всего запускают, — забрать почту компании из облака на собственный сервер: mailcow, Carbonio CE, iRedMail, Stalwart или Postfix с Dovecot. Пока письма лежат только у облачного провайдера, любая авария на его стороне означает, что переписка недоступна и вы не можете на это повлиять. После переноса письма живут на сервере, который контролирует компания, а imapsync остаётся под рукой как инструмент резервного копирования.

imapsync — консольная утилита, которая подключается к двум IMAP-серверам и копирует письма из ящика на первом сервере (host1) в ящик на втором (host2). Она создаёт на новом сервере ту же структуру папок, переносит отметки писем и при каждом следующем запуске докачивает только то, чего на приёмнике ещё нет. Распространяется по лицензии NOLIMIT Public License, исходный код и документация — на официальном сайте.

Как imapsync понимает, что письмо уже перенесено: по умолчанию он сравнивает заголовки Message-Id: и Received:. Если письмо с такими заголовками уже лежит в папке на приёмнике, второй раз оно не копируется. Отметки при этом синхронизируются на каждом запуске (это поведение по умолчанию, отключается опцией --noresyncflags).

СпособПапки и флагиПовторный запускПодходит для
imapsyncсохраняютсядокачивает только новоелюбого числа ящиков, переноса без простоя
Перетаскивание в почтовой программезависит от клиентасоздаёт дублиодного-двух небольших ящиков
Экспорт в файл и импортчасто теряютсявручнуюархива, а не переезда
Встроенные инструменты нового сервисапо-разномупо-разномупереезда внутрь конкретного сервиса

Главное преимущество перед ручным переносом — предсказуемость. Перенос идёт по сети между серверами, а не через ноутбук сотрудника, и в конце imapsync выводит отчёт: сколько писем перенесено, сколько пропущено и сколько ошибок. Как перенос писем вписывается в общий план переезда — выбор площадки, DNS, календари, сотрудники — разобрано в руководстве по переносу почты с Яндекс 360.

Почему переносить почту из облака: результаты стенда imapsync
Пока письма в облаке, доступ к ним зависит от провайдера.

Что подготовить до запуска

Нужны логин и пароль к каждому ящику на старом и на новом сервере, доступ по IMAP к обоим и место на диске приёмника с запасом. Ящики на новом сервере создайте заранее: imapsync переносит содержимое, а не учётные записи.

Если почта уходит из Яндекс 360, по справке Яндекса параметры такие: сервер imap.yandex.ru, порт 993, SSL. В настройках почты нужно включить доступ «С сервера imap.yandex.ru по протоколу IMAP», а для подключения использовать пароль приложения или OAuth-токен, а не обычный пароль. Для Яндекс 360 для бизнеса логин — полный адрес ящика. Пароли приложений создаются в Яндекс ID, в разделе «Безопасность» → «Пароли приложений»; по справке Яндекс ID созданный пароль можно увидеть только один раз, и начинает он действовать через 2–3 часа. Создавайте пароли заранее, а не в день переноса.

Пароли не пишите в командную строку: они видны в списке процессов и оседают в истории оболочки. У imapsync для этого есть опции --passfile1 и --passfile2 — файл, в первой строке которого лежит пароль. Права на такие файлы — только у пользователя, от имени которого идёт перенос.

Где запускать: на Linux-сервере или виртуальной машине рядом с новым почтовым сервером. Перенос с рабочего ноутбука возможен, но обрыв Wi-Fi или спящий режим растянут его надолго.

Пожар в серверном зале, мультяшный стиль
Авария у провайдера — не повод терять переписку.

Установка: Docker, Linux и Windows

Проще всего запускать imapsync из официального Docker-образа — не нужно ставить Perl-модули. Мы использовали именно его:

docker pull gilleslamiral/imapsync
docker run --rm gilleslamiral/imapsync imapsync --version

На стенде команда вывела версию 2.326. Учтите особенность образа: процесс внутри контейнера работает от непривилегированного пользователя (uid 65534). Каталог, который вы монтируете для логов и файлов паролей, должен быть ему доступен, иначе imapsync завершится ошибкой Permission denied при создании рабочего каталога.

Для установки без Docker на Linux следуйте инструкции для вашего дистрибутива из раздела INSTALL на сайте imapsync: утилите нужен Perl и набор модулей, список которых там приведён.

Для Windows автор распространяет архив с imapsync.exe и примерами командных файлов. По README_Windows права администратора не нужны, а батники imapsync_example.bat (один ящик) и sync_loop_windows.bat (много ящиков) должны лежать в одной папке с imapsync.exe. Логика опций та же, что и в Linux. Если новая площадка — mailcow, особенности переноса именно туда описаны в статье «Миграция на mailcow: imapsync без потери писем».

Шесть шагов переноса ящика через imapsync
Порядок переноса одного ящика.

Шаг 1. Оценить объём до переноса

Перед первым запуском посчитайте, сколько писем и гигабайт предстоит перенести. Опция --justfoldersizes подключается к обоим серверам, выводит размеры папок и завершается, ничего не копируя:

docker run --rm -v "$PWD":/var/tmp gilleslamiral/imapsync imapsync \
  --host1 imap.yandex.ru --ssl1 --user1 anna@company.ru --passfile1 /var/tmp/pass_old \
  --host2 mail.company.ru --ssl2 --user2 anna@company.ru --passfile2 /var/tmp/pass_new \
  --justfoldersizes

На стенде для тестового ящика с 755 письмами в семи папках это заняло 4 секунды:

Host1 Nb messages:                  755 messages
Host2 Nb messages:                    0 messages
Host1 Total size:              21737007 bytes (20.730 MiB)
Host2 Total size:                     0 bytes (0.000 KiB)

Сохраните эти цифры: после переноса этой же командой вы сверите результат. Заодно станет понятно, какие ящики крупные и требуют отдельного окна времени.

Серверный зал без электричества, карандашный рисунок
Блэкаут в чужом дата-центре.

Шаг 2. Первый перенос

Основной запуск — та же команда без --justfoldersizes, но с --automap. Эта опция, по документации, угадывает соответствие стандартных папок: «Отправленные», «Черновики», «Спам», «Корзина» на старом сервере попадают в системные папки нового сервера, а не создаются рядом с ними копиями.

docker run --rm -v "$PWD":/var/tmp gilleslamiral/imapsync imapsync \
  --host1 imap.yandex.ru --ssl1 --user1 anna@company.ru --passfile1 /var/tmp/pass_old \
  --host2 mail.company.ru --ssl2 --user2 anna@company.ru --passfile2 /var/tmp/pass_new \
  --automap

Результат на стенде — 11 секунд, все папки и письма на месте:

Folders synced                          : 11/11 synced
Messages transferred                    : 755
Messages skipped                        : 0
Total bytes transferred                 : 21737007 (20.730 MiB)
Detected 0 errors

Мы отдельно сверили отметки писем через IMAP-поиск на обоих серверах: в каждой папке совпало число всех писем, прочитанных, помеченных флажком и отвеченных. Папки с русскими именами «Отправленные» и «Черновики» --automap сам сопоставил с системными Sent и Drafts на новом сервере. Вложенные папки вида «Проекты/2025» и имена с символом «&» перенеслись без искажений.

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

Путь письма на ваш сервер: пять шагов imapsync
От оценки объёма до контрольного прохода.

Шаг 3. Повторный запуск и докачка после обрыва

Повторный запуск той же команды не создаёт дублей. На стенде второй проход по уже перенесённому ящику завершился за 4 секунды: перенесено 0 писем, пропущено 755.

Это же свойство спасает при обрыве. Мы запустили перенос ящика на 900 писем (около 1,4 ГБ, большинство — письма с вложениями по 2 МБ) и через 90 секунд принудительно остановили контейнер. К этому моменту на приёмнике было 602 письма. Повторный запуск той же командой дописал оставшиеся 298 и пропустил 602 уже перенесённых:

Host1 Nb messages:                  900 messages
Host2 Nb messages:                  602 messages
...
Messages transferred                    : 298
Messages skipped                        : 602
Detected 0 errors

Отсюда практическое правило: большие ящики не нужно переносить «за один присест». Запускайте перенос заранее, хоть за неделю до переключения, и повторяйте его — каждый следующий проход короче предыдущего.

Не добавляйте --delete2 «для чистоты». Эта опция удаляет на приёмнике письма, которых нет на источнике. Если сотрудник уже начал работать в новом ящике, его новые письма будут удалены.

Папки: исключения и переименование, в том числе с кириллицей

Лишние папки можно исключить опцией --exclude с регулярным выражением, например не переносить корзину: --exclude '^Trash$'. Перед реальным переносом проверьте, какие папки попадут в работу, с опцией --justfolders --dry: imapsync покажет действия с папками, ничего не меняя.

Чтобы перенести папку под другим именем, служит --f1f2 'старое=новое', и она приоритетнее --automap. Здесь на стенде мы наткнулись на подводный камень. Команда с русскими именами как есть, --f1f2 'Заявки=Входящие заявки', отработала без ошибок, но папка на приёмнике осталась «Заявки»: кириллица в аргументе дошла до imapsync в искажённом виде. Сработал вариант, в котором имена записаны так, как их показывает сам IMAP-сервер, — в кодировке modified UTF-7:

--f1f2 '&BBcEMARPBDIEOgQ4-=&BBIERQQ+BDQETwRJBDgENQ- &BDcEMARPBDIEOgQ4-'

Готовые закодированные имена берутся из лога imapsync: в начале работы он печатает список папок обоих серверов в виде [&BBcEMARPBDIEOgQ4-] = [Заявки]. После переименования обязательно проверьте результат на приёмнике, прежде чем запускать перенос всех ящиков.

Грозовое облако проливается письмами на дом, стиль «Матрицы»
Письма из облака — на свой сервер.

Шаг 4. Финальный проход в момент переключения

Когда основной объём перенесён, остаётся переключить приём почты на новый сервер — сменить MX-записи домена — и забрать письма, которые успели прийти в старый ящик. Порядок такой: заранее снизить TTL записей, переключить MX, подождать, пока старый сервер перестанет получать новые письма, и сделать последний проход imapsync.

Чтобы последний проход был быстрым, ограничьте его свежими письмами опцией --maxage (пропускать письма старше указанного числа дней). На стенде мы добавили в исходный ящик 5 новых писем и запустили проход с --maxage 1: перенесены ровно эти 5 писем, за 4 секунды.

docker run --rm -v "$PWD":/var/tmp gilleslamiral/imapsync imapsync \
  --host1 imap.yandex.ru --ssl1 --user1 anna@company.ru --passfile1 /var/tmp/pass_old \
  --host2 mail.company.ru --ssl2 --user2 anna@company.ru --passfile2 /var/tmp/pass_new \
  --automap --maxage 1

Через несколько дней после переключения стоит сделать ещё один полный проход без --maxage: он ничего не испортит, а письма, задержавшиеся у отправителей в очередях, догонит. Как переключать MX, SPF, DKIM и DMARC без потери писем, разобрано в отдельной статье серии.

Результаты стенда Dovecot и imapsync
Что показал стенд.

Сверка: как убедиться, что перенесено всё

После последнего прохода запустите для каждого ящика --justfoldersizes и сравните количество писем и байт на host1 и host2. На стенде после всех проходов цифры совпали до байта.

Вторая проверка — строка Detected 0 errors в конце лога каждого ящика. Если ошибки есть, imapsync перечисляет их в конце вывода: чаще всего это письма, которые приёмник отказался принять по размеру, или превышение квоты ящика.

Третья — выборочная проверка глазами: откройте на новом сервере несколько старых писем с вложениями и пару вложенных папок. Подробная методика сверки с примерами — в статье о проверке переноса почты.

Маяк с сервером в тихой бухте, акварель
Свой сервер — тихая бухта для почты.

Сколько времени займёт перенос

Скорость переноса определяют три вещи: канал между машиной с imapsync и обоими серверами, скорость, с которой старый сервер отдаёт письма, и число писем. Тысяча мелких писем переносится заметно дольше, чем одно письмо того же суммарного размера: на каждое письмо уходят отдельные IMAP-команды.

Для ориентира — цифры со стенда, где оба сервера и imapsync работали на одной машине, то есть сеть не была узким местом. Ящик на 755 писем и 20,7 МиБ перенёсся за 11 секунд. Дописывание 298 писем объёмом 261 МиБ после обрыва заняло 19 секунд. С облачным сервисом через интернет скорость будет ниже, и её не стоит угадывать: перенесите один реальный ящик среднего размера, засеките время и пересчитайте план на остальные.

Отсюда порядок планирования для компании. Сначала перенос самого большого ящика: по нему понятно, укладываетесь ли вы в выбранные сроки. Затем все остальные, параллельно в несколько потоков. И только когда повторные проходы стали короткими, назначайте ночь переключения MX. В такой схеме сотрудники не замечают переезда: всё это время они работают в старой почте, а в новую переходят с уже заполненными ящиками. Как такой порядок выглядел на реальном переезде с Яндекс 360 — в кейсе переноса 28 ящиков на Mailu.

Если сроки поджимают — например, нужно уйти со старого сервиса за выходные, — переносите сначала свежие письма опцией --maxage (скажем, за последние 90 дней), переключайте MX, а архив докачивайте следующими проходами уже без ограничения по возрасту. imapsync не создаст дублей при таком порядке, потому что узнаёт уже перенесённые письма по заголовкам.

Чек-лист переноса через imapsync
Перед отключением старого ящика.

Десятки и сотни ящиков: перенос по списку

Когда ящиков много, команды не набирают вручную, а запускают цикл по CSV-файлу. Автор imapsync выкладывает готовые примеры (sync_loop_unix.sh, sync_loop_windows.bat). Ниже — упрощённый вариант для Docker. В нём пароли каждого ящика лежат в отдельных файлах, а в CSV — только адреса:

# users.csv: адрес_на_старом;адрес_на_новом
while IFS=';' read -r u1 u2; do
  docker run --rm -v "$PWD":/var/tmp gilleslamiral/imapsync imapsync \
    --host1 imap.yandex.ru --ssl1 --user1 "$u1" --passfile1 "/var/tmp/pass/$u1.old" \
    --host2 mail.company.ru --ssl2 --user2 "$u2" --passfile2 "/var/tmp/pass/$u2.new" \
    --automap > "log_$u1.txt" 2>&1
  tail -1 "log_$u1.txt"
done < users.csv

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

Логи сохраняйте до конца проекта: по ним видно, какой ящик когда перенесён и с какими ошибками. Пример переезда целой бухгалтерской фирмы — в кейсе с mailcow.

Серверная стойка с зелёными огнями, стиль комикса
Почта компании на собственном сервере.

Частые ошибки и как их закрыть

СимптомВероятная причинаЧто сделать
Ошибка входа на host1не включён IMAP или используется обычный пароль вместо пароля приложениявключить IMAP в настройках ящика, создать пароль приложения
Письма не все, в конце список ошибокприёмник не принимает письма такого размера или кончилась квотаувеличить лимиты на новом сервере и повторить проход
Папка перенеслась под старым именемкириллица в --f1f2указать имена в modified UTF-7 из лога
Дубли писем на приёмникеперенос делали разными способами (клиентом и imapsync)использовать только imapsync, лишнее чистить до переключения
Permission denied в Dockerкаталог не доступен uid 65534выдать права на смонтированный каталог

Отдельно о больших письмах: опция --maxsize позволяет пропустить письма крупнее заданного размера, например чтобы сначала быстро перенести всё остальное. Но такие письма потом нужно перенести отдельным проходом, когда на приёмнике будут подняты лимиты, — иначе они просто останутся на старом сервере.

Чек-лист переноса через imapsync

Пройдите по пунктам перед тем, как переключать MX и отключать старый ящик.

Частые вопросы

Удаляет ли imapsync письма на старом сервере?

Нет, по умолчанию он только читает исходный ящик. Удаление включается отдельными опциями (--delete1, --delete2), их в обычном переносе использовать не нужно.

Будут ли дубли, если запустить imapsync ещё раз?

Нет. imapsync узнаёт уже перенесённые письма по заголовкам Message-Id и Received и пропускает их. На нашем стенде повторный запуск перенёс 0 писем и пропустил 755.

Что делать, если перенос оборвался?

Запустить ту же команду ещё раз. Он докачает только недостающие письма: на стенде после обрыва на 602 письмах из 900 повторный запуск дописал оставшиеся 298.

Сохраняются ли отметки «прочитано» и «важное»?

Да. Флаги переносятся и синхронизируются при каждом повторном запуске; на стенде совпали прочитанные, помеченные и отвеченные письма во всех папках.

Какой пароль указывать для Яндекс Почты?

Пароль приложения или OAuth-токен, а не пароль от аккаунта. Перед этим в настройках почты нужно включить доступ по IMAP. Для Яндекс 360 для бизнеса логин — полный адрес ящика. Пароль приложения начинает действовать через 2–3 часа после создания.

Переносит ли imapsync контакты и календари?

Нет, только письма и папки по IMAP. Контакты и календари переносятся отдельно, через CardDAV и CalDAV или экспорт в файлы.

Можно ли запустить imapsync на Windows?

Да, есть imapsync.exe и готовые командные файлы imapsync_example.bat и sync_loop_windows.bat. Права администратора не нужны; батники должны лежать рядом с imapsync.exe.

Миграция почты с Яндекса под ключ от АйТи Фреш

Возьмём на себя весь переезд: проверим текущую почту и домен, поможем выбрать вариант, перенесём письма, папки, календари и контакты, переключим MX, SPF, DKIM и DMARC, проверим доставляемость и поддержим сотрудников после переезда.

Куда переносим: в облако на российской площадке, на ваш собственный сервер, в гибридную схему или как резервный контур рядом с текущей почтой.

  1. Аудит текущей почты и домена — 1–2 рабочих дня
  2. План миграции и фиксированная смета — 1 рабочий день
  3. Настройка сервера, DNS и перенос ящиков — 3–5 рабочих дней
  4. Сопровождение сотрудников и проверка доставляемости — 5 рабочих дней
РаботаСтоимость
Перенос почты, календарей и контактов до 50 ящиковот 12 000 ₽ разово
Корпоративная почта под ключ: сервер, домен, SPF/DKIM/DMARC, до 15 ящиковот 25 000 ₽ разово
Ящики на нашей инфраструктуре (Carbonio CE или mailcow, ЦОД МТС)от 150 ₽/мес за ящик
Обслуживание почтового сервераот 7 000 ₽/мес

Опыт: перенесли 617 ящиков гостиничной группы за 3 дня. Точный срок и смету фиксируем после аудита; простой при переключении зависит от схемы и оговаривается в договоре. Подробнее — на странице услуги «Корпоративная почта для бизнеса».

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

© ООО «АйТи-Фреш» · Москва · Все статьи