Envio de e-mail
Pré-requisitos de acesso
- Permissão (módulo): acesso liberado pelo guard administrativo da rota (
admin). Não há módulo dinâmico específico para esta tela — qualquer operador com acesso ao BackOffice e ao grupo de Comunicação consegue abri-la. - Licença/Feature: Nenhuma.
- Contêiner do menu: GERAL → grupo Comunicação (ícone
campaign) → Envio de e-mail.
O que é / quando usar
Tela para criar e agendar disparos de e-mail em massa (ou para uma lista de destinatários específicos) a partir do BackOffice. Use para comunicados, campanhas promocionais, avisos operacionais e mensagens de relacionamento, sem precisar de deploy ou ferramenta externa. Cada disparo criado vira uma "ação em massa" (entidade MassActions, action = 'EMAIL') que fica numa fila e é processada por um scheduler do CommunicationGateway — não há envio síncrono no momento do "Confirmar".
Pré-condições
- Permissão: o item está sob o guard
adminda rota. Lembre que no Axia a permissão é dupla (enum CPM no backend + módulo dinâmico no DB); aqui o gate efetivo é o guard de rota, então valide que o operador tem perfil administrativo. - Licença/Feature: nenhuma feature de licença é exigida para abrir a tela.
- Dependências de outras telas: no modo single (destinatário individual), o e-mail digitado é validado contra a base de usuários — só entra na lista quem possui conta/carteira cadastrada. Para o conteúdo visual final dos e-mails, o Template Master define o "envelope" HTML aplicado aos disparos.
Passo a passo
- Acesse o menu Comunicação → Envio de e-mail.
- A tela lista os disparos já criados, com as colunas Quando, Assunto, Status e ações de editar/excluir.
- Clique em Novo / Criar para abrir o modal de criação.
- Escolha o público no seletor superior: Todos (
all) ou Individual (single). - No modo Individual, digite cada e-mail e clique no botão + para validá-lo e adicioná-lo como chip; repita para cada destinatário.
- Preencha Assunto, Mensagem e Data de agendamento.
- Clique em Confirmar. O disparo é criado com status inicial e entra na fila do scheduler.
Campos
Listagem
| Coluna | O que mostra | Origem do dado |
|---|---|---|
Quando (when) | Data de criação/agendamento do disparo | Campo when/scheduleTo da MassActions |
Assunto (subject) | Assunto do e-mail | Campo subject |
Status (status) | Estado do disparo: CREATED/PENDING (na fila), EXECUTED (enviado), CANCELLED (cancelado) | Campo status, atualizado pelo scheduler |
| Editar | Reabre o modal em modo edição | — |
| Excluir | Cancela o disparo (não apaga: marca status = 'CANCELLED') | — |
Modal de criação/edição
| Campo | O que é | Obrigatório? | Efeito no sistema/backend |
|---|---|---|---|
| Público (Todos / Individual) | Define se o disparo vai para toda a base ou para uma lista | Sim | No backend, all = true faz o handler buscar todos os usuários (getAllUsers) e criar um registro mass_actions_users PENDING por usuário; all = false cria um registro por e-mail da lista. No modo edição, o toggle fica bloqueado (não dá para trocar o público de um disparo existente). |
| E-mail (só no modo Individual) | Destinatário a ser adicionado | Condicional (≥1 no modo Individual) | Ao clicar +, o e-mail é validado contra a base via getUserByEmailWallet: só é aceito se existir usuário/carteira correspondente. Vira um chip; o disparo não confirma com a lista vazia no modo Individual. |
Assunto (subject) | Linha de assunto do e-mail | Sim | Gravado em MassActions.subject (máx. 100 caracteres). Usado como subject no envio real. |
Mensagem (message) | Corpo do e-mail | Sim | Gravado em MassActions.message. Suporta HTML e o token de personalização @user.name (ver Regras). É injetado tanto em bodyData quanto em htmlData no envio. |
Data (when) | Data a partir da qual o disparo pode ser processado | Sim | Mínimo = hoje (não permite passado). O scheduler roda a cada 30 minutos e processa a fila; a data baliza o agendamento do disparo. |
Ações e modais
- Criar (Confirmar): cria a
MassActions(action = 'EMAIL',status = 'CREATED') e os registros de destinatárioPENDING. Após salvar, a tela recarrega. - Editar: permite ajustar Assunto, Mensagem e Data de um disparo existente; o público (Todos/Individual) e a lista de e-mails ficam somente leitura. Ao salvar, o disparo volta para
status = 'CREATED'. - Excluir: não remove fisicamente — marca o disparo como
CANCELLED, retirando-o do processamento. - Step-up / MFA: esta tela não dispara re-autenticação por padrão. Trate o disparo em massa como ação sensível na operação (público amplo, irreversível após envio).
Regras de negócio / cuidados
Atenção
- O e-mail individual só é aceito se já existir na base (validação
getUserByEmailWallet). Endereços externos/desconhecidos não entram na lista. - O envio não é imediato: o
CommunicationSchedulerroda no cron*/30 * * * *(a cada 30 min). Após "Confirmar", há latência até o disparo sair. - A mensagem aceita HTML. Como o corpo é injetado em
bodyDataehtmlData, HTML mal formado pode quebrar a renderização em provedores como Mailgun/Brevo/SendGrid (no SES o problema fica mascarado). - Personalização: se a mensagem contiver
@user.name, o scheduler busca o primeiro nome do usuário e substitui o token por destinatário. Sem o token, a mensagem é enviada literal.
Irreversível
- Depois que o scheduler processa o disparo, não há rollback do e-mail enviado. Excluir/cancelar só impede disparos ainda
PENDING— e-mails jáEXECUTEDpermanecem entregues. Revise público, assunto e corpo antes de confirmar, especialmente no modo Todos (atinge a base inteira).
- Idempotência: o processamento é idempotente por destinatário — cada
mass_actions_userssó é enviado quando estáPENDINGe passa aEXECUTEDapós o envio. Reexecuções do scheduler não reenviam quem já recebeu. Ao final, aMassActionstambém vai paraEXECUTED. - Observação sobre o estado: disparos
CANCELLEDsão ignorados pelo scheduler.
Exemplos
Cenário 1 — Comunicado para toda a base
- Novo → público Todos.
- Assunto:
Manutenção programada no fim de semana. - Mensagem (HTML simples):
<p>Olá @user.name, faremos manutenção no sábado das 2h às 5h.</p>. - Data: hoje.
- Confirmar. O handler cria um registro
PENDINGpara cada usuário da base; no próximo ciclo do scheduler (≤ 30 min) cada um recebe o e-mail com seu primeiro nome no lugar de@user.name. Status do disparo passa aEXECUTED.
Cenário 2 — Disparo individual para uma lista curta
- Novo → público Individual.
- Digite
joao@cliente.com, clique + (validado contra a base → vira chip). Repita paramaria@cliente.com. - Assunto e mensagem normais; Data: hoje.
- Confirmar. Apenas os 2 destinatários recebem registros
PENDING. Se um e-mail não existir na base, o + não o adiciona e ele fica de fora.
Cenário 3 — Corrigir o assunto de um disparo ainda não enviado
- Na listagem, clique em Editar de um disparo
CREATED/PENDING. - O seletor de público e a lista de e-mails aparecem bloqueados; ajuste apenas Assunto ou Mensagem.
- Confirmar. O disparo volta para
CREATEDe será reprocessado pelo scheduler. Destinatários que ainda estãoPENDINGrecebem a versão corrigida; quem já estáEXECUTEDnão é afetado.