Перенесення пошти між серверами за допомогою 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 продовжить із місця зупинки.
- Бракує місця. Перевірте квоту скриньки на новому сервері до перенесення.
Відеоінструкція



