MAILROOM : la boîte mail self-hosted où l’agent rédige et vous validez
⏱️ Temps de lecture estimé : 4 minutes
https://github.com/wong2/cf-mailroom
📌 MAILROOM est une application web self-hosted qui fait tourner une boîte mail façon Gmail sur l’infrastructure Cloudflare, où un agent IA rédige les réponses et vous laisse le bouton d’envoi.
Une adresse de support sur son propre domaine, c’est un problème qui se dédouble vite. Soit on delve dans Postfix, Dovecot et les listes antispam à mettre à jour le dimanche soir. Soit on confie la boîte à un service tiers et on y laisse ses conversations clients. Mailroom prend la troisième voie : garder l’interface à laquelle on est habitué, et remplacer toute la partie serveur par des briques Cloudflare déjà louées.
Le pari est simple : la boîte mail est à vous, le serveur est fait de briques Cloudflare. Un seul Worker sert la web app React, le gestionnaire d’email entrant, la file de rédaction et le serveur MCP. D1 stocke les conversations, R2 garde le MIME brut et les pièces jointes, Queues orchestre les générations, Workers AI sert au classement. Email Routing pour recevoir, Email Sending pour répondre, Web Push pour les notifications. Aucun serveur Linux à patcher.
- 📥 Plusieurs adresses et domaines dans un seul espace de travail
- 📝 Brouillon rédigé par l’agent, envoyé uniquement après votre clic
- 🏷️ Labels automatiques en langage naturel, posés à la réception seulement
- 🔁 Fil de discussion RFC, conversation archivée rouverte par un nouveau mail
- 🛡️ Tentatives d’envoi durables : un double-clic ne renvoie pas deux mails
- 🔌 Serveur MCP intégré, avec de vrais scopes
inbox.readetinbox.send
Le point le plus défendable du projet : l’IA n’envoie rien. La rédaction automatique est désactivée par défaut, se règle par boîte de réception, et même activée elle s’arrête sur votre approbation. Chaque nouveau message reçu déclenche une Draft Run réessayable dans une queue Cloudflare, et une Draft Run dépassée ne peut pas écraser un brouillon plus récent. Les expéditeurs auto-soumis — RFC 3834, Precedence: bulk, listes — sont signalés et ne reçoivent jamais de réponse automatique. Les pièces jointes plafonnent à 3 Mo, sont déposées dans R2, et les réponses privilégient le Reply-To de l’expéditeur.
L’angle MCP est moins spectaculaire, mais c’est ce qui rend le projet adressable par un agent. Le serveur tourne dans le même Worker, sur /mcp, et n’expose pas l’API web : il appelle directement les modules métier. Il est son propre serveur d’autorisation OAuth 2.1 : S256 PKCE, jetons d’accès de 15 minutes, rafraîchissement de 30 jours. Cinq outils — list_inboxes, search_conversations, get_conversation, reply_to_conversation, send_email. Les deux outils d’envoi partent immédiatement, exigent une clé d’idempotence stable et sont plafonnés par MCP_DAILY_SEND_LIMIT, 100 par jour et par identité. Une variable mise à false les retire à tous les clients d’un coup. Et comme tout ce qu’un agent écrit arrive dans les mêmes conversations que l’interface web, rien ne devient invisible.
Là, je me fais prudent. Les prérequis sont réels : un domaine dont les DNS sont chez Cloudflare, R2 activé, le plan Workers payant — environ 5 $ par mois — tant qu’Email Sending est en bêta, et un compte Zero Trust, gratuit à cet usage. La documentation le dit sans détour : « This is not a promise of free hosting. » Le bouton de déploiement crée aussi un dépôt à votre nom, et les correctifs d’amont n’arrivent pas tout seuls, il faut aller les chercher avec git remote add upstream. Enfin, le statut de livraison et de bounce dans la conversation reste sur la roadmap : aujourd’hui, c’est dans les journaux Cloudflare qu’on le regarde.
Mon avis tient en une ligne : l’agent prépare, vous décidez. Ce sont des détails peu glorieux — une tentative d’envoi durable, une file qui réessaie, un interrupteur global — qui font la différence entre une boîte mail exploitable et un jouet de démonstration. Et tant qu’un agent connecté en MCP peut écrire dans vos conversations clients, garder un bouton d’envoi manuel n’a plus rien de réactionnaire, c’est de l’hygiène.






