Construindo um Sistema de Arquivamento de E-mails: Armazenando o Corpo do E-mail
·
4 de mar. de 2019

Principais Conclusões
Propósito: Esta postagem descreve a primeira fase de construção de um sistema de arquivamento de e-mails usando SparkPost, Amazon S3 e MySQL. Ela explica como duplicar, capturar e armazenar e-mails para acesso e conformidade de longo prazo.
Ideia central: O sistema armazena automaticamente o corpo do e-mail em formato bruto (rfc822) no S3 e registra metadados (assunto, remetente, timestamp, etc.) no MySQL para busca e recuperação rápidas.
Essenciais abordados:
Criando duplicatas para arquivamento: Use o Recurso de Arquivo do SparkPost para enviar cópias idênticas de e-mails enviados para um endereço de arquivamento designado, garantindo que o corpo e os links de rastreamento permaneçam idênticos.
Vinculação de dados via UID: Incorpore um identificador exclusivo (UID) tanto no corpo do e-mail quanto nos metadados X-MSYS-API para vincular as mensagens originais e arquivadas.
Processamento de entrada: Configure um domínio de entrada e webhook no SparkPost para receber as cargas JSON de e-mails arquivados através de um coletor de aplicativo.
Armazenando e-mails no S3: Carregue o corpo rfc822 analisado em um bucket S3, usando regras de ciclo de vida (por exemplo, transição para Glacier após um ano) para reduzir os custos de armazenamento.
Registrando metadados no MySQL: Salve campos chave como RCPT_TO, FROM, SUBJECT e nome do arquivo S3 para indexação de busca e recuperação futura.
Considerações de desempenho: A eficiência do código e o registro mínimo garantem que o coletor possa lidar com centenas de requisições por minuto com latência mínima.
Visão geral: Esta base suporta melhorias futuras – como armazenamento de eventos de log, alertas de falha e visualização de UI – estabelecendo as bases para uma solução de arquivamento de e-mails escalável e auditável.
Destaques de Perguntas e Respostas
Qual é o objetivo deste projeto?
Para criar um sistema de arquivamento de e-mails automatizado que armazena os corpos das mensagens no Amazon S3, mantendo metadados pesquisáveis em um banco de dados MySQL.
Por que usar o recurso de Arquivo do SparkPost?
Ele permite que você gere duplicatas exatas de e-mails enviados, preservando sua estrutura e dados de rastreamento para conformidade e revisão.
Como cada e-mail arquivado está vinculado à sua mensagem original?
Um UID exclusivo está incorporado tanto no corpo do email quanto nos metadados, permitindo uma referência cruzada precisa entre as cópias originais e arquivadas.
Por que usar o S3 para armazenamento?
S3 oferece opções de armazenamento escalável e gerenciamento de ciclo de vida (como Glacier), tornando-o econômico para retenção de emails a longo prazo.
O que o banco de dados MySQL armazena?
Ele armazena campos de metadados pesquisáveis—como linha de assunto, remetente, carimbos de data/hora e o nome do arquivo S3—permitindo consultas e recuperações eficientes.
Quais são os próximos passos de desenvolvimento?
Adicionando rastreamento de eventos de log, relatórios automatizados de erros, um coletor simplificado e uma interface de usuário para visualizar ou reenviar e-mails arquivados.
Neste blog, descreverei o processo que passei para armazenar o corpo do email no S3 (Serviço de Armazenamento Simples da Amazon) e dados auxiliares em uma tabela MySQL para fácil referência cruzada. Em última análise, este é o ponto de partida para a base de código que incluirá um aplicativo que permitirá uma pesquisa fácil de e-mails arquivados e, em seguida, exibir esses e-mails juntamente com os dados de eventos (log). O código deste projeto pode ser encontrado no seguinte repositório do GitHub: https://github.com/jeff-goldstein/PHPArchivePlatform.
Embora eu vá utilizar o S3 e o MySQL neste projeto, de forma alguma essas são as únicas tecnologias que podem ser usadas para construir uma plataforma de arquivamento, mas dado a ubiquidade delas, pensei que eram uma boa escolha para este projeto. Em um sistema de alta escala e alto volume, eu usaria um banco de dados de desempenho superior ao MySQL, mas para este projeto de amostra, o MySQL é perfeito. Para organizações que consideram o PostgreSQL como sua escolha de banco de dados para arquivamento, implementar procedimentos adequados de backup e recuperação é essencial para manter a integridade dos dados em sistemas de produção.
Detalhei abaixo os passos que segui nesta primeira fase do projeto:
Criar o email duplicado para arquivamento
Usar os recursos de Arquivamento e Relay de Entrada do SparkPost para enviar uma cópia do email original de volta ao SparkPost para processamento em uma estrutura JSON, que será enviada para um coletor de webhook (aplicativo)
Desmantelar a estrutura JSON para obter os componentes necessários
Enviar o corpo do email para o S3 para armazenamento
Registrar uma entrada no MySQL para cada email para referência cruzada
Criando uma Cópia do E-mail
Obtendo a versão do Arquivo
Para obter uma cópia de um email para arquivar, você precisa seguir os seguintes passos:
Crie um subdomínio para o qual você enviará todos os emails de arquivo (duplicados)
Defina os registros DNS apropriados para enviar todos os emails desse subdomínio para o SparkPost
Crie um domínio de entrada no SparkPost
Crie um webhook de entrada no SparkPost
Crie um aplicativo (coletor) para receber o fluxo de dados do webhook do SparkPost
Os seguintes dois links podem ser usados para ajudá-lo a passar por esse processo:
Documento técnico do SparkPost: Habilitando o Envio de Emails e Webhooks de Relay de Entrada
Além disso, o blog que escrevi no ano passado, Arquivando Emails: Um Guia Prático para Rastrear Emails Enviados irá guiá-lo na criação do relay de entrada dentro do SparkPost
* Observação: a partir de outubro de 2018, o recurso de Arquivo funciona apenas ao enviar emails usando uma conexão SMTP para o SparkPost, a API RESTful não dá suporte a esse recurso. Isso provavelmente não é um problema, pois a maioria dos emails que precisam desse nível de controle de auditoria tende a ser emails personalizados que são totalmente construídos por um aplicativo de backend antes que a entrega do email seja necessária.
Obtendo o e-mail duplicado em uma estrutura JSON
Armazenando o e-mail duplicado no S3
Armazenando os Metadados no MySQL
Coletamos todos os dados necessários em uma etapa anterior, então a etapa de armazenamento é fácil. Nesta primeira fase, escolhi construir uma tabela com os seguintes campos:
Campos de Metadados MySQL
Campo | Propósito |
Data/hora (auto) | Timestamp quando a entrada foi registrada |
Endereço RCPT_TO | Endereço de e-mail alvo para a mensagem arquivada |
Timestamp do cabeçalho DATE | Hora de envio do e-mail original |
Cabeçalho SUBJECT | Linha de assunto para indexação e pesquisa |
Cabeçalho FROM | Identificador do remetente para consulta |
Diretório S3 | Caminho do diretório dentro do bucket S3 |
Nome de arquivo S3 | Arquivo .eml único armazenado no S3 |
A função chamada MySQLLog dentro do arquivo da aplicação upload.php passa pelos passos necessários para abrir o link para o MySQL, inserir a nova linha, testar os resultados e fechar o link. Eu adiciono mais um passo para garantir que esses dados sejam registrados em um arquivo de texto. Devo fazer muito mais registros de erros? Sim. Mas eu quero manter este código leve para permitir que ele seja executado extremamente rápido. Às vezes, esse código será chamado centenas de vezes por minuto e precisa ser o mais eficiente possível. Em atualizações futuras, adicionarei um código auxiliar que processará falhas e enviará essas falhas para um administrador para monitoramento.
Concluindo
Então, em alguns passos bastante fáceis, conseguimos passar pela primeira fase de construção de um sistema robusto de arquivamento de e-mails que armazena o e-mail duplicado no S3 e faz a referência cruzada dos dados em uma tabela MySQL. Isso nos dará uma base para o restante do projeto que será abordado em várias postagens futuras.
Nas revisões futuras deste projeto, espero:
Armazenar todos os eventos de log do e-mail original
Enviar erros de armazenamento para um administrador quando ocorrer uma falha ao fazer upload ou registrar
Minimizar a complexidade do coletor.
Adicionar uma interface de usuário para visualizar todos os dados
Suportar a capacidade de reenvio do e-mail
Enquanto isso, espero que este projeto tenha sido interessante e útil para você; feliz envio.



