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

При смене хостинга или почтового сервиса письма нужно перенести вместе с папками, отметками о прочтении и датами. Утилита imapsync копирует почту с одного IMAP-сервера на другой напрямую, ящик за ящиком. Её можно запускать повторно: уже перенесённые письма пропускаются, поэтому последний прогон перед переключением занимает минуты.
Что понадобится
- адреса IMAP-серверов — старого и нового;
- логины и пароли ящиков на обеих сторонах;
- уже созданные ящики на новом сервере: imapsync переносит содержимое, но не создаёт учётные записи;
- компьютер или VPS с Docker для запуска переноса.
Если на аккаунте включена двухфакторная аутентификация, создайте в настройках почтового сервиса пароль приложения и используйте его вместо основного.
Установка
Проще всего запускать imapsync в контейнере — не придётся устанавливать десятки модулей Perl:
docker pull gilleslamiral/imapsync
Проверка:
docker run --rm gilleslamiral/imapsync imapsync --version
Установить Docker поможет эта инструкция. Если Docker недоступен, порядок установки для своего дистрибутива есть на сайте проекта imapsync.
Шаг 1. Проверка подключения
Сначала убедитесь, что логины и пароли подходят. Ключ --justlogin только проверяет вход и ничего не копирует:
docker run --rm gilleslamiral/imapsync imapsync \
--host1 imap.old-server.com --user1 user@example.com --password1 'старый_пароль' \
--host2 mail.new-server.com --user2 user@example.com --password2 'новый_пароль' \
--justlogin
Параметры с цифрой 1 относятся к серверу-источнику, с цифрой 2 — к серверу назначения. Пароли берите в одинарные кавычки, чтобы оболочка не обработала специальные символы.
Шаг 2. Пробный прогон
Ключ --dry показывает, что будет сделано, но ничего не меняет:
docker run --rm gilleslamiral/imapsync imapsync \
--host1 imap.old-server.com --user1 user@example.com --password1 'старый_пароль' \
--host2 mail.new-server.com --user2 user@example.com --password2 'новый_пароль' \
--automap --dry
В выводе проверьте список папок: какие найдены на старом сервере и во что они превратятся на новом. Ключ --automap сопоставляет служебные папки, которые на разных серверах называются по-разному: «Отправленные» и Sent, «Корзина» и Trash.
Шаг 3. Перенос
Уберите --dry и запустите перенос:
docker run --rm gilleslamiral/imapsync imapsync \
--host1 imap.old-server.com --user1 user@example.com --password1 'старый_пароль' \
--host2 mail.new-server.com --user2 user@example.com --password2 'новый_пароль' \
--automap
В конце imapsync выведет итог: сколько писем перенесено, сколько пропущено и были ли ошибки. Если в итоге есть ошибки, запустите команду ещё раз — докопируется только недостающее.
Полезные ключи
| Ключ | Действие |
|---|---|
--dry |
пробный прогон без изменений |
--justlogin |
только проверка входа |
--justfolders |
создать структуру папок без писем |
--automap |
сопоставить служебные папки автоматически |
--exclude 'Spam|Junk|Trash' |
не переносить указанные папки |
--folder INBOX |
перенести только одну папку |
--maxage 365 |
только письма не старше указанного числа дней |
--maxsize 26214400 |
пропускать письма больше заданного размера, в байтах |
--f1f2 'Старая=Новая' |
переименовать папку при переносе |
--port1 993 --ssl1 |
порт и шифрование для сервера-источника |
--passfile1 файл |
читать пароль из файла вместо командной строки |
--delete2 |
удалить на новом сервере письма, которых нет на старом |
Особенности популярных сервисов
- Gmail. Нужен пароль приложения. Добавьте ключ
--gmail1(или--gmail2, если Gmail — получатель): он включает подходящие настройки для ярлыков и ограничений сервиса. Учтите суточные лимиты Gmail на объём передачи — большой ящик может переноситься несколько дней. - Microsoft 365 и Outlook.com. Используйте ключи
--office1или--office2. Вход по обычному паролю может быть отключён администратором. - Самоподписанный сертификат. Если старый сервер использует недоверенный сертификат, imapsync по умолчанию его принимает, но лучше убедиться, что вы подключаетесь к правильному адресу.
Массовый перенос
Для нескольких ящиков подготовьте файл users.txt — по одной строке на ящик, поля разделены точкой с запятой:
user1@example.com;пароль_на_старом;user1@example.com;пароль_на_новом
user2@example.com;пароль_на_старом;user2@example.com;пароль_на_новом
Скрипт migrate.sh:
#!/bin/bash
mkdir -p logs
while IFS=';' read -r u1 p1 u2 p2; do
[ -z "$u1" ] && continue
echo "=== $u1 -> $u2"
docker run --rm gilleslamiral/imapsync imapsync \
--host1 imap.old-server.com --user1 "$u1" --password1 "$p1" \
--host2 mail.new-server.com --user2 "$u2" --password2 "$p2" \
--automap --nolog < /dev/null > "logs/$u1.log" 2>&1
tail -n 3 "logs/$u1.log"
done < users.txt
chmod +x migrate.sh
./migrate.sh
Журнал каждого ящика сохраняется в каталоге logs. Файл с паролями закройте от посторонних (chmod 600 users.txt) и удалите после переноса.
Порядок переезда без потери писем
- Создайте ящики на новом сервере.
- Заранее уменьшите TTL MX-записи домена до 300 секунд — переключение пройдёт быстрее.
- Сделайте первый прогон imapsync. Он самый долгий; пользователи продолжают работать на старом сервере.
- Переключите MX-запись на новый сервер.
- Подождите, пока обновится DNS, — в это время часть писем ещё приходит на старый сервер.
- Сделайте финальный прогон. Он докопирует письма, пришедшие за время переключения.
- Перенастройте почтовые программы пользователей на новый сервер.
- Не отключайте старый сервер ещё несколько дней и повторите прогон перед отключением.
Если новый сервер — ваш собственный, после переноса проверьте записи SPF, DKIM и DMARC: порядок описан в статьях про HestiaCP и про Mailcow. В Mailcow перенос можно настроить прямо в панели: задания синхронизации используют тот же imapsync.
Частые проблемы
Authentication failed. Неверный пароль, отключён доступ по IMAP или требуется пароль приложения.- Письма дублируются при повторном запуске. Сервер изменяет заголовки писем. Добавьте
--useheader 'Message-Id', чтобы письма сравнивались только по идентификатору. - Папки с кириллицей отображаются неправильно. Запустите сначала с
--dry --justfoldersи при необходимости задайте соответствие ключом--f1f2. - Перенос обрывается. Просто запустите команду повторно: imapsync продолжит с места остановки.
- Не хватает места. Проверьте квоту ящика на новом сервере до переноса.
Видеоинструкция



