Cada chamada enviada pela Mailpro contém cabeçalhos que permitem autenticá-la:
X-Mailpro-Signature : t=1758000000,v1=5a72…c8b1
X-Mailpro-Event-Id : evt_5f2c…
X-Mailpro-Event-Type: email.delivered
X-Mailpro-Attempt : 1
Cálculo da assinatura
v1 é o HMAC-SHA256, em hexadecimal minúsculo, da cadeia t + "." + corpo bruto do pedido, calculado com o segredo entregue na criação do webhook. O corpo deve ser usado tal como foi recebido, antes de qualquer descodificação JSON.
// Node.js
const crypto = require("crypto");
function verify(rawBody, header, secret) {
const t = header.match(/t=([0-9]+)/)[1];
const v1 = header.match(/v1=([0-9a-f]+)/)[1];
const expected = crypto.createHmac("sha256", secret).update(t + "." + rawBody).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(t)) < 300; // 5 minutos
return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}
Boas práticas
- Rejeite qualquer pedido cuja assinatura não corresponda, ou cujo carimbo temporal
ttenha mais de alguns minutos (proteção contra repetição). - Utilize
X-Mailpro-Event-Idpara ignorar um evento já processado: a mesma entrega pode ser apresentada várias vezes em caso de nova tentativa. - Responda 2xx em menos de 10 segundos e processe depois a mensagem de forma assíncrona.
- Após Renovar o segredo, o antigo é invalidado de imediato: atualize primeiro o seu servidor, ou tolere um minuto de assinaturas rejeitadas.
Os webhooks de destino da automação (sentido B) seguem o mesmo princípio, com o cabeçalho X-Mailpro-Automation-Signature e a chave de assinatura opcional que definir no destino.