mccb

Возможности

Что mccb делает с вашими ящиками

Один образ, два сервиса: web (панель и API, порт 22362) и worker (очередь заданий). Состояние хранится в SQLite и файлах в ./data.

Источники и цели

  • Источники

    Файлы PST и OST, локальный Exchange (EWS), Microsoft 365 (Graph), Google Workspace, IMAP, JMAP, CalDAV и CardDAV, а также файлы: mbox, Maildir, EML, MSG, ICS и VCF.

  • Цели

    IMAP, CalDAV, CardDAV, JMAP и Exchange (EWS или Graph). Не каждый источник можно использовать и как цель: Google, PST и файлы доступны только как источники для чтения.

  • Почта, календари, контакты и задачи

    Задачи попадают туда, где цель может их хранить: в Exchange или в календарь CalDAV, принимающий VTODO.

  • Одни учётные данные для многих ящиков

    Имперсонация Exchange, Graph app-only и мастер-пользователь IMAP дают доступ ко всем ящикам с одной вашей учётной записью.

  • Сначала новые

    Почта импортируется от новых к старым, по всем папкам.

  • От сервера к серверу

    Файл не нужен: IMAP в IMAP либо Exchange, Microsoft 365 и Google в любой сервер IMAP, пока люди продолжают работать.

  • Почтовые правила

    Правила входящих Exchange по возможности преобразуются в Sieve и загружаются по ManageSieve или предлагаются в виде скрипта.

Интерфейс

  • Четыре места

    Migrations, Files, Servers и Settings: боковая панель на компьютере и верхняя на телефоне. Девять языков.

  • Сначала серверы

    Выберите провайдера (Gmail, Microsoft 365, iCloud, Fastmail, Infomaniak или любой сервер IMAP), и форма заполнится сама, с тем, что требует провайдер. Для каждого сервера видно, проверен ли он.

  • Одна форма на миграцию

    Откуда: файл или работающий сервер, настроенный и проверенный на месте. Куда: сервер и ящик.

  • Панель, которая подсказывает, что дальше

    Для каждого ящика показаны источник, назначение и что копировать, с пометкой «готов» или «не готов», и кнопка запуска, которая сообщает, чего не хватает.

  • Состояние словами

    Каждое состояние обозначено значком и словом, а не только цветом. То, что требует вашего внимания, стоит в списке первым.

Загрузка файлов

  • Очередь загрузки

    По умолчанию по одному файлу за раз, в выбранном вами порядке. Меняйте порядок, приостанавливайте, возобновляйте или отменяйте.

  • Возобновляемая загрузка

    Большие файлы загружаются частями, каждая проверяется по SHA-256. Свободное место проверяется заранее.

  • Папка загрузки

    Скопируйте файлы в папку сервера через rsync или смонтированный том, и worker их подхватит.

  • Загрузка на стороне сервера

    Сервер сам скачивает файл по HTTP(S), SFTP или из S3-совместимого сервиса.

  • Предпросмотр

    Посмотрите акценты и вложения до любой записи.

Планирование и управление

  • Пробный запуск

    Подключается, перечисляет и считает, ничего не записывая в цели. Предупреждает о квоте и слишком больших письмах.

  • Сопоставление папок и фильтры

    Сопоставляйте папки, исключайте папки и фильтруйте по дате или максимальному размеру для сервера или отдельного ящика.

  • Часы и пропускная способность

    Разрешённые часы и ограничение пропускной способности для каждого сервера.

  • Партии

    Именованные партии с групповыми действиями и порядком очереди.

  • Финальная повторная синхронизация и сравнение

    Последний проход за новыми письмами IMAP при переключении и сравнение источника и цели в виде CSV и в отчёте.

Рассчитано на партии

  • Ящики через CSV

    Добавляйте ящики по одному или через CSV (email;password[;login]). Экспорт никогда не содержит пароль.

  • Командная строка и API-токены

    Команда mccb загружает с возобновлением, запускает миграции и следит за ними, без браузера.

  • Уведомления

    Уведомляйте о завершении загрузок, анализов и миграций через ntfy, webhook или e-mail.

  • Отчёты

    Ход выполнения, журнал и отчёт JSON для каждого ящика в реальном времени.

Можно безопасно прервать

  • Возобновление без дубликатов

    Пауза, остановка, сбой или перезапуск: возобновление проверяет сервер и никогда не дублирует письма.

  • Сбои остаются изолированными

    Каждое задание и каждый анализ PST выполняются в отдельном подпроцессе, поэтому сбой нативной библиотеки PST не может остановить worker.

  • Проверки

    После этапа почты число писем в каждой папке сравнивается с отправленным, а выборка писем считывается обратно и сравнивается по хешу. Для целей Exchange письма только подсчитываются.

Эксплуатация

  • Настройка

    Автоматическая или ручная настройка сборщиков писем и соединений IMAP для каждого сервера.

  • Пароли ящиков

    Хранятся в зашифрованном виде. Приложение может их расшифровать, поэтому защитите ./data и SECRET_KEY.

  • Резервное копирование

    Всё хранится в ./data, включая secret.key: без него сохранённые пароли ящиков не расшифровать.

Чего он не делает

  • Запуск на реальном Exchange или Google пока не выполнялся

    Коннекторы Exchange, Microsoft 365 и Google проверены только на имитированных серверах. Сначала попробуйте один ящик с небольшим числом элементов.

  • Сохранять дату получения в Microsoft 365

    Письмам, записанным через Graph, ставится дата импорта. IMAP с OAuth2 в качестве цели её сохраняет.

  • Тихо записывать участников в Microsoft 365

    Graph рассылает письма всем участникам создаваемого им события. По умолчанию участники записываются текстом в тело события. Организаторы и ответы в цели Exchange не сохраняются.

  • Миграция архивных ящиков через Graph

    Архивы Microsoft 365 недоступны. Сначала перенесите их содержимое в основной ящик.

  • Календари JMAP

    Не реализовано. Для календарей провайдера JMAP используйте CalDAV.

  • Копировать всё

    Вложения событий и фотографии контактов не копируются. Тела событий, контактов и задач передаются простым текстом.

  • Оставайтесь синхронизированными

    Миграция копирует в одну сторону. Финальная повторная синхронизация, запущенная вручную, добавляет то, что пришло с тех пор, но изменение или удаление в источнике после копирования не переносится.

  • Читайте каждый файл

    Maildir или папку с письмами нужно упаковать в zip. Файл .msg конвертируется по возможности: тела только в RTF, вложенные письма и объекты OLE не поддерживаются.

  • Несколько администраторов

    Один администратор: общий пароль, без учётных записей и ролей. API-токены не истекают, отзывайте их вручную.

  • Несколько хостов

    SQLite на локальном диске: один хост, без высокой доступности, без NFS.

  • Зашифрованные PST

    Для зашифрованных или защищённых паролем PST специальной обработки нет. Они выдают ошибки или помечаются как недействительные. Не рассчитывайте на это.

  • Переживите любой повреждённый PST

    Повреждённый PST может обрушить libpff. Затронутые элементы пропускаются и попадают в отчёт, а при превышении MAX_CHILD_CRASHES сбоев задание завершается ошибкой.

  • Гарантированная доставка уведомлений

    Доставка уведомлений выполняется по возможности: три попытки, затем сообщение отбрасывается. Публичную тему ntfy может прочитать любой, кто знает её имя.

  • HTTPS

    Порт 22362 работает по простому HTTP. Поставьте mccb за обратный прокси и не открывайте порт напрямую.

  • Другие архитектуры

    Опубликованный образ только для linux/amd64.

  • Декодируйте всё идеально

    У элементов без информации о кодировке в некоторых языках декодирование может быть неточным.

  • Компенсация особенностей целевого сервера

    Результат зависит от целевого сервера IMAP, DAV, JMAP или Exchange.

Запустите mccb

Откройте http://:22362 и войдите с выведенным паролем. Он показывается один раз. Подробности в документации.

$ mkdir mccb && cd mccb
$ curl -fsSLO https://raw.githubusercontent.com/selfhostr/mccb/main/docker-compose.yml
$ docker compose up -d
$ docker compose logs web | grep -A2 "Admin password"