API backend desenvolvida em Java com Spring Boot para automação de envio de e-mails em campanhas, integrando-se ao SMTP (Gmail) e permitindo o disparo personalizado com anexos PDF, conteúdo HTML e gerenciamento de leads persistidos em banco de dados. Suporta múltiplos materiais, campanhas recorrentes e histórico de envios por aluno.
API backend developed in Java with Spring Boot for automating email campaign dispatch, integrating with SMTP (Gmail) and supporting personalized sending with PDF attachments, HTML content, and lead management persisted in a database. Supports multiple materials, recurring campaigns, and per-student sending history.
- Gerenciamento de materiais educativos como campanhas (PDF, conteudo HTML, assunto e ordem de exibicao).
- Disparo de e-mails em lote a partir de arquivos CSV.
- Envio de campanhas com conteudo HTML e anexo PDF a partir de CSV.
- Disparo em massa a partir de leads ativos do banco de dados, com regra inteligente baseada no historico de envios.
- Endpoint de teste para validar uma campanha em um unico e-mail, sem afetar a base nem o historico.
- Historico relacional (
tb_historico_envio) registrando por aluno e por campanha o status do envio (PENDENTE,ENVIADOouFALHOU). - Persistencia de dados no MySQL (Spring Data JPA / Hibernate).
- Configuracao de perfis de ambiente (
dev/prod). - Credenciais protegidas via variaveis de ambiente e arquivos locais ignorados.
tb_aluno: leads com nome, e-mail, flagativoe flagemailEnviado(legado).tb_campanha: materiais disparados (titulo, assunto do e-mail, conteudo HTML, PDF opcional, ordem de exibicao e data de criacao).tb_historico_envio: relacao entre aluno e campanha, comstatus(PENDENTE,ENVIADO,FALHOU) edataEnvio.
- Ao disparar uma campanha, o sistema envia o e-mail para todos os alunos ativos da base (
tb_aluno), tanto os leads recem-chegados quanto a base antiga, garantindo que todos recebam o material inedito. - O historico registra que o aluno recebeu aquela campanha especifica. Ele serve apenas para evitar duplicidade caso o mesmo
campanhaIdseja disparado novamente por engano. - O historico nao bloqueia o envio de uma campanha nova para alunos que participaram apenas de campanhas anteriores de outros materiais.
- O parametro
apenasNovosrestringe o disparo apenas para novos cadastros (alunos sem historico de envio e sem a flag legadaemailEnviado). - Envios com falha ficam registrados como
FALHOUe podem ser reenviados no proximo disparo; apenas registrosENVIADObloqueiam a reentrega da mesma campanha.
POST /api/campanhas
Parâmetros multipart/form-data:
| Parâmetro | Tipo | Descrição |
|---|---|---|
titulo |
text | Titulo da campanha/material. |
assunto |
text | Assunto do e-mail. |
conteudo |
text | Conteudo HTML do e-mail (aceita marcacao HTML). |
ordem |
text (opcional) | Ordem de exibicao do material (padrao: 999). |
pdf |
file (opcional) | Arquivo PDF a ser anexado. |
Retorna o id da campanha criada, usado nos disparos.
POST /api/emails/disparar-banco
Parâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
campanhaId |
query | ID da campanha a ser disparada. |
apenasNovos |
query (opcional) | true restringe o envio a novos cadastros. Padrao: false. |
POST /api/emails/testar?campanhaId={id}&email={[email protected]}
Envia a campanha (com PDF anexado, se houver) exclusivamente para o e-mail informado, sem registrar historico nem alterar a base.
POST /api/emails/disparar-csv
Parâmetros multipart/form-data:
| Parâmetro | Tipo | Descrição |
|---|---|---|
arquivo |
file | Arquivo CSV contendo um e-mail por linha. |
assunto |
text | Assunto do e-mail. |
conteudo |
text | Conteudo em texto do e-mail. |
POST /api/emails/disparar-com-pdf
Parâmetros multipart/form-data:
| Parâmetro | Tipo | Descrição |
|---|---|---|
csv |
file | Arquivo CSV contendo um e-mail por linha. |
pdf |
file | Arquivo PDF a ser anexado em cada e-mail. |
assunto |
text | Assunto do e-mail. |
conteudo |
text | Conteudo HTML do e-mail (aceita marcacao HTML). |
- Java 25
- Spring Boot 4.0.6
- Spring Data JPA / Hibernate
- Spring Mail
- MySQL
- Lombok
- Maven
- JDK 25 ou superior instalado.
- MySQL Server rodando localmente ou acesso a uma instancia de banco de dados.
- Conta SMTP configurada (ex.: Gmail com App Password).
Para executar a aplicacao localmente, crie o arquivo application-dev.properties na pasta src/main/resources com as configuracos abaixo, substituindo os campos entre < > pelos seus dados reais. Esse arquivo ja esta ignorado pelo .gitignore e nao deve ser versionado:
# ===============================
# Banco de Dados Local (MySQL)
# ===============================
spring.datasource.url=jdbc:mysql://localhost:3306/mensageria_db?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=<seu_usuario_do_banco>
spring.datasource.password=<sua_senha_do_banco>
# ===============================
# Configuracoes do JPA/Hibernate
# ===============================
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# ===============================
# E-mail (Testes Locais)
# ===============================
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=<[email protected]>
spring.mail.password=<sua_senha_de_app>
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=trueEm producao, as credenciais sao fornecidas por variaveis de ambiente (DB_URL, DB_USER, DB_PASSWORD, MAIL_USER, MAIL_PASSWORD), conforme configurado no perfil prod.
- Credenciais de banco de dados e e-mail nunca sao armazenadas no repositorio.
- O arquivo
application-dev.properties, usado para configuracao local, faz parte do.gitignore. - Em producao, todos os segredos sao injetados via variaveis de ambiente.
- Clone o repositorio.
- Configure as propriedades de ambiente conforme demonstrado acima.
- Execute a classe
MensageriaApplication. - A API estara disponivel na porta 8080.
- Management of educational materials as campaigns (PDF, HTML content, subject, and display order).
- Batch email dispatch from CSV files.
- Campaign sending with HTML content and PDF attachment from CSV.
- Bulk dispatch from active leads in the database, with an intelligent rule based on the sending history.
- Test endpoint to validate a campaign against a single email address, without affecting the base or the history.
- Relational history (
tb_historico_envio) recording per student and per campaign the send status (PENDING,SENT, orFAILED). - Data persistence in MySQL (Spring Data JPA / Hibernate).
- Environment profile configuration (
dev/prod). - Credentials protected via environment variables and ignored local files.
tb_aluno: leads with name, email,ativoflag, and legacyemailEnviadoflag.tb_campanha: dispatched materials (title, email subject, HTML content, optional PDF, display order, and creation date).tb_historico_envio: the relationship between student and campaign, withstatus(PENDENTE,ENVIADO,FALHOU) anddataEnvio.
- When a campaign is dispatched, the system sends the email to all active students in the base (
tb_aluno), both newly arrived leads and the old base, guaranteeing that everyone receives the brand-new material. - The history records that the student received that specific campaign. It only prevents duplicates when the same
campanhaIdis fired again by mistake. - The history does not block sending a new campaign to students who only took part in previous campaigns of other materials.
- The
apenasNovosparameter restricts the dispatch to new registrations only (students without a sending history and without the legacyemailEnviadoflag). - Failed sends are stored as
FALHOUand can be retried on the next dispatch; onlyENVIADOrecords block redelivery of the same campaign.
POST /api/campanhas
Multipart/form-data parameters:
| Parameter | Type | Description |
|---|---|---|
titulo |
text | Campaign/material title. |
assunto |
text | Email subject. |
conteudo |
text | Email HTML content (HTML markup accepted). |
ordem |
text (optional) | Material display order (default: 999). |
pdf |
file (optional) | PDF file to attach. |
Returns the id of the created campaign, used in the dispatches.
POST /api/emails/disparar-banco
Parameters:
| Parameter | Type | Description |
|---|---|---|
campanhaId |
query | ID of the campaign to dispatch. |
apenasNovos |
query (optional) | true restricts sending to new registrations. Default: false. |
POST /api/emails/testar?campanhaId={id}&email={[email protected]}
Sends the campaign (with the PDF attached, if any) exclusively to the given email address, without recording history or changing the base.
POST /api/emails/disparar-csv
Multipart/form-data parameters:
| Parameter | Type | Description |
|---|---|---|
arquivo |
file | CSV file containing one email per line. |
assunto |
text | Email subject. |
conteudo |
text | Plain text email content. |
POST /api/emails/disparar-com-pdf
Multipart/form-data parameters:
| Parameter | Type | Description |
|---|---|---|
csv |
file | CSV file containing one email per line. |
pdf |
file | PDF file to attach to each email. |
assunto |
text | Email subject. |
conteudo |
text | Email HTML content (HTML markup accepted). |
- Java 25
- Spring Boot 4.0.6
- Spring Data JPA / Hibernate
- Spring Mail
- MySQL
- Lombok
- Maven
- JDK 25 or later installed.
- MySQL Server running locally or access to a database instance.
- SMTP account configured (e.g., Gmail with an App Password).
To run the application locally, create the application-dev.properties file in the src/main/resources folder with the settings below, replacing the fields between < > with your real data. This file is already ignored by .gitignore and must not be versioned:
# ===============================
# Local Database (MySQL)
# ===============================
spring.datasource.url=jdbc:mysql://localhost:3306/mensageria_db?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=<your_database_user>
spring.datasource.password=<your_database_password>
# ===============================
# JPA/Hibernate Settings
# ===============================
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# ===============================
# Email (Local Tests)
# ===============================
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=<[email protected]>
spring.mail.password=<sua_senha_de_app>
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=trueIn production, credentials are provided through environment variables (DB_URL, DB_USER, DB_PASSWORD, MAIL_USER, MAIL_PASSWORD), configured in the prod profile.
- Database and email credentials are never stored in the repository.
- The
application-dev.propertiesfile, used for local configuration, is part of.gitignore. - In production, all secrets are injected through environment variables.
- Clone the repository.
- Configure the environment properties as shown above.
- Run the
MensageriaApplicationclass. - The API will be available on port 8080.
By: Mauricio Filadelfo Filho.