如何在 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
});
});