Cloudflare
Email Workers
MIME
Automação
Serverless

Enrutamiento de correo electrónico + Trabajadores: procese correos electrónicos mediante programación en el borde

Enrutar el correo electrónico a un trabajador en lugar de a una dirección de destino cambia por completo lo que puede hacer con el correo electrónico entrante.

Enrutamiento de correo electrónico + Trabajadores: procese correos electrónicos mediante programación en el borde

La mayoría de los tutoriales de enrutamiento de correo electrónico de Cloudflare muestran cómo reenviar contato@seudominio.com a Gmail. Esto resuelve el caso de uso más simple, pero oculta la parte más interesante del servicio. Cuando enrutas un correo electrónico a un trabajador en lugar de a una dirección de destino, el correo electrónico se convierte en datos: lees el remitente, el asunto, los encabezados, el cuerpo completo y decides qué hacer con todo ello dentro de una función de JavaScript que se ejecuta en el borde. Esto cambia significativamente lo que es viable construir sin su propia infraestructura de correo electrónico.

El controlador de correo electrónico y lo que recibes

La estructura básica de un Email Worker utiliza una exportación llamada email dentro del objeto predeterminado:

export default { async email(message, env, ctx) { // message.from — endereço do remetente // message.to — endereço de destino no seu domínio // message.headers — objeto Headers com todos os cabeçalhos RFC 2822 // message.raw — ReadableStream com a mensagem completa } }

message.from y message.to son cadenas con direcciones. message.headers es un objeto de encabezados de API web estándar: accede a message.headers.get('subject') o message.headers.get('x-mailer') de la misma manera que lo haría en un controlador de recuperación. message.raw es un ReadableStream con el mensaje RFC 2822 completo, incluidos encabezados y cuerpo, con soporte para mensajes de hasta 25 MB.

Hay cuatro acciones disponibles: message.forward(address) para reenviar a una dirección verificada, message.reply(response) para responder, message.setReject(reason) para rechazar el mensaje con un mensaje de error o simplemente regresar sin llamar a nada, lo que descarta silenciosamente el mensaje. Puedes combinar: filtrar por remitente, reenviar algunos, rechazar otros y procesar el resto.

La brecha de análisis MIME

Este es el punto que la documentación menciona discretamente: no hay un analizador MIME incorporado. message.raw te ofrece la transmisión sin formato. Si desea extraer el asunto con codificación UTF-8, el cuerpo en texto plano, el HTML alternativo o los archivos adjuntos, debe analizar el MIME usted mismo o utilizar una biblioteca.

postal-mime funciona bien en el entorno de trabajadores. El valor predeterminado es consumir la secuencia, convertirla a ArrayBuffer y pasarla al analizador:

import PostalMime from 'postal-mime'; const raw = await new Response(message.raw).arrayBuffer(); const parsed = await new PostalMime().parse(raw); // parsed.subject, parsed.text, parsed.html, parsed.attachments

parsed.attachments es una matriz de objetos con filename, mimeType y content (ArrayBuffer). Puede guardar el contenido en un depósito R2, extraer metadatos de un NF-e en XML o pasar un PDF a una API de extracción. El tiempo de ejecución de Workers admite esto sin ninguna configuración adicional más que importar la biblioteca.

El costo de consumir todo el flujo es la memoria. Para mensajes con archivos adjuntos grandes cercanos al límite de 25 MB, está cargando todo en la memoria del Worker. En la mayoría de los casos esto no es un problema, pero en tuberías de gran volumen vale la pena monitorear.

Patrones que tiene sentido construir aquí

Creación automática de tickets de soporte. Llega el correo electrónico, extraes el remitente, el asunto y el cuerpo, ensamblas una carga útil y la PUBLICAS en Linear API, Zendesk, Notion o cualquier herramienta que utilice tu equipo. El ticket ahora aparece con el contexto completo sin que nadie tenga que copiarlo y pegarlo. Para los equipos que reciben solicitudes por correo electrónico pero trabajan con herramientas de seguimiento de problemas, esto elimina un paso manual constante.

Captura de facturas y documentos fiscales. Usted crea una dirección dedicada (nfe@seudominio.com) y cualquier proveedor que envía NF-e por correo electrónico procesa automáticamente el archivo adjunto XML o PDF: metadatos extraídos, archivo guardado en R2, registro creado en D1. El trabajador hace lo que haría un humano, pero sin tener que abrir el correo electrónico.

Filtrar antes de reenviar. Con el modo general activo, *@seudominio.com captura el spam enviado a direcciones aleatorias en su dominio. Un trabajador puede comparar al remitente con una lista de dominios problemáticos conocidos almacenados en el KV, comprobar si el asunto contiene patrones típicos de spam y llamar al message.setReject('spam detectado') antes de reenviarlo a su bandeja de entrada. No es un filtro de spam completo, pero reduce el ruido sin coste adicional.

Alertas y notificaciones reformateadas. Las herramientas de monitoreo (Grafana, PagerDuty, herramientas CI) envían alertas por correo electrónico en formatos que no siempre son legibles en un teléfono. Un trabajador intercepta estos correos electrónicos, extrae la información relevante del cuerpo y publica un mensaje formateado en un canal de Slack o Discord a través de un webhook. El correo electrónico original se puede descartar o reenviar como archivo.

Lo que no funciona como crees

message.reply() existe y funciona, pero la respuesta viene de noreply@cloudflare.com. Si desea que el destinatario reciba una respuesta automática que parece provenir de suporte@seudominio.com, el trabajador debe llamar a un servicio SMTP saliente (Reenviar, Mailgun, SES) pasando los encabezados necesarios. Email Routing no tiene acceso al flujo saliente de su dominio.

Si el trabajador genera una excepción no detectada, el correo electrónico se rechaza con el error 500. No hay reintento automático ni cola de mensajes fallidos. Cualquier lógica que pueda fallar necesita try/catch con respaldo explícito, generalmente un message.forward() a una dirección de clasificación manual cuando algo sale mal en el procesamiento. Descubrir este comportamiento en producción, con correos electrónicos de clientes rechazados, es una experiencia desagradable.

¿Dónde tiene sentido ir más allá del reenvío?

Si para usted el enrutamiento de correo electrónico es solo un alias para Gmail, nunca tocará a los trabajadores y no es necesario que lo haga. Pero si su equipo ya utiliza Workers para otros fines (API, trabajos cron, integraciones), Email Worker encaja en la misma infraestructura con los mismos enlaces KV, D1, R2 y servicios externos. No estás agregando una nueva pieza a la pila; está agregando un tipo de desencadenador a un entorno que ya existe.

El momento adecuado para detener el reenvío simple es cuando notas que alguien del equipo abre correos electrónicos para copiar información a otro sistema más de una o dos veces por semana. Si el patrón es repetible y los datos están en el correo electrónico, el Trabajador lo resuelve en menos tiempo del que consumirá la tarea manual en un mes.

Lea también