Бекап Яндекс 360 в обычную папку: почта, Диск, контакты и календарь

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

Готового инструмента под эту задачу я не нашёл, поэтому сделал свой. Называется MailBackup, работает под Windows, бесплатный. Ниже расскажу, что он умеет, как устроен и где у него слабые места.

Главное окно
Главное окно

Что нужно было получить

Требования я сформулировал так:

  1. Сохранять все четыре вида данных: письма, файлы Диска, контакты, календарь.

  2. Работать со списком ящиков. Загрузил файл с адресами и паролями, нажал кнопку, ушёл.

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

  4. Хранить архив в открытом виде, чтобы его можно было залить в другой почтовый сервер.

Почему не один rclone

Первая мысль была взять rclone и не писать ничего. Для файлов это и правда лучший вариант: Диск отдаётся по WebDAV, rclone умеет его синхронизировать и делает это надёжно.

Но почту rclone не забирает вообще. Письма доступны по IMAP, контакты по CardDAV, календарь по CalDAV. Это три разных протокола, и для каждого нужен свой загрузчик. В итоге получилось так:

Данные

Протокол

Чем забирается

Что лежит в архиве

Письма

IMAP

свой загрузчик на MailKit

.eml по папкам ящика

Файлы Диска

WebDAV

rclone

файлы как есть

Контакты

CardDAV

свой загрузчик

.vcf, по файлу на контакт

Календарь

CalDAV

свой загрузчик

.ics, по файлу на событие

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 или в комментарии.

Комментарии (2)


  1. ainu
    12.10.2026 07:57

    Вчера пытался диск через rclone получить, отдает ошибку 410 Gone


  1. MEGA_Nexus
    12.10.2026 07:57

    Готового инструмента под эту задачу я не нашёл, поэтому сделал свой.

    Состояние "В порядке" нужно переименовать в "Активен", т.к. этот статут лучше отображает суть состояния.

    А так смотрится визуально красиво. Мне нравится.