如何在mailcow的基础上增加webhook的功能【思路】

如何在 Mailcow 上增加 Webhook 功能【思路】

在使用 Mailcow 搭建邮件平台时,我们常常会有这样的需求:

当邮箱发生某些事件(如新邮件到达、用户登录、邮件被读取等),希望能够自动触发通知,推送到业务系统或外部 API。

这时就需要 Webhook 功能。本文将分享几种在 Mailcow 上实现 Webhook 的思路。


Mailcow 架构概览 🐳

Mailcow 是一个基于 Docker 的邮件解决方案,主要组件包括:

  • Postfix:邮件收发核心
  • Dovecot:IMAP/POP3 服务
  • Rspamd:垃圾邮件过滤
  • SOGo:Webmail
  • Redis + MariaDB:存储与缓存

要实现 Webhook,我们需要找到合适的事件捕捉点。


可选的事件切入点

1. Postfix 过滤器

  • postfix-mailcow 容器中挂载 Milter 或 Postfilter
  • 可以捕捉到邮件投递/转发事件
  • 常见用例:新邮件到达时触发 Webhook

2. Dovecot 事件导出

  • Dovecot 支持 doveadm event export
  • 可捕捉:用户登录、邮件读取、移动、删除等行为
  • 事件以 JSON 输出,可以直接封装成 HTTP 请求

3. Redis 监听(推荐 ✅)

  • Mailcow 内部通过 Redis 分发部分事件
  • 新建一个独立容器,订阅 Redis channel
  • 收到事件后转发为 Webhook(HTTP POST)

优点:

  • 与 Mailcow 解耦,不改动核心服务
  • 扩展性强,可统一处理多种事件

一个最小可行 Demo

以下是 Redis 监听方案 的 Node.js 示例:

js 复制代码
const redis = require("redis");
const axios = require("axios");

// 连接 Mailcow 的 Redis
const client = redis.createClient({ url: "redis://mailcow-redis:6379" });
client.connect();

// 订阅 Postfix 邮件队列事件
client.subscribe("POSTFIX_QUEUEID", (message) => {
  console.log("New mail event:", message);
  axios.post("https://example.com/webhook", {
    event: "mail_received",
    data: message
  });
});