Automatización email-a-ticket y flujos de trabajo
Esta parte explica el flujo completo de cómo los emails entrantes se convierten automáticamente en tickets, cómo funciona el threading (vinculación de respuestas) y cómo se envían emails desde FacturaScripts.
🌊 Flujo completo: email entrante a ticket
1. Recepción del email
El sistema revisa el buzón IMAP de forma periódica:
- Cada vez que un usuario carga una página de FacturaScripts, el plugin comprueba si ha pasado el intervalo configurado (por defecto, 5 minutos) desde la última revisión.
- Si ha pasado el tiempo, se conecta al servidor IMAP y busca emails no leídos (UNSEEN).
- Se procesa un máximo de 50 emails por ciclo para evitar timeouts.
2. Análisis del asunto
Para cada email recibido, el sistema analiza el asunto buscando un código de ticket con el patrón: TKT-XXXXX (5 dígitos).
Si encuentra un código de ticket:
- Busca el ticket correspondiente en la base de datos.
- Si el ticket existe: añade el email como respuesta al ticket.
- Si el ticket no existe (código inválido): crea un nuevo ticket.
- Si el ticket estaba cerrado/resuelto: lo reabre automáticamente.
Si NO encuentra código de ticket:
- Crea un nuevo ticket (si la opción "Crear tickets automáticamente" está activa).
3. Creación de ticket desde email
Cuando se crea un ticket nuevo desde un email, se asignan los siguientes campos:
- Asunto: Asunto del email (máximo 200 caracteres)
- Descripción: Cuerpo del email (texto plano preferido, HTML convertido a texto)
- Creador: El "Usuario por defecto" configurado (no el remitente del email)
- Origen: email
- Email origen: Dirección de email del remitente
- Email Message-ID: Identificador único del email (para evitar duplicados)
- Categoría: Soporte técnico (por defecto)
- Prioridad: Normal (por defecto)
- Código: Generado automáticamente (TKT-XXXXX)
- Estado: Abierto
4. Gestión de adjuntos
Los emails pueden incluir archivos adjuntos:
- Primer adjunto: Se guarda como adjunto principal del ticket.
- Adjuntos adicionales (del 2.º al 5.º): Se crean como respuestas automáticas al ticket, cada una con su adjunto.
- Límite: Máximo 5 adjuntos por email.
- Almacenamiento: Carpeta
MyFiles/Tickets/del servidor con nombre seguro.
5. Auto-respuesta al remitente
Si la opción "Enviar confirmación al crear ticket" está activa y SMTP está configurado, se envía automáticamente un email de confirmación al remitente original con:
- Asunto:
[TKT-XXXXX] [Asunto original del email] - Contenido: El texto de la plantilla configurada, con
{CODIGO}reemplazado por el código del ticket.
🔁 Flujo: respuesta por email a un ticket existente
Desde un cliente externo (Gmail, Outlook, etc.)
Cuando alguien responde al email de confirmación (o envía un email nuevo con el código del ticket en el asunto):
- El sistema detecta
TKT-XXXXXen el asunto. - Busca el ticket con ese código.
- Añade el contenido del email como nueva respuesta al ticket.
- La respuesta se marca con origen "email" y se muestra con un badge azul "Email".
- Si el ticket estaba cerrado o resuelto, se reabre automáticamente.
Desde FacturaScripts
Cuando un usuario responde a un ticket que provino de email:
- El usuario escribe su respuesta en el formulario del ticket.
- Hace clic en "Responder" (solo guarda internamente) o "Responder + Email" (guarda Y envía por correo).
- Si elige "Responder + Email":
- La respuesta se guarda en el ticket.
- Se envía un email al remitente original del ticket.
- El email incluye el código del ticket en el asunto para mantener el threading.
- Se incluyen cabeceras
In-Reply-ToyReferencespara que los clientes de email agrupen la conversación.
🧵 Threading de emails
El sistema mantiene la conversación agrupada usando estándares de email:
- Message-ID: Identificador único de cada email (se guarda en
email_msgid) - In-Reply-To: Referencia al Message-ID del email original
- References: Cadena de Message-IDs de toda la conversación
- Subject: Incluye
[TKT-XXXXX]para identificación visual y automática
Protección contra duplicados
Antes de procesar un email, el sistema verifica si el Message-ID ya existe en las tablas tickets y ticket_respuestas. Si ya existe, el email se ignora. Esto evita procesar el mismo email dos veces.
📩 Procesamiento del cuerpo del email
Preferencia de formato
- Texto plano (text/plain): Preferido. Se usa directamente.
- HTML (text/html): Se convierte a texto plano eliminando etiquetas y preservando la estructura básica.
Emails multipart
El sistema maneja correctamente emails con estructura compleja: multipart/alternative, multipart/mixed y subpartes anidadas.
Límites de seguridad
- El cuerpo del email se limita a 10.000 caracteres.
- Se eliminan caracteres de control (excepto saltos de línea).
- Los nombres de archivos adjuntos se sanitizan.
- Las codificaciones de caracteres se convierten automáticamente a UTF-8.
📤 Envío de emails (SMTP)
Motor de envío
El plugin utiliza dos métodos de envío, en orden de preferencia:
- PHPMailer (incluido en FacturaScripts): Método preferido. Soporta autenticación SMTP completa, cifrado TLS/SSL y codificación UTF-8.
- Función mail() de PHP: Fallback si PHPMailer no está disponible.
Formato de emails enviados
Los emails enviados desde FSMensajeria tienen:
- Formato HTML con diseño limpio y profesional.
- Versión texto plano alternativa (generada automáticamente).
- Cabecera: Barra con el código del ticket.
- Pie de página: Instrucciones para responder incluyendo el código del ticket.
⏱️ Comprobación periódica vs. manual
- Periódica: Se ejecuta en cada carga de página de FS, si ha pasado el intervalo configurado. Es automática y transparente.
- Manual: Al pulsar "Revisar emails ahora" en Config. Email. Es inmediata y muestra resultados.
Nota importante: La comprobación periódica se ejecuta en Init::init(), que se llama en cada page load. Si nadie accede a FacturaScripts durante horas, no se revisan emails. Para entornos de producción con alto volumen, se recomienda configurar un cron job que acceda periódicamente a cualquier página de FacturaScripts.
🛠️ Resolución de problemas avanzada
Los emails se procesan pero no se crean tickets: Verifica que la opción "Crear tickets automáticamente" está activada. Los emails ya procesados (mismo Message-ID) se ignoran.
Los tickets no se reabren al recibir un email: El email debe contener exactamente el formato TKT-XXXXX (con 5 dígitos) en el asunto. Ejemplo válido: "Re: [TKT-00042] Mi problema". Ejemplo inválido: "Re: TKT-42 Mi problema".
Las respuestas no se agrupan en el cliente de email: Verifica que SMTP está configurado y que se está usando PHPMailer. Las cabeceras de threading solo se incluyen cuando se tiene el Message-ID original.
Los adjuntos no se guardan: Verifica que la carpeta MyFiles/Tickets/ tiene permisos de escritura. Solo se procesan los primeros 5 adjuntos por email.
Los emails HTML se ven mal en los tickets: El sistema convierte HTML a texto plano intencionadamente para evitar problemas de seguridad (XSS) y mantener los tickets limpios.
📚 Índice completo de la documentación
- Parte 1: Instalación y primeros pasos
- Parte 2: Sistema de mensajería interna (Chat)
- Parte 3: Sistema de tickets
- Parte 4: Configuración de email (IMAP/SMTP)
- Parte 5: Automatización email-a-ticket y flujos de trabajo (esta página)