Cómo crear una Azure Logic App para integración de correos y Blob Storage
Este tutorial muestra cómo crear una Azure Logic App que recibe correos (Office 365 Outlook) y guarda automáticamente adjuntos en Azure Blob Storage. Es útil para automatizar la ingestión de archivos, reducir trabajo manual e integrar correos con pipelines ETL. Puede ahorrar decenas de horas al mes si recibe 100-500 adjuntos, y permite preparar los archivos para procesamiento posterior por Azure Functions, Data Factory o Power BI.
Requisitos previos
- Suscripción Azure con permisos para crear recursos. Idealmente tiene el rol Contributor en el Resource Group o permisos equivalentes para Storage y Logic App.
- Cuenta Office 365 con acceso a Outlook/Exchange Online. La autenticación puede ser delegada (cuenta de usuario) o vía Service Principal, dependiendo del conector.
- Resource Group existente o permiso para crear uno. Se recomienda un Resource Group dedicado para lógica y almacenamiento para facilitar la gestión de costes.
- Conocimientos básicos del Azure Portal y conceptos de Blob Storage (containers, tiers, lifecycle). Es útil saber cómo copiar connection strings o generar tokens SAS para depuración.
Paso 1: Crear una Storage Account y container
Necesitamos una Storage Account con un container para guardar los adjuntos. El container puede ser privado porque la Logic App usará credenciales para escribir. Para entornos de producción elija replicación adecuada (por ejemplo, Standard_LRS). La cuenta puede soportar miles de archivos; si prevé 10k-100k adjuntos por mes, revise políticas de lifecycle y tiers (Hot/Cool/Archive) para optimizar costes.
# Exemplo com Azure CLI
az storage account create --name mylogicstorageacct --resource-group myResourceGroup --location westeurope --sku Standard_LRS --kind StorageV2
az storage container create --name email-attachments --account-name mylogicstorageacct
Después de crear, guarde la connection string o la clave de la cuenta de forma segura (Key Vault es recomendado). Configure el access level del container a Private y considere añadir una policy de lifecycle para mover blobs con más de 90 días a Cool/Archive.
Paso 2: Crear la Logic App (Consumption) en el Azure Portal
En el Portal cree una Logic App (Consumption) — es simple y económico para workflows event-driven. Asígnele un nombre y asóciela al Resource Group y ubicación. La opción Consumption factura por acción y por ejecución, siendo adecuada para patrones de ingestión moderados (cientos a unos pocos miles de runs por día). Para cargas muy elevadas (miles por minuto) considere Logic Apps (Standard).
Elija el plan según la latencia y el throughput deseado: Consumption es near‑real time para conectores como Office 365 Outlook y es suficiente para la mayoría de los escenarios de ingestión.
Paso 3: Configurar el trigger Office 365 Outlook - When a new email arrives
En el diseñador de la Logic App añada el trigger "When a new email arrives (V3)" del conector Office 365 Outlook. Autentique con la cuenta Office 365. Configure filtros para evitar ruido — por ejemplo solo correos con adjuntos, Subject contiene "Invoice" o From contiene "@fornecedor.com". Esto reduce el número de runs y costes. El conector hace un trigger del tipo push, por lo que la latencia suele ser inferior a un minuto.
Trigger: When a new email arrives (V3)
- Folder: Inbox
- Has Attachments: Yes
- Include Attachments: Yes
- Filter: Subject contains "Invoice" (opcional)
Si necesita procesar solo tipos específicos de archivos, puede filtrar por Content-Type o nombre del adjunto posteriormente dentro del flujo.
Paso 4: Iterar adjuntos y crear archivos en Blob Storage
Añada una acción "Apply to each" sobre la salida Attachments del trigger. Dentro del bucle utilice la acción del conector Azure Blob Storage "Create blob" para escribir cada adjunto. Para autenticar elija la Storage Account creada (vía connection string o Managed Identity, si configurada).
# Campos importantes na ação Create blob
- Folder Path / Container: email-attachments
- Blob Name: @{concat(formatDateTime(utcNow(),'yyyyMMddHHmmss'),'-',replace(items('Apply_to_each')?['name'],' ','_'))}
- Blob Content: @{base64ToBinary(items('Apply_to_each')?['contentBytes'])}
Usar timestamp en el nombre reduce duplicados y ayuda a ordenar los archivos. Para garantizar nombres válidos sustituya espacios y caracteres inválidos (ej.: replace(...)). Verifique el tamaño máximo de los adjuntos soportado por el conector; en general mensajes con adjuntos hasta ~150 MB pueden ser procesados pero depende de la configuración del Exchange/tenant.
Paso 5: Manejar errores y evitar duplicados
Añada una condición para verificar si el archivo ya existe antes de crear — por ejemplo usando la acción "Get blob metadata" o "List blobs" para buscar un nombre igual. Como alternativa, use un esquema de nombres con timestamp y un identificador único (MessageId).
Para gestionar errores, use la funcionalidad "Configure run after" para que, en caso de fallo o timeout, se ejecute una acción de recovery: enviar un correo al admin, escribir un registro en una Table Storage o crear un ítem en una Queue para reprocesamiento. Esto facilita la monitorización y reduce pérdidas de archivos.
# Exemplo de BlobName com timestamp e MessageId
@{concat(formatDateTime(utcNow(),'yyyyMMddHHmmss'),'-',triggerOutputs()?['body/messageId'],'-',items('Apply_to_each')?['name'])}
Considere también añadir un paso de validación (ej.: comprobar mime-type y tamaño) y una policy de lifecycle en el Storage (ej.: delete after 180 days) para controlar costes.
Verificar el resultado
Para confirmar que está correcto, envíe un correo de prueba con 2-3 adjuntos variados a la cuenta monitorizada. En el Portal, abra la Logic App, vea el historial de runs (Run history) y expanda una ejecución para inspeccionar inputs/outputs de cada acción. Debe ver la lista de adjuntos, la creación de cada blob y códigos de éxito (200/201).
Verifique también en el container email-attachments que los blobs fueron creados con el contenido correcto (confirme tamaño y tipo). Si algo falla, los detalles del error aparecen en el run history con el mensaje del conector — eso ayuda a ajustar límites de timeout y retry.
Conclusión
Ahora tiene una Azure Logic App que automatiza la ingestión de adjuntos de correo a Azure Blob Storage — útil para pipelines ETL, backups o procesamiento posterior por Functions o Data Factory. Próximos pasos prácticos: filtrar por tipo MIME, añadir validación/antivirus, usar Managed Identity para autenticación segura, o conectar a una Azure Function para procesamiento (por ejemplo, conversión CSV→Parquet). Consejo: use nombres de blob con metadatos, configure políticas de lifecycle (ej.: mover a Cool tras 30 días) y monitorice el coste de las ejecuciones para optimizar el proceso.