Construyendo un sistema de archivo de correos electrónicos: Almacenando el cuerpo del correo electrónico
Correo electrónico
·
4 mar 2019

Puntos clave
Propósito: Esta publicación describe la primera fase de construir un sistema de archivo de correos electrónicos utilizando SparkPost, Amazon S3 y MySQL. Explica cómo duplicar, capturar y almacenar correos electrónicos para acceso a largo plazo y cumplimiento.
Idea principal: El sistema almacena automáticamente el cuerpo del correo electrónico en bruto (formato rfc822) en S3 y registra los metadatos (asunto, remitente, sello de tiempo, etc.) en MySQL para una búsqueda y recuperación rápidas.
Aspectos esenciales cubiertos:
Creación de duplicados para archivo: Use la función Archive de SparkPost para enviar copias idénticas de correos electrónicos salientes a una dirección de archivo designada, asegurando que el cuerpo y los enlaces de seguimiento permanezcan idénticos.
Vinculación de datos mediante UID: Incruste un identificador único (UID) tanto en el cuerpo del correo electrónico como en los metadatos X-MSYS-API para enlazar los mensajes originales y archivados.
Procesamiento de entrada: Configure un dominio de entrada y un webhook en SparkPost para recibir las cargas útiles JSON de los correos electrónicos archivados a través de un colector de aplicaciones.
Almacenamiento de correos electrónicos en S3: Cargue el cuerpo rfc822 analizado en un bucket S3, usando reglas de ciclo de vida (por ejemplo, transición a Glacier después de un año) para reducir los costos de almacenamiento.
Registro de metadatos en MySQL: Guarde campos clave como RCPT_TO, FROM, SUBJECT y el nombre de archivo de S3 para indexación de búsqueda y futura recuperación.
Consideraciones de rendimiento: La eficiencia del código y el registro mínimo aseguran que el colector pueda manejar cientos de solicitudes por minuto con una latencia mínima.
Panorama general: Esta base apoya futuros mejoramientos, como almacenamiento de eventos de registro, alertas de fallos y visualización de la interfaz, sentando las bases para una solución de archivo de correos electrónicos escalable y auditada.
Destacados de Q&A
¿Cuál es el objetivo de este proyecto?
Crear un sistema automatizado de archivo de correos electrónicos que almacene los cuerpos de mensajes en Amazon S3 mientras mantiene metadatos buscables en una base de datos MySQL.
¿Por qué usar la función Archive de SparkPost?
Te permite generar copias exactas de los correos electrónicos salientes, preservando su estructura y datos de seguimiento para el cumplimiento y revisión.
¿Cómo está vinculado cada correo electrónico archivado a su mensaje original?
Un UID único está incrustado tanto en el cuerpo del correo electrónico como en los metadatos, lo que permite una referencia cruzada precisa entre las copias originales y archivadas.
¿Por qué usar S3 para almacenamiento?
S3 ofrece opciones de almacenamiento escalables y gestión del ciclo de vida (como Glacier), lo que lo hace rentable para la retención de correos electrónicos a largo plazo.
¿Qué almacena la base de datos MySQL?
Almacena campos de metadatos buscables, como la línea de asunto, el remitente, las marcas de tiempo y el nombre de archivo S3, lo que permite una consulta y recuperación eficientes.
¿Cuáles son los próximos pasos de desarrollo?
Agregando seguimiento de eventos de registro, informes automatizados de errores, un colector simplificado y una interfaz de usuario para ver o reenviar correos electrónicos archivados.
En este blog, describiré el proceso que seguí para almacenar el cuerpo del correo electrónico en S3 (Servicio de Almacenamiento Simple de Amazon) y los datos auxiliares en una tabla MySQL para facilitar la referencia cruzada. En última instancia, este es el punto de partida para la base de código que incluirá una aplicación que permitirá la búsqueda fácil de correos electrónicos archivados, y luego mostrar esos correos electrónicos junto con los datos de eventos (registro). El código para este proyecto se puede encontrar en el siguiente repositorio de GitHub: https://github.com/jeff-goldstein/PHPArchivePlatform.
Aunque aprovecharé S3 y MySQL en este proyecto, de ninguna manera son estas las únicas tecnologías que se pueden usar para construir una plataforma de archivado, pero dada su ubicuidad, pensé que eran una buena opción para este proyecto. En un sistema de alto volumen a gran escala, usaría una base de datos de mayor rendimiento que MySQL, pero para este proyecto de muestra, MySQL es perfecto. Para las organizaciones que consideran PostgreSQL como su elección de base de datos para archivo, es esencial implementar procedimientos adecuados de respaldo y restauración para mantener la integridad de los datos en sistemas de producción.
He detallado a continuación, los pasos que tomé en esta primera fase del proyecto:
Creación del correo electrónico duplicado para archivado
Usar las funciones de archivado y retransmisión entrante de SparkPost para enviar una copia del correo electrónico original nuevamente a SparkPost para su procesamiento en una estructura JSON, luego enviada a un recolector de webhook (aplicación)
Desmantelar la estructura JSON para obtener los componentes necesarios
Enviar el cuerpo del correo electrónico a S3 para su almacenamiento
Registrar una entrada en MySQL para cada correo electrónico para la referencia cruzada
Creando un Duplicado del Email
Obteniendo la versión Archive
Para obtener una copia de un correo electrónico para archivo, debe seguir los siguientes pasos:
Crear un subdominio al que enviará todos los correos electrónicos de archivo (duplicados)
Configurar los registros DNS apropiados para que todos los correos enviados a ese subdominio se dirijan a SparkPost
Crear un dominio de entrada en SparkPost
Crear un webhook de entrada en SparkPost
Crear una aplicación (colector) para recibir el flujo de datos del webhook de SparkPost
Los siguientes dos enlaces pueden ayudarle a guiarse a través de este proceso:
Documento técnico de SparkPost: Enabling Inbound Email Relaying & Relay Webhooks
Además, el blog que escribí el año pasado, Archiving Emails: A How-To Guide for Tracking Sent Mail le guiará a través de la creación del relay de entrada dentro de SparkPost
* Nota: a partir de octubre de 2018, la función de Archivo solo funciona al enviar correos electrónicos usando una conexión SMTP a SparkPost, la API RESTful no admite esta función. Probablemente eso no sea un problema porque la mayoría de los correos electrónicos que necesitan este nivel de control de auditoría tienden a ser correos personalizados que se construyen completamente por una aplicación de backend antes de que se necesite la entrega del correo.
Obtener el correo electrónico duplicado en una estructura JSON
Almacenando el correo electrónico duplicado en S3
Almacenando los Meta Data en MySQL
Recopilamos todos los datos necesarios en un paso anterior, por lo que el paso de almacenamiento es fácil. En esta primera fase elegí construir una tabla con los siguientes campos:
Campos de Metadatos de MySQL
Campo | Propósito |
Fecha/hora (automático) | Marca de tiempo cuando se registró la entrada |
Dirección RCPT_TO | Dirección de correo electrónico objetivo para el mensaje archivado |
Marca de tiempo del encabezado DATE | Hora de envío del correo original |
Encabezado SUBJECT | Línea de asunto para indexar y buscar |
Encabezado FROM | Identificador del remitente para la búsqueda |
Directorio S3 | Ruta del directorio dentro del bucket de S3 |
Nombre de archivo S3 | Archivo .eml único almacenado en S3 |
La función llamada MySQLLog dentro del archivo de aplicación upload.php pasa por los pasos necesarios para abrir el enlace a MySQL, insertar la nueva fila, probar los resultados y cerrar el enlace. Agrego un paso adicional por precaución, que es registrar estos datos en un archivo de texto. ¿Debería hacer mucho más registro de errores? Sí. Pero quiero mantener este código ligero para permitir que se ejecute extremadamente rápido. A veces este código se llamará cientos de veces por minuto y necesita ser lo más eficiente posible. En futuras actualizaciones, agregaré código auxiliar que procesará fallos y enviará esos fallos por correo electrónico a un administrador para su monitoreo.
Concluyendo
Así que en unos pocos pasos bastante sencillos, pudimos recorrer la primera fase de construir un sistema robusto de archivo de correos electrónicos que mantiene el duplicado del correo en S3 y referencias cruzadas de datos en una tabla MySQL. Esto nos dará una base para el resto del proyecto que se abordará en varias publicaciones futuras.
En revisiones futuras de este proyecto, esperaría:
Almacenar todos los eventos de registro del correo electrónico original
Enviar errores de almacenamiento a un administrador cuando ocurra una falla al subir o registrar
Minimizar la complejidad del colector.
Agregar una interfaz de usuario para ver todos los datos
Soportar la capacidad de reenviar el correo electrónico
Mientras tanto, espero que este proyecto te haya parecido interesante y útil; feliz envío.



