Бекап Яндекс 360 в обычную папку: почта, Диск, контакты и календарь
Думаю, не надо объяснять, зачем эта программа, в связи с недавней обстановкой. Почта компании лежит у одного провайдера, и своей копии этих данных у большинства нет. Мне нужна была такая копия: полная, на моём диске и в формате, который откроется без Яндекса и без моей программы.
Готового инструмента под эту задачу я не нашёл, поэтому сделал свой. Называется MailBackup, работает под Windows, бесплатный. Ниже расскажу, что он умеет, как устроен и где у него слабые места.

Что нужно было получить
Требования я сформулировал так:
Сохранять все четыре вида данных: письма, файлы Диска, контакты, календарь.
Работать со списком ящиков. Загрузил файл с адресами и паролями, нажал кнопку, ушёл.
Переживать обрывы. Первый бекап большого ящика идёт часами, и за это время обязательно что‑нибудь отвалится. После перезапуска программа должна продолжить, а не начать сначала и не наплодить дублей.
Хранить архив в открытом виде, чтобы его можно было залить в другой почтовый сервер.
Почему не один rclone
Первая мысль была взять rclone и не писать ничего. Для файлов это и правда лучший вариант: Диск отдаётся по WebDAV, rclone умеет его синхронизировать и делает это надёжно.
Но почту rclone не забирает вообще. Письма доступны по IMAP, контакты по CardDAV, календарь по CalDAV. Это три разных протокола, и для каждого нужен свой загрузчик. В итоге получилось так:
Данные | Протокол | Чем забирается | Что лежит в архиве |
|---|---|---|---|
Письма | IMAP | свой загрузчик на MailKit |
|
Файлы Диска | WebDAV | rclone | файлы как есть |
Контакты | CardDAV | свой загрузчик |
|
Календарь | CalDAV | свой загрузчик |
|
rclone идёт в комплекте, отдельно его ставить не надо.
Пароли приложений
Яндекс не пускает сторонние программы по обычному паролю. Нужен пароль приложения, причём на каждый вид данных свой: «Почта», «Файлы», «Контакты», «Календарь». Пароль от почты к Диску не подойдёт.
На этом я споткнулся в первой версии, где у ящика был один пароль. Пришлось переделать: теперь у ящика до четырёх паролей, и программа сохраняет только те части, для которых пароль задан. Не нужен Диск, значит, пароль «Файлы» просто не создаёте.
Список ящиков загружается из CSV:
адрес;пароль почты;пароль файлов;пароль контактов;пароль календаря ivanov@company.ru;abcdabcdabcdabcd;efghefghefghefgh;ijklijklijklijkl;mnopmnopmnopmnop petrov@company.ru;qwerqwerqwerqwer;;;
После импорта пароли шифруются через Windows DPAPI и привязываются к учётной записи Windows. Исходный файл можно и нужно удалить.
Как устроена докачка
Это была главная часть задачи, поэтому подробнее.
У каждого письма в папке IMAP есть номер (UID), который не меняется. Программа ведёт базу SQLite, где записано, какие UID каждой папки уже лежат в архиве. При запуске она запрашивает у сервера список UID, сравнивает с базой и скачивает только разницу.
Письмо сначала пишется во временный файл, потом переименовывается. Запись в базе появляется только после этого. Если процесс убили посреди скачивания, в архиве не остаётся обрезанных писем, а в базе нет записей о файлах, которых не существует. Следующий запуск просто скачает это письмо заново.
Для контактов и событий работает тот же принцип, только вместо UID сравниваются метки версий (ETag), которые отдаёт сервер. Изменилось событие, скачивается заново. Не изменилось, пропускается. Файлы сверяет сам rclone.
Ошибка в одном ящике не останавливает остальные. Неверный пароль у календаря не мешает сохранить почту того же ящика.
Восстановление
Бекап, из которого нельзя восстановиться, ничего не стоит, поэтому обратная дорога тоже есть. Письма загружаются по IMAP с папками, отметками о прочтении и датами, файлы по WebDAV, контакты и события по CardDAV и CalDAV.
Восстанавливать можно в тот же ящик, в другой ящик Яндекса или на любой сервер с этими протоколами. Последнее и было целью пункта про открытый формат: архив не привязан к Яндексу.
На сервере назначения ничего не удаляется и не перезаписывается. Повторный запуск не создаёт дублей: программа помнит, что уже загружено.
Есть массовый режим: список «откуда, куда, пароли» в CSV, и ящики восстанавливаются параллельно.
Что ещё есть
Расписание. Создаётся задача в Планировщике Windows: каждый день, по дням недели, раз в месяц или каждые несколько часов. Можно запускать и без входа пользователя в систему, это нужно для серверов.
Уведомления. Письмо после бекапа или только при ошибках. Отдельно приходит письмо, если бекап вообще не смог стартовать, например пропала сетевая папка. Тишина в почте не должна означать, что всё хорошо.
Хранение. По умолчанию из архива ничего не удаляется: письмо, стёртое в ящике, в архиве остаётся. Можно включить снимки на дату. Они делаются жёсткими ссылками, так что десять снимков не занимают десять объёмов архива.
Проверка архива. При скачивании у каждого письма считается SHA-256. Отдельная команда перечитывает архив и сверяет суммы. Битый сектор или случайно удалённая папка находятся сразу, а не в день, когда архив понадобился.

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

Консоль. Вместе с окном ставится mailbackup-cli.exe, все операции доступны из командной строки.
Чего программа не умеет
Список честный, чтобы не было сюрпризов.
Правила обработки писем, подписи и настройки ящика не сохраняются. Через IMAP их не достать.
Контрольные суммы считаются только для писем. Файлы Диска копирует rclone, и своей проверки по ним нет.
Пароли привязаны к пользователю Windows. Перенесли программу на другой компьютер, вводите пароли заново. Архив при этом переносится свободно.
Установочник не подписан. Windows покажет предупреждение о неизвестном издателе.
Только Windows.
Из чего сделано
C# и.NET 8, окно на WPF, почта через MailKit, состояние в SQLite, файлы через rclone, установщик на WiX.
Где взять
Установочник и инструкция: github.com/sergheevmddev/MailBackup
Буду рад замечаниям и сообщениям об ошибках, особенно от тех, у кого ящиков много. Пишите в Issues на GitHub или в комментарии.


