Cómo funciona MakiSend en Cloudflare
Un Worker, una base de datos, una cola y un workflow duradero. Nada que mantener en marcha, todo en tu propia cuenta de Cloudflare.
Sigue un correo
Elige qué ocurre en tu proveedor SMTP y envía. Cada parada es un producto de Cloudflare.
- Tu appPOST /send-email
- WorkerWorkers
- Base de datosD1
- ColaQueues
- WorkflowWorkflows
- Tu SMTPTCP sockets
- Bandeja de entradaEntregado
- Mensajes fallidosQueues (DLQ)
Pulsa Enviar para seguir un correo.
Los productos de Cloudflare que lo hacen posible
Workers (documentación de Cloudflare, se abre en una pestaña nueva)
Un solo Worker lo ejecuta todo: la API Hono, el inicio de sesión, el panel y el código de entrega.
nodejs_compat permite que nodemailer y su cliente SMTP funcionen sin cambios. Sin servidor, sin contenedor.
Static Assets (documentación de Cloudflare, se abre en una pestaña nueva)
Sirve el panel (un build de Astro) desde el mismo Worker, en el mismo origen que la API.
Mismo origen significa sin CORS y una sola URL que recordar.
D1 (documentación de Cloudflare, se abre en una pestaña nueva)
La base de datos: registros e historial de correos, contenidos y adjuntos cifrados, configuraciones SMTP, API keys, plantillas, cuentas.
Los destinatarios, los cuerpos, los adjuntos y las credenciales SMTP se cifran con AES-256-GCM antes de escribirse. El esquema lo gestionan las migraciones de Drizzle.
Queues (documentación de Cloudflare, se abre en una pestaña nueva)
Desacopla la API de la entrega: la petición termina en cuanto el id del correo entra en la cola.
Lotes de hasta 10, 3 reintentos del consumidor con 30 segundos de intervalo y luego una cola de mensajes fallidos (makisend-send-email-dlq).
Workflows (documentación de Cloudflare, se abre en una pestaña nueva)
Una ejecución duradera por correo. Su id es el id del correo, así que dos ejecuciones nunca pueden enviar el mismo correo dos veces.
4 intentos SMTP, con 30 segundos de intervalo, que sobreviven a los reinicios. Los errores permanentes (auth, TLS, DNS, 5xx) se detienen en el acto. Cada paso queda escrito en el historial del correo.
TCP sockets (documentación de Cloudflare, se abre en una pestaña nueva)
El propio Worker abre la conexión SMTP con tu proveedor, sobre TLS.
Puertos 465, 587, 2465, 2525 y 2587. Cloudflare bloquea el puerto 25. Las conexiones salen desde IPs compartidas de Cloudflare.
Email Service (documentación de Cloudflare, se abre en una pestaña nueva)
Una alternativa a SMTP: las configuraciones en smtp.mx.cloudflare.net envían a través del binding send_email del Worker.
No hace falta contraseña SMTP; la dirección del remitente debe usar un dominio incorporado a Cloudflare Email Sending.
Cron Triggers (documentación de Cloudflare, se abre en una pestaña nueva)
Tareas en segundo plano sin servicio adicional: comprobaciones de estado, la búsqueda de actualizaciones y la rotación de claves.
Cada día a las 03:17 UTC y cada hora en el minuto 17 (ver abajo).
Workers Logs (documentación de Cloudflare, se abre en una pestaña nueva)
Registros de peticiones e invocaciones del Worker, en tu panel de Cloudflare.
Activado en wrangler.jsonc. El contenido de los correos nunca se registra.
Qué se ejecuta de forma programada
- Cada día, 03:17 UTC
- Prueba cada configuración SMTP y guarda el resultado, y luego busca en GitHub una nueva versión de MakiSend (salvo que UPDATE_CHECK esté desactivado).
- Cada hora, minuto 17
- Rotación de claves: vuelve a cifrar, en lotes pequeños, los datos guardados que siguen bajo una ENCRYPTION_KEY anterior.
Lo que debes saber antes de depender de ello
- Sin IP de salida fija: un proveedor que exige una lista de IPs permitidas rechazará los envíos desde un Worker.
- El envío es asíncrono: el 202 significa en cola, no entregado. El resultado está en los registros y en el panel.
- Un proveedor SMTP por configuración, sin conmutación automática por error. Todavía no hay seguimiento de rebotes, aperturas ni clics.
- La entregabilidad depende de tu dominio de envío (SPF, DKIM, DMARC) y de tu proveedor, no de Cloudflare.
El diseño completo, el modelo de datos y los diagramas están en el README y en docs/ARCHITECTURE.md.