mccb

Fonctionnalités

Ce que mccb fait de vos boîtes aux lettres

Une image, deux services : web (tableau de bord et API, port 22362) et worker (file de tâches). L'état tient dans SQLite et des fichiers dans ./data.

Sources et cibles

  • Sources

    Fichiers PST et OST, Exchange sur site (EWS), Microsoft 365 (Graph), Google Workspace, IMAP, JMAP, CalDAV et CardDAV, et fichiers : mbox, Maildir, EML, MSG, ICS et VCF.

  • Cibles

    IMAP, CalDAV, CardDAV, JMAP et Exchange (EWS ou Graph). Toutes les sources ne sont pas aussi des cibles : Google, PST et les fichiers sont des sources en lecture seule.

  • E-mails, agendas, contacts et tâches

    Les tâches vont là où la cible peut les accueillir : Exchange, ou un agenda CalDAV qui accepte VTODO.

  • Un seul identifiant pour de nombreuses boîtes

    L'usurpation d'identité Exchange, Graph en mode application seule et un utilisateur maître IMAP atteignent chaque boîte avec un seul compte de votre côté.

  • Le plus récent d'abord

    Les e-mails sont importés du plus récent au plus ancien, tous dossiers confondus.

  • De serveur à serveur

    Aucun fichier nécessaire : IMAP vers IMAP, ou Exchange, Microsoft 365 et Google vers n'importe quel serveur IMAP, pendant que les gens continuent de travailler.

  • Règles de messagerie

    Les règles de boîte de réception Exchange sont converties en Sieve au mieux, puis envoyées par ManageSieve ou proposées sous forme de script.

L'interface

  • Quatre endroits

    Migrations, Fichiers, Serveurs et Réglages, dans une barre latérale sur ordinateur et une barre du haut sur téléphone. Neuf langues.

  • Les serveurs d'abord

    Choisissez le fournisseur (Gmail, Microsoft 365, iCloud, Fastmail, Infomaniak ou n'importe quel serveur IMAP) et le formulaire se remplit tout seul, avec ce que le fournisseur demande. Chaque serveur indique s'il est vérifié.

  • Un formulaire par migration

    De : un fichier ou un serveur en ligne, configuré et testé sur place. Vers : le serveur et la boîte.

  • Un panneau qui dit ce qui vient ensuite

    Chaque boîte affiche sa source, sa destination et ce qu'il faut copier, marquée prête ou non, avec un bouton de démarrage qui indique ce qui manque.

  • L'état en toutes lettres

    Chaque état est une icône et un mot, jamais une couleur seule. Ce qui demande votre action vient en premier dans la liste.

Amener les fichiers

  • File d'envoi

    Un fichier à la fois par défaut, dans l'ordre de votre choix. Réordonnez, mettez en pause, reprenez ou annulez.

  • Envois avec reprise

    Les gros fichiers sont envoyés par morceaux, chacun vérifié en SHA-256. L'espace libre est vérifié d'abord.

  • Dossier de dépôt

    Copiez des fichiers dans un dossier du serveur avec rsync ou un montage, et le worker les prend en charge.

  • Récupération côté serveur

    Le serveur télécharge lui-même le fichier en HTTP(S), SFTP ou depuis un service compatible S3.

  • Aperçu

    Voyez les accents et les pièces jointes avant toute écriture.

Planifier et contrôler

  • Essai à blanc

    Se connecte, liste et compte, et n'écrit rien sur aucune cible. Il prévient en cas de quota insuffisant ou de messages trop gros.

  • Correspondance des dossiers et filtres

    Associez des dossiers, excluez des dossiers, et filtrez par date ou par taille maximale, par serveur ou par boîte.

  • Horaires et bande passante

    Plages horaires autorisées et limite de bande passante par serveur.

  • Lots

    Des lots nommés, avec des actions groupées et un ordre de file.

  • Resynchronisation finale et comparaison

    Un dernier passage pour les nouveaux messages IMAP au moment de la bascule, et une comparaison source et cible en CSV et dans le rapport.

Conçu pour les lots

  • Boîtes par CSV

    Ajoutez les boîtes une par une, ou par CSV (email;password[;login]). L'export ne contient jamais de mot de passe.

  • Ligne de commande et jetons d'API

    La commande mccb envoie avec reprise, lance les migrations et les suit, sans navigateur.

  • Notifications

    Vous préviennent quand les envois, analyses et migrations se terminent, par ntfy, webhook ou e-mail.

  • Rapports

    Progression en direct, journal et rapport JSON par boîte.

Interruptions sans risque

  • Reprendre sans doublons

    Pause, arrêt, plantage ou redémarrage : une reprise interroge le serveur et ne duplique jamais un message.

  • Des plantages contenus

    Chaque tâche et chaque analyse de PST tourne dans son propre sous-processus : un plantage de la bibliothèque PST native ne peut pas faire tomber le worker.

  • Contrôles

    Après la phase des e-mails, le nombre de messages de chaque dossier est comparé à ce qui a été envoyé, et un échantillon de messages est relu et comparé par empreinte. Sur une cible Exchange, seul le nombre est vérifié.

L'exploitation

  • Réglage

    Réglage automatique ou manuel des constructeurs de messages et des connexions IMAP, par serveur.

  • Mots de passe des boîtes

    Stockés chiffrés. L'application peut les déchiffrer : protégez donc ./data et la SECRET_KEY.

  • Sauvegarde

    Tout est dans ./data, y compris secret.key : sans lui, les mots de passe de boîtes enregistrés ne peuvent plus être déchiffrés.

Ce qu'il ne fait pas

  • Avoir tourné sur un vrai Exchange ou Google, pour l'instant

    Les connecteurs Exchange, Microsoft 365 et Google n'ont été testés que contre des serveurs simulés. Essayez d'abord une boîte avec peu d'éléments.

  • Conserver la date de réception sur Microsoft 365

    Un e-mail écrit via Graph reçoit la date de l'import. IMAP avec OAuth2 comme cible la conserve.

  • Écrire les participants discrètement sur Microsoft 365

    Graph envoie un e-mail à chaque participant d'un événement qu'il crée. Par défaut, les participants sont écrits en texte dans le corps de l'événement. Les organisateurs et les réponses ne sont pas conservés sur une cible Exchange.

  • Migrer les boîtes d'archive via Graph

    Les archives Microsoft 365 ne sont pas accessibles. Déplacez d'abord leur contenu dans la boîte principale.

  • Agendas JMAP

    Non implémenté. Utilisez CalDAV pour les agendas d'un fournisseur JMAP.

  • Tout copier

    Les pièces jointes des événements et les photos de contacts ne sont pas copiées. Les corps des événements, contacts et tâches sont en texte brut.

  • Rester synchronisé

    Une migration copie dans un seul sens. Une dernière resynchronisation, lancée à la main, ajoute ce qui est arrivé depuis, mais une modification ou une suppression faite à la source après sa copie n'est pas reportée.

  • Lire tous les fichiers

    Un Maildir ou un dossier de messages doit être zippé. Un .msg est converti au mieux, sans les corps en RTF seul, les messages intégrés ni les objets OLE.

  • Plusieurs administrateurs

    Un seul administrateur : un mot de passe partagé, ni comptes ni rôles. Les jetons d'API n'expirent pas, révoquez-les à la main.

  • Plusieurs hôtes

    SQLite sur un disque local : un seul hôte, pas de haute disponibilité, pas de NFS.

  • Les PST chiffrés

    Les PST chiffrés ou protégés par mot de passe n'ont aucun traitement dédié. Ils donnent des erreurs ou sont marqués invalides. Ne comptez pas dessus.

  • Résister à tous les PST corrompus

    Un PST corrompu peut faire planter libpff. Les éléments touchés sont ignorés et signalés, et au-delà de MAX_CHILD_CRASHES plantages, la tâche échoue.

  • Garantir l'envoi des notifications

    L'envoi se fait au mieux : trois essais, puis le message est abandonné. Un sujet ntfy public peut être lu par quiconque en connaît le nom.

  • HTTPS

    Le port 22362 parle en HTTP simple. Placez mccb derrière un reverse proxy et n'exposez pas ce port directement.

  • D'autres architectures

    L'image publiée est pour linux/amd64 uniquement.

  • Tout décoder parfaitement

    Les éléments sans information de jeu de caractères peuvent être mal décodés dans certaines langues.

  • Compenser le serveur cible

    Les résultats dépendent du serveur cible IMAP, DAV, JMAP ou Exchange.

Lancer mccb

Ouvrez http://<host>:22362 et connectez-vous avec le mot de passe affiché. Il n'apparaît qu'une fois. Les détails sont dans la documentation.

$ 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"