Перенос почты через imapsync: пошаговая инструкция с командами, проверенными на стенде
imapsync — главный инструмент переезда с облачной почты на собственный сервер: он копирует письма с Яндекс 360 или любого другого IMAP-сервиса на ваш сервер вместе с папками и отметками «прочитано», «важное», «отвечено». Небольшой ящик переносится за секунды, ящик на десятки гигабайт — за часы, повторный запуск безопасен: уже перенесённые письма пропускаются, поэтому перенос можно прерывать и продолжать, а перед переключением MX сделать короткий дозаливочный проход. Так компания забирает свою переписку из чужого облака и перестаёт зависеть от его аварий. Ниже — порядок работ и команды, которые мы прогнали на тестовом стенде из двух серверов Dovecot 2.4 с imapsync 2.326.
Своя почта вместо облака: варианты решения
Облачная почта — это ваша переписка на чужом сервере: когда у провайдера авария, вы ждёте вместе со всеми. Собственный почтовый сервер возвращает компании контроль. Основные варианты:
Почта, антиспам и веб-почта SOGo с календарями в контейнерах Docker; обновление одной командой.
Наследник Zimbra: привычный веб-клиент с календарями и адресными книгами, как в облаке.
Postfix, Dovecot, антиспам и веб-почта на обычном Linux-сервере; от 4 ГБ памяти.
Современный сервер «всё в одном»: 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.
Что подготовить до запуска
Нужны логин и пароль к каждому ящику на старом и на новом сервере, доступ по IMAP к обоим и место на диске приёмника с запасом. Ящики на новом сервере создайте заранее: imapsync переносит содержимое, а не учётные записи.
Если почта уходит из Яндекс 360, по справке Яндекса параметры такие: сервер imap.yandex.ru, порт 993, SSL. В настройках почты нужно включить доступ «С сервера imap.yandex.ru по протоколу IMAP», а для подключения использовать пароль приложения или OAuth-токен, а не обычный пароль. Для Яндекс 360 для бизнеса логин — полный адрес ящика. Пароли приложений создаются в Яндекс ID, в разделе «Безопасность» → «Пароли приложений»; по справке Яндекс ID созданный пароль можно увидеть только один раз, и начинает он действовать через 2–3 часа. Создавайте пароли заранее, а не в день переноса.
Пароли не пишите в командную строку: они видны в списке процессов и оседают в истории оболочки. У imapsync для этого есть опции --passfile1 и --passfile2 — файл, в первой строке которого лежит пароль. Права на такие файлы — только у пользователя, от имени которого идёт перенос.
Где запускать: на Linux-сервере или виртуальной машине рядом с новым почтовым сервером. Перенос с рабочего ноутбука возможен, но обрыв Wi-Fi или спящий режим растянут его надолго.
- логины и пароли приложений для всех ящиков на старом сервере
- созданные ящики и пароли на новом сервере
- IMAP по SSL (порт 993) открыт с машины, где запускается imapsync, к обоим серверам
- свободное место на приёмнике больше суммарного объёма ящиков
- файлы паролей с правами 600
- список ящиков в CSV, если их больше десяти
Установка: 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 без потери писем».
Шаг 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 только читает исходный ящик и ничего в нём не меняет, если не указывать опций удаления.
Шаг 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Отсюда практическое правило: большие ящики не нужно переносить «за один присест». Запускайте перенос заранее, хоть за неделю до переключения, и повторяйте его — каждый следующий проход короче предыдущего.
Папки: исключения и переименование, в том числе с кириллицей
Лишние папки можно исключить опцией --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 без потери писем, разобрано в отдельной статье серии.
Сверка: как убедиться, что перенесено всё
После последнего прохода запустите для каждого ящика --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 не создаст дублей при таком порядке, потому что узнаёт уже перенесённые письма по заголовкам.
Десятки и сотни ящиков: перенос по списку
Когда ящиков много, команды не набирают вручную, а запускают цикл по 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 и отключать старый ящик.
- IMAP включён на старом сервере, пароли приложений созданы
- ящики на новом сервере созданы, квоты и лимит размера письма не меньше, чем на старом
- --justfoldersizes выполнен для всех ящиков, цифры сохранены
- первый проход с --automap прошёл, в логах Detected 0 errors
- переименования папок проверены на приёмнике
- TTL MX-записей снижен заранее
- после смены MX сделан проход с --maxage 1
- сверка --justfoldersizes совпала по каждому ящику
- через несколько дней сделан контрольный полный проход
- старые ящики не удалены до окончания проверки
Частые вопросы
Удаляет ли 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–2 рабочих дня
- План миграции и фиксированная смета — 1 рабочий день
- Настройка сервера, DNS и перенос ящиков — 3–5 рабочих дней
- Сопровождение сотрудников и проверка доставляемости — 5 рабочих дней
| Работа | Стоимость |
|---|---|
| Перенос почты, календарей и контактов до 50 ящиков | от 12 000 ₽ разово |
| Корпоративная почта под ключ: сервер, домен, SPF/DKIM/DMARC, до 15 ящиков | от 25 000 ₽ разово |
| Ящики на нашей инфраструктуре (Carbonio CE или mailcow, ЦОД МТС) | от 150 ₽/мес за ящик |
| Обслуживание почтового сервера | от 7 000 ₽/мес |
Опыт: перенесли 617 ящиков гостиничной группы за 3 дня. Точный срок и смету фиксируем после аудита; простой при переключении зависит от схемы и оговаривается в договоре. Подробнее — на странице услуги «Корпоративная почта для бизнеса».










