Validador de E-mail — Checkout VTEX¶
Barra cadastro com e-mail descartável no checkout da loja useveggi.com.br e corrige erro de digitação de domínio (gmail.con → gmail.com).
Está no ar e funcionando sozinho
No ar desde 25/08/2026. Não precisa de manutenção diária — só quando aparecer domínio de ataque novo.
Onde fica¶
| Item | Valor |
|---|---|
| Worker | veggi-validador-email |
| URL | https://veggi-validador-email.veggiageral.workers.dev |
| KV binding | CACHE — id 1a13f74b2f384fa484d2823e32ec9adc |
| Código-fonte | C:\Projetos\vtex-analise\validador\ |
| Snippet no checkout | já colado em checkout6-custom.js (VTEX Admin) |
Arquivos do projeto¶
| Arquivo | Papel |
|---|---|
validador-core.mjs |
Regras — listas de domínios, MX, correções de digitação. Compartilhado entre Worker e CLI |
worker.js |
O Cloudflare Worker — API de validação em tempo real |
frontend-snippet.js |
Trecho que vai no formulário / checkout |
higieniza.mjs |
CLI Node — passa um CSV do RD pelo mesmo núcleo de regras |
wrangler.jsonc |
Configuração de deploy, KV e CORS |
Endpoints¶
Endereço base
https://veggi-validador-email.veggiageral.workers.dev
As rotas abaixo são o caminho depois desse endereço.
| Rota | Método | Resposta |
|---|---|---|
/validar |
POST | {permitir, status, risco, motivos[], sugestao, mensagem} |
/validar-cpf |
POST | {permitir, status, risco, motivos[], mensagem} — ver Bloquear E-mail e CPF |
/stats |
GET | Contadores do dia por status |
Chaves na KV¶
| Chave | Conteúdo |
|---|---|
dom:<dominio> |
Cache de DNS por domínio, 7 dias |
blocklist |
Domínios bloqueados — alimentada pelo vigia-dominios.py |
blocklist-emails |
E-mails bloqueados um a um — ver Bloquear E-mail e CPF |
blocklist-cpfs |
Hashes SHA-256 de CPF — o número nunca é gravado |
Variável de ambiente¶
| Variável | Valor atual |
|---|---|
ORIGENS_PERMITIDAS |
https://www.useveggi.com.br,https://useveggi.com.br,https://useveggi.myvtex.com |
Warning
Se a loja passar a usar outro domínio ou subdomínio, ele precisa ser acrescentado em ORIGENS_PERMITIDAS no wrangler.jsonc — senão o navegador bloqueia a chamada do checkout por CORS.
Quando aparecer domínio novo de ataque¶
Bloqueio imediato, sem deploy¶
O vigia-dominios.py já grava o arquivo da lista e imprime o comando pronto. Vale na hora, sem deploy:
cd "C:\Projetos\vtex-analise\validador"
wrangler kv key put --binding=CACHE blocklist --path blocklist-dominios.json --remote
Sempre --path, nunca o JSON na linha de comando
Até 28/08/2026 esta página mandava passar o JSON direto no comando:
Isso não funciona no PowerShell. Ele remove as aspas duplas ao repassar argumento para programa externo, e a KV recebe [novo1.com] — JSON inválido. O wrangler diz que gravou, nenhum erro aparece, e o bloqueio simplesmente não acontece.
Pior: até a correção do Worker no mesmo dia, uma lista ilegível derrubava a validação inteira — a exceção subia até o handler, que por princípio libera a venda quando algo quebra. Uma chave torta desligava o validador em silêncio.
O --path resolve porque o texto nunca passa pelo shell. Detalhes em Bloquear E-mail e CPF.
Confira sempre o que subiu — tem que sair com aspas em volta de cada domínio:
A chave blocklist não existia até 28/08/2026
O kv key get respondia 404: ela nunca chegou a ser criada. Essa camada nunca esteve ativa. Será criada no primeiro bloqueio de domínio feito pelo caminho novo.
Se o domínio já tiver sido consultado antes, o resultado está em cache por 7 dias. Limpe:
Bloqueio permanente (recomendado depois de confirmar)¶
- Abrir
validador-core.mjs - Acrescentar o domínio em
DOMINIOS_DESCARTAVEIS - Publicar:
Vários domínios com o mesmo MX
Prefira acrescentar o hostname em MX_HOSTS_DESCARTAVEIS (ou o IP em MX_IPS_DESCARTAVEIS). Isso pega os próximos automaticamente, inclusive domínios que ainda nem existem, sem precisar atualizar nada.
Para descobrir o IP do MX de um domínio:
node -e "const d=require('dns').promises;(async()=>{const mx=await d.resolveMx('DOMINIO');console.log(mx[0].exchange,await d.resolve4(mx[0].exchange))})()"
Testar se está funcionando¶
curl.exe -s -X POST "https://veggi-validador-email.veggiageral.workers.dev/validar" -H "Content-Type: application/json" -d "{\"email\":\"teste@bocably.com\"}"
Deve responder "permitir":false. Com um e-mail seu, "permitir":true.
curl.exe, com o .exe
No PowerShell, curl sozinho é apelido para Invoke-WebRequest, que não entende -X, -H nem -d. Escrever curl.exe chama o programa de verdade. A versão anterior desta página omitia o .exe e quebrava.
Desligar às pressas¶
Se o validador estiver barrando cliente legítimo e for preciso parar já:
- VTEX Admin → Loja → Checkout → Código →
checkout6-custom.js - Apagar o bloco que começa com
// VEGGI — validacao de e-mailaté o})();final - Salvar
O checkout volta ao normal na hora.
Nunca apague nada acima desse bloco
Ali estão os scripts da Pagaleve e o campo de código de lojista.
Cuidados ao mexer no checkout¶
Faça backup antes
Sempre copie o conteúdo atual do checkout6-custom.js para um arquivo local antes de editar. A VTEX não tem histórico de versão nesse editor.
| Situação | O que acontece / o que fazer |
|---|---|
| Testar duas vezes seguidas | Aguarde 2 minutos entre tentativas. A loja tem minimumPurchaseDowntimeSeconds = 120 e tentativas seguidas retornam CHK0328 / 429 — parece defeito, mas não é |
Testar logado como admin (nat@veggi.com.br) |
Causa erro ORD062 / 401 na hora de pagar. Use conta de cliente comum |
| Testar um pedido até o fim sem pagar | Escolha Pix e clique em finalizar. O pedido é criado, o QR aparece e você simplesmente não paga. Cancele no admin depois para não poluir o relatório do mês |
O que este validador não faz¶
Não confirma se a caixa postal existe. Handshake SMTP (RCPT TO) não funciona contra Gmail/Outlook/Yahoo — eles respondem OK para qualquer endereço — e Workers não abrem porta 25. Nenhum validador pago resolve isso para os grandes provedores.
Info
O snippet no navegador segura o usuário honesto que errou o domínio. Bot não roda JavaScript. Contra automação o que vale é o Worker como validação server-side antes de gravar o lead — se a entrada for por API ou webhook, chame /validar ali também.
Diagnóstico¶
| Sintoma | Causa provável e ação |
|---|---|
| Cliente legítimo barrado no checkout | Ver logs em Cloudflare → Workers → veggi-validador-email → Observability (observability já está ligado). Se for urgente, remover o bloco do checkout6-custom.js |
| Nenhuma validação acontece no checkout | Bloco apagado do checkout6-custom.js ou erro de JS antes dele. Abrir DevTools (F12) → Console |
| Console mostra erro de CORS | Domínio da loja fora de ORIGENS_PERMITIDAS. Acrescentar no wrangler.jsonc e wrangler deploy |
| Domínio bloqueado continua passando | Resultado em cache (7 dias). Rodar wrangler kv key delete --binding=CACHE "dom:<dominio>" --remote |
| Blocklist parou de barrar domínios antigos | O put na chave blocklist substitui a lista inteira — algum comando anterior sobrescreveu. Regravar com a lista completa |
wrangler não encontrado |
npm i -g wrangler |