Recentemente, transformei um processo manual que consumia uma semana inteira de trabalho em uma ferramenta automatizada, eficiente e profissional. Além de resolver um problema real, este projeto serviu como um laboratório para aplicar conceitos avançados de arquitetura de software.
O Problema: O Caos do Processo Manual
Conversando com uma profissional da área de eventos, identifiquei um gargalo crítico: o envio de comunicados para listas de contatos. O fluxo de trabalho dela era:
- Fragmentação: Copiar 300 e-mails por vez para o campo BCC do Gmail.
- Limitação Técnica: Interromper o trabalho ao atingir a quota diária de envios.
- Gestão de Erros Manual: Abrir e-mails de "bounce" (retorno) um a um, localizar o contato em uma planilha e excluí-lo manualmente.
- Inconsistência: O uso de texto puro e a falta de padronização visual prejudicavam a identidade da marca.
Esse processo era moroso, sujeito a falhas e impedia o foco em tarefas estratégicas de divulgação.
A Análise e a Estratégia
A solução óbvia seria um serviço de e-mail marketing (como Mailchimp ou RD Station). No entanto, diante da ausência de orçamento para ferramentas pagas, decidi desenvolver uma solução personalizada que unisse baixo custo operacional com alta eficiência.
Os pilares do projeto seriam:
- Automação: Envio em massa sem intervenção manual repetitiva.
- Conformidade: Gestão automática de bounces e unsubscribes.
- Profissionalismo: Templates HTML responsivos com Twig.
- Escalabilidade: Integração com AWS SES (Simple Email Service).
Arquitetura: Clean Architecture e SOLID em Prática
Embora o escopo parecesse simples, utilizei o projeto para demonstrar domínio em arquitetura de software, garantindo que o código fosse testável, modular e de fácil manutenção.
1. Separação de Responsabilidades (Clean Architecture)
Dividi o projeto em camadas claras:
- Domain: Onde residem as regras de negócio e interfaces, totalmente isolado de bibliotecas externas.
- Infrastructure: Implementações concretas de serviços como AWS SES, leitura de CSVs e renderização de templates.
- Command (Application): A porta de entrada via CLI, orquestrando os serviços de domínio.
2. Inversão de Dependência (DIP)
O EmailCampaignService não conhece os detalhes de como um e-mail é enviado ou de onde vem a lista de rejeitados. Ele depende de interfaces:
// Domínio dependendo de abstrações
public function __construct(
private UnsubscriptionRepositoryInterface $unsubscriptionRepository,
private RejectedRecipientRepositoryInterface $rejectedRecipientRepository,
private EmailRenderer $emailRenderer,
private SesEmailSender $emailSender,
// ...
)
Isso permite, por exemplo, trocar o provedor de e-mail (de AWS SES para SendGrid) apenas alterando a implementação na camada de infraestrutura, sem tocar na lógica de negócio.
3. Domain-Driven Design (DDD)
Utilizei o conceito de Domain Services para concentrar a lógica da campanha e DTOs (EmailSendingDTO) para garantir que os dados trafeguem de forma tipada e segura entre as camadas.
Funcionalidades e Uso
O sistema é operado via CLI (Symfony Console), oferecendo dois comandos principais:
-
email:send: Inicia o disparo da campanha. Pode ser usado de modo interativo (prompts) ou parametrizado. Ele filtra automaticamente os e-mails contra listas de desinscrição e rejeitados antes do envio. -
rejected:update: Sincroniza a lista local de e-mails rejeitados com a Suppression List da AWS, garantindo que a reputação do domínio seja preservada ao evitar reenvios para endereços inválidos.
Resultados e Conclusão
A automação reduziu o tempo de operação de dias para minutos. O uso de templates Twig trouxe uma estética profissional aos e-mails, enquanto a integração com a API da AWS garantiu a entrega em conformidade com as boas práticas de mercado.
Para mim, como desenvolvedor, o projeto foi uma oportunidade de materializar conceitos teóricos de SOLID e Clean Architecture em uma ferramenta prática, robusta e totalmente coberta por testes unitários (PHPUnit).
O código está disponível no meu GitHub como parte do meu portfólio de arquitetura. Use este link para acessá-lo.
Fiquem a vontade para comentar, sugerir ou mesmo utilizar o projeto como base para suas próprias soluções
Top comments (0)