← 返回博客
Webhook自动化事件驱动开发者

Webhook 驱动的邮件自动化:事件触发、解耦与可靠投递

用事件驱动架构解耦邮件发送逻辑,包括签名验证、幂等性和 Rovela Automations。

更新于 2026年10月12日
Webhook 驱动的邮件自动化:事件触发、解耦与可靠投递

Webhook 驱动的邮件自动化:事件触发、解耦、可靠投递

把发邮件的逻辑绑死在业务代码里,是最常见的技术债之一。Webhook + 消息队列的组合可以让你把"发什么邮件"从"业务做了什么"里解耦出来。

架构思路

业务系统触发事件 → 发到消息队列(或直接 POST 到邮件服务)→ 邮件服务根据事件类型决定发什么 → 送达用户。

用户完成支付
  └─ POST /webhooks/payment  { event: "payment.completed", orderId: "123" }
       └─ 邮件服务查模板,发订单确认

用 Rovela 接收 Webhook

Rovela 本身也会发 Webhook:当邮件被送达、打开、点击、退信时,你的服务器会收到通知。这让你可以做自动化跟进:

// 用户点击了邮件里的链接
app.post('/webhooks/rovela', (req, res) => {
  const { event, data } = req.body;
  if (event === 'email.clicked') {
    // 触发销售跟进流程
    salesQueue.add('follow-up', { userId: data.metadata.userId });
  }
  res.sendStatus(200);
});

验证签名

Rovela Webhook 带 HMAC 签名头,验证它,防止伪造请求:

const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}

幂等性

Webhook 可能重复投递。用事件 ID 去重:

const exists = await redis.set(
  `webhook:${event.id}`, '1', 'NX', 'EX', 86400
);
if (!exists) return res.sendStatus(200); // 已处理过

Rovela Automations

不想写这些代码?Rovela 的 Automations 功能支持在控制台里配置触发条件和邮件序列,适合营销类场景。事务邮件(订单确认、密码重置)通常还是走 API 更可控。