Comment MakiSend fonctionne sur Cloudflare
Un Worker, une base de données, une file d’attente et un workflow durable. Rien à maintenir en marche, le tout sur votre propre compte Cloudflare.
Suivez un e-mail
Choisissez ce qui se passe chez votre fournisseur SMTP, puis envoyez. Chaque étape est un produit Cloudflare.
- Votre appPOST /send-email
- WorkerWorkers
- Base de donnéesD1
- File d’attenteQueues
- WorkflowWorkflows
- Votre SMTPTCP sockets
- Boîte de réceptionDélivré
- Lettres mortesQueues (DLQ)
Appuyez sur Envoyer pour suivre un e-mail.
Les produits Cloudflare derrière MakiSend
Workers (documentation Cloudflare, s’ouvre dans un nouvel onglet)
Un seul Worker fait tout tourner : l’API Hono, la connexion, le tableau de bord et le code d’envoi.
nodejs_compat permet à nodemailer et à son client SMTP de tourner sans modification. Pas de serveur, pas de conteneur.
Static Assets (documentation Cloudflare, s’ouvre dans un nouvel onglet)
Sert le tableau de bord (un build Astro) depuis le même Worker, sur la même origine que l’API.
Même origine, donc pas de CORS et une seule URL à retenir.
D1 (documentation Cloudflare, s’ouvre dans un nouvel onglet)
La base de données : logs et historique des e-mails, contenus et pièces jointes chiffrés, configurations SMTP, clés API, modèles, comptes.
Les destinataires, les contenus, les pièces jointes et les identifiants SMTP sont chiffrés en AES-256-GCM avant d’être écrits. Le schéma est géré par les migrations Drizzle.
Queues (documentation Cloudflare, s’ouvre dans un nouvel onglet)
Découple l’API de l’envoi : la requête se termine dès que l’id de l’e-mail est en file d’attente.
Lots de 10 au plus, 3 relances du consommateur à 30 secondes d’intervalle, puis une file de lettres mortes (makisend-send-email-dlq).
Workflows (documentation Cloudflare, s’ouvre dans un nouvel onglet)
Une exécution durable par e-mail. Son id est celui de l’e-mail, donc deux exécutions ne peuvent jamais envoyer le même e-mail deux fois.
4 tentatives SMTP, à 30 secondes d’intervalle, qui survivent aux redémarrages. Les erreurs permanentes (auth, TLS, DNS, 5xx) s’arrêtent aussitôt. Chaque étape est écrite dans l’historique de l’e-mail.
TCP sockets (documentation Cloudflare, s’ouvre dans un nouvel onglet)
Le Worker ouvre lui-même la connexion SMTP vers votre fournisseur, en TLS.
Ports 465, 587, 2465, 2525 et 2587. Le port 25 est bloqué par Cloudflare. Les connexions partent d’IP Cloudflare partagées.
Email Service (documentation Cloudflare, s’ouvre dans un nouvel onglet)
Une alternative à SMTP : les configurations sur smtp.mx.cloudflare.net envoient via le binding send_email du Worker.
Pas de mot de passe SMTP ; l’adresse d’expéditeur doit utiliser un domaine ajouté à Cloudflare Email Sending.
Cron Triggers (documentation Cloudflare, s’ouvre dans un nouvel onglet)
Des tâches de fond sans service supplémentaire : contrôles de santé, vérification des mises à jour et rotation des clés.
Chaque jour à 03:17 UTC et chaque heure à la minute 17 (voir plus bas).
Workers Logs (documentation Cloudflare, s’ouvre dans un nouvel onglet)
Les logs de requêtes et d’invocations du Worker, dans votre tableau de bord Cloudflare.
Activés dans wrangler.jsonc. Le contenu des e-mails n’est jamais journalisé.
Ce qui tourne à heure fixe
- Chaque jour, 03:17 UTC
- Teste chaque configuration SMTP et enregistre le résultat, puis vérifie sur GitHub si une nouvelle version de MakiSend est sortie (sauf si UPDATE_CHECK est désactivé).
- Chaque heure, minute 17
- Rotation des clés : rechiffre, par petits lots, les données stockées encore sous une ancienne ENCRYPTION_KEY.
À savoir avant de compter dessus
- Pas d’IP sortante fixe : un fournisseur qui exige une liste d’IP autorisées refusera les envois depuis un Worker.
- L’envoi est asynchrone : le 202 signifie en file d’attente, pas délivré. Le résultat est dans les logs et le tableau de bord.
- Un fournisseur SMTP par configuration, sans bascule automatique. Pas encore de suivi des rebonds, ouvertures ou clics.
- La délivrabilité dépend de votre domaine d’envoi (SPF, DKIM, DMARC) et de votre fournisseur, pas de Cloudflare.
La conception complète, le modèle de données et les schémas sont dans le README et dans docs/ARCHITECTURE.md.