Versão 1.0.0
O README.md completo encontra-se em docs/README.md
.
Este projeto é um microsserviço backend de uma API Restfull desenvolvida utilizando Java Spring Boot com conexão com o Amazon Simple Email Service (SES) ou Mailgun para envio de emails. Seguindos os conceitos da Arquitetura Limpa (Clean Architecture), permitindo flexibilidade para trocar o provedor de email.
Essa aplicação recebe um JSON
por requisição POST
com parâmetros para disparar um email e envia email usando um provedor de email.
Este sistema fornece uma abstração entre dois provedores de serviços de e-mail diferentes, se um dos serviços cair,o email é rapidamente enviado para outro provedor sem afetar os clientes.
- Envio de emails utilizando o Amazon SES ou Mailgun
- Estrutura modular baseada em Arquitetura Limpa (Clean Architecture).
- Suporte para múltiplos provedores de email (ex.: SendGrid, Mailgun, etc.).
- Configuração de credenciais via variáveis de ambiente.
A API fornece os seguintes endpoints:
POST SendEmail
POST /api/email/send – Enviar um novo e-mail
{
"to": "[email protected]",
"subject": "Assunto do Email",
"body": "Body do email"
}
- Java 24
- Spring Boot 3.x
- Amazon SES SDK
- Mailgun
- Maven (Adicionado durante a configuração no SpringBoot)
- Lombok (Adicionado durante a configuração no SpringBoot)
- Java 24 ou superior instalado. Java 24 Download.
- Maven instalado ou uma IDE como VSCode (com Extensões para SpringBoot) ou IntelliJ IDEA
- Conta na AWS com o serviço SES configurado.
- Configuração das variáveis de ambiente para as credenciais da AWS.
As variáveis de sistema necessárias são:
AWS_ACCESS_KEY_ID
: Chave de acesso da AWS.AWS_SECRET_KEY
: Chave secreta da AWS.AWS_REGION
: Região onde o serviço SES está configurado (ex.:us-east-1
).EMAIL_SOURCE
: Endereço de email verificado no SES para envio.
Preencha as variáveis de ambiente em um arquivo .env
na raiz do projeto, você pode usar o arquivo .env-sample
como exemplo e renomea-lo para .env
.
# AWS Credentials
AWS_ACCESS_KEY_ID=
AWS_SECRET_KEY=
AWS_REGION=us-east-1
# Email Configuration
EMAIL_SOURCE=
Ou defina as variáveis de ambiente no seu sistema:
$Env:AWS_ACCESS_KEY_ID = "sua_access_key_id"
$Env:AWS_SECRET_KEY = "sua_secret_key"
$Env:AWS_REGION = "us-east-1"
$Env:EMAIL_SOURCE = "[email protected]"
Se acaso quiser que elas tornem-se permanentes use:
setx AWS_ACCESS_KEY_ID = "sua_access_key_id"
setx AWS_SECRET_KEY = "sua_secret_key"
sext AWS_REGION = "us-east-1"
sext EMAIL_SOURCE = "[email protected]"
export AWS_ACCESS_KEY_ID="sua_access_key_id"
export AWS_SECRET_KEY="sua_secret_key"
export AWS_REGION="us-east-1"
export EMAIL_SOURCE="[email protected]"
-
Clone o repositório:
git clone https://github.com/seu-usuario/email-service.git cd email-service
-
Compile e execute o projeto com o Maven:
mvn clean package java -jar target/email_service-0.0.1-SNAPSHOT.jar
Envie uma requisição POST
para o endpoint /api/v1/email/send
com o seguinte corpo:
{
"to": "[email protected]",
"subject": "Teste de Email",
"body": "Este é um email de teste enviado pelo microsserviço."
}
Exemplo de comando curl
:
curl -X POST http://localhost:8080/api/v1/email/send \
-H "Content-Type: application/json" \
-d '{
"to": "[email protected]",
"subject": "Teste de Email",
"body": "Este é um email de teste enviado pelo microsserviço."
}'
O projeto segue o padrão Clean Architecture, com as seguintes camadas:
- Core: Contém as regras de negócio e casos de uso.
- Application: Implementa os casos de uso definidos no Core.
- Adapters: Define interfaces para comunicação com serviços externos.
- Infra: Implementa as interfaces dos Adapters, como o cliente AWS SES.
- Controllers: Exposição de endpoints REST para interação com o sistema.
Veja também o diagrama de classes feito em:
-
- PNG:
docs/uml/diagrama_classes.png
- SVG:
docs/uml/diagrama_classes.svg
- Source:
docs/uml/diagrama_classes.wsd
- PNG:
-
- Source:
docs/uml/diagrama_classes.nmd
- Source:
-
Adicionar suporte a múltiplos provedores de email:
- Implementar integração com provedores como SendGrid, Mailgun e SparkPost.
- Criar uma lógica de fallback para alternar automaticamente entre provedores caso um deles falhe.
- Garantir que o serviço possa ser transferido rapidamente para outro provedor sem afetar os clientes.
- Apresentar informação de qual serviço foi usado e se houve sucesso ou falha. Se um serviço falhar fazer fallback para o próximo e manter-se no próximo até que falhe para voltar ao primário.
-
Melhorar a cobertura de testes:
- Adicionar testes unitários e de integração para os novos provedores.
- Simular falhas nos provedores para validar o comportamento do fallback.
-
Documentação:
- Atualizar a documentação para incluir instruções de configuração e uso dos novos provedores.
Contribuições são bem-vindas! Se você encontrar algum problema ou tiver sugestões de melhorias, abra uma issue ou envie um pull request para o repositório.
Ao contribuir para este projeto, siga o estilo de código existente, Conventional Commits, e envie suas alterações em uma branch separada.
Este projeto está sob a licença MIT. Consulte o arquivo LICENSE
para mais detalhes.