装好「日志推送」只是第一步。真正决定它好不好用的,是消息最后落在哪里——落在微信群里、落在手机锁屏上、还是落进一个你自己写的 Webhook。
它支持十个渠道,每个都有自己的脾气:钉钉要关键字、企业微信应用要可信 IP、邮件要用授权码不是密码、魔法推送填错地址会直接 403。这篇把它们整理成一份可对照的配置手册,内容来自仓库 docs/channels/ 下的各篇文档,重新归并、补上踩坑和排错。

一、先选渠道:按「你在哪看消息」决定
| 渠道 | 消息到达 | 需要什么 | 适合谁 |
|---|---|---|---|
| 企业微信(群机器人) | 微信群消息 | 注册企业微信 + 群机器人 Webhook | 首选,微信里直接看 |
| 企业微信应用 | 微信 / 企业微信(应用到人) | 自建应用 + 可信 IP | 想定向推给某人/某部门 |
| 钉钉 | 钉钉群 | 群机器人 + 自定义关键字 | 单位/团队用钉钉 |
| 飞书 | 飞书群 | 群机器人 Webhook | 团队用飞书 |
| Bark | iOS 通知(锁屏横幅) | Bark App + 设备 URL | iOS 用户最强的实时性 |
| PushPlus | 微信模板消息 | token | 已经有 PushPlus 账号 |
| SMTP 邮件 | 邮箱 | SMTP 服务器 + 授权码 | 要留档、要转发、无手机推送 |
| 魔法推送 | 自建聚合器转发 | 部署魔法推送 + 基础 URL + token | 想把多设备/多渠道统一管 |
| 通用 Webhook | 任意 HTTP 服务 | 一个接收地址 | 接 ntfy、Gotify、Home Assistant、n8n、自建服务 |
| MeoW | 手机通知 | MeoW App 注册昵称 | 想要最简配置的安卓/iOS 推送 |
我的建议是两个渠道起步:企业微信(进群,能回看历史)+ Bark(锁屏,能立刻看到)。一个负责”事后能查”,一个负责”当场就响”。重要的事两个都发,也不冲突——渠道是并行投递的。
二、三种配法,优先级记牢
同一个渠道可以用三种方式配置:
- Web 配置页:加渠道 → 选类型 → 填地址/JSON → 保存 → 页面底部「发送测试」。
config/config.json:直接写字段,如wechat_webhook_url、smtp_params、webhook_params。- 环境变量:如
WECHAT_WEBHOOK_URL、SMTP_PARAMS、WEBHOOK_PARAMS。
优先级:环境变量 > config.json / Web 页。谁被环境变量设过,读取配置时就直接跳过那个键——所以「环境变量里设过的东西,UI 上改不动」是设计,不是 bug。排查「改了配置不生效」时先看这一步。
多套渠道:pushplus_params、smtp_params、wecom_app_params、webhook_params、meow_params 都支持用竖线 | 分隔多份,例如:
{"token":"aaa"}|{"token":"bbb"}⚠️ 如果 JSON 内部本身要用 |(比如企业微信应用的 to_user),写成 \u007c,否则会被当成分隔符切开。通过 Web 页保存时会自动处理。
三、企微群机器人:一定要绑管理员微信
这是最多人卡住的一步,原因不在工具,在企业微信的注册流程:
- 打开 work.weixin.qq.com 注册企业(名字随便填,个人的也行);
- 必须绑定管理员微信,否则后面在微信里收不到消息;
- 进管理后台,在「我的企业 → 微信插件」相关设置里,注意那个一定不要勾选的选项(勾了就变成只能在企业微信 App 内接收);
- 登录企业微信,进默认群 → 右上角
...→ 消息推送 → 添加机器人 → 保存后拿到 Webhook。
拿到的那串 https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=... 等同于密码:谁拿到都能往你群里发消息。别截图外传、别提交到公开仓库。
顺手说个上限:企业微信群机器人是 20 条/分钟。这就是为什么一轮轮询的几十条事件会被合并成一条汇总发出去——逐条发的结局是被限流静默丢弃。
四、钉钉:安全设置里的关键字必须和标题前缀一致
钉钉群机器人有个安全设置,四项选一。选「自定义关键字」最简单,但关键字不能随便填:
它必须等于应用里的「事件标题前缀」(在配置页最下面「系统设置」里,默认 飞牛NAS)。因为钉钉校验的是消息体里有没有这个字符串,而标题前缀会拼进每条消息的标题。
对不上的症状很典型:钉钉那边不报错、日志里是成功、但消息就是不出现。
另外两个小坑:
- 钉钉建群至少两个人,所以先拉个人进来,建完群再踢掉;
- 如果改用「加签」方式,安全设置要换成签名,和关键字不能同时用。
五、飞书:可以个人建群,但别拉外部人员
飞书比钉钉宽松:允许一个人建群。步骤是 群设置 → 群机器人 → 添加机器人 → 自定义机器人 → 拿 Webhook。
两个注意:
- 个人账号不要拉外部人员(会触发企业间的限制,机器人可能发不出去);
- 安全设置可以留空,需要的话跟钉钉一样配关键字,关键字同样要和「事件标题前缀」一致。
飞书的 Webhook 填到应用里、渠道选「飞书」,就完事了。
六、企业微信应用:功能最强,但卡在可信 IP
如果你不想把消息发到群里,而是定向发给某个人 / 某部门 / 某标签,用自建应用:
- 管理后台「我的企业」页底部拿 企业ID(corpid);
- 「应用管理 → 自建 → 创建应用」,记下 AgentId 和 Secret(Secret 要在企业微信客户端里查看);
- 应用详情里把「可见范围」加上接收人,否则发不进去;
- 配置「企业可信IP」,填 NAS 出网的公网 IP。
第 4 步是主要痛点。没配的话接口返回:
60020 not allow to access from your ip家庭宽带的公网 IP 还会变,改了 IP 又失效。两个解法:
- 用有固定 IP 的服务器做反向代理转发到
https://qyapi.weixin.qq.com,然后把应用里的「API 地址」填成代理地址; - 或者接受现实,IP 变了就回来改一次。
另外 2022 年 6 月之后新建的应用,配置可信 IP 之前通常要先设「可信域名」或「接收消息服务器 URL」,按后台提示走。
配置 JSON 长这样:
{"corp_id": "ww1234567890abcdef", "corp_secret": "应用Secret", "agent_id": "1000002", "to_user": "@all"}to_user / to_party / to_tag 都为空时默认发给 @all(应用可见范围内的全部成员)。
七、Bark:一条 URL 就能推到锁屏
iOS 上最省事的就是 Bark:装上 App,首页直接显示你专属的 URL,复制到应用里、渠道选 Bark,完事。
想让通知好看一点,可以在 URL 里塞占位符 {content}:
https://api.day.app/你的Key/这是我的标题/{content}
https://api.day.app/你的Key/{content}?icon=https://day.app/assets/images/avatar.jpg第一行自定义标题,第二行自定义图标。{content} 会被替换成消息正文——这个占位符是你自己加的,不加也行。
八、SMTP 邮件:用授权码,不是登录密码
邮件是最容易被误配置的渠道,因为大家习惯填邮箱密码——但 SMTP 要的是授权码(也叫应用专用密码)。
准备:在邮箱服务商的设置里开启 SMTP 服务,生成授权码,记下服务器和端口。
{
"server": "smtp.qq.com",
"port": 465,
"username": "yourname@qq.com",
"password": "邮箱SMTP授权码",
"from": "飞牛告警",
"to": "receiver@example.com,backup@example.com"
}| 字段 | 必填 | 说明 |
|---|---|---|
server | 是 | 如 smtp.qq.com |
port | 否 | 不填默认 465 |
username | 是 | 通常就是完整邮箱地址 |
password | 是 | 授权码,不是网页登录密码 |
to | 是 | 多个收件人用英文逗号分隔 |
from | 否 | 显示名;不含 @ 时当作昵称,和登录邮箱组合显示 |
端口决定加密方式,不用手动开关:
465→ SMTP_SSL(隐式 TLS);- 其它端口(常见
587)→ 明文连接后 STARTTLS。
常用服务商对照:
| 服务商 | 服务器 | 端口 |
|---|---|---|
| QQ 邮箱 | smtp.qq.com | 465 / 587 |
| 网易 163 | smtp.163.com | 465 / 587 |
| Outlook / Microsoft 365 | smtp.office365.com | 587 |
| Gmail | smtp.gmail.com | 587(需应用专用密码) |
发不出去时按顺序查:授权码是不是最新的 → 端口和服务商要求是否一致 → 服务商那边有没有单独限制 SMTP。
九、魔法推送:别填反代域名
魔法推送 是一个自建推送聚合器:你在它里面配好多个下游渠道(Bark、企微、邮件…),然后「日志推送」只对着它发一次,由它分发。
两个值要记清:
- 基础 URL:服务根地址,不要带
/api/push。同机部署就填局域网http://192.168.1.10:818; - 访问令牌:在「接口管理」里那个推送接口的 token,不是登录用的 JWT。
三个高频错误:
| 现象 | 原因 |
|---|---|
HTTP 403 | 基础 URL 填成了 https://xxx.fnos.net 这类反代域名——容器从内网打公网域名回环,反代常直接拦掉。改成局域网 IP:端口 |
| 连不上 | 填了 localhost / 127.0.0.1,在 Docker 里指的就是容器自己 |
HTTP 400: 部分推送失败 | 已经打到魔法推送了,是它绑定的下游渠道失败,去魔法推送后台查 |
十、通用 Webhook:接任何东西
内置渠道里没有的平台——ntfy、Gotify、Server 酱、Home Assistant、n8n、自己写的服务——用「通用 Webhook」。返回 2xx 就算成功。
默认发 POST + JSON,体是 {"title": "标题", "content": "正文"}。需要鉴权或特定字段就展开「高级选项」填请求头或请求体模板:
{
"url": "https://example.com/hook",
"method": "POST",
"content_type": "json",
"headers": "Authorization: Bearer xxx",
"body": "{\"title\": \"{title}\", \"content\": \"{content}\"}"
}四个占位符:
| 占位符 | 内容 |
|---|---|
{title} | 消息标题 |
{content} | 消息正文 |
{text} | 标题 + 正文的完整纯文本 |
{time} | 发送时间 YYYY-MM-DD HH:MM:SS |
占位符会按内容类型自动转义——JSON 里转义引号和换行,表单和 URL 里做 URL 编码,纯文本原样替换。所以模板本身必须是合法 JSON,否则请求发不出去。
三个现成例子:
- ntfy:地址
https://ntfy.sh/你的主题,方法 POST,类型纯文本,体{text}; - Gotify:地址
https://gotify.example.com/message?token=xxx,JSON 体{"title": "{title}", "message": "{content}"}; - GET 推送:地址
https://example.com/push?msg={text},方法 GET(不发请求体)。
安全上做了一件事:运行日志里不会打印查询参数;配置页回显时,地址里的 token/key 和 Authorization、Token、Cookie 这类认证头都会打码,保存时没改过的打码值自动还原。所以你可以放心截图配置页。
十一、MeoW:填个昵称就能收,但别填错
MeoW 是手机推送 App,配置只需要一个昵称:
{"nickname": "你的昵称", "url": "http://192.168.1.10:5666"}url 可选,填了点通知能跳转(比如直接打开 NAS 首页)。
它有三个硬限制,必须知道:
- 非会员频率限制:3 秒 1 条、每分钟 15 条、每小时 60 条、每天 1000 条,超了返
429; - 昵称未注册会累计封禁 IP:同一 IP 一天内 3 次推到未注册昵称就封。所以「日志推送」收到「昵称未注册」后会自动暂停向该昵称推送,等你改对昵称保存后恢复;
- 别从多人共享的公共出口 IP 推(容易被判成攻击)。
事件多的时候记得开「轮询汇总模式」,不然很容易撞到限频。
十二、别被自己的工具吵到
渠道配完,最该调的不是渠道,是节奏。四个开关:
| 开关 | 作用 | 建议 |
|---|---|---|
| 事件勾选 | 只推你关心的事件 | 先把「登录失败 / 硬盘异常 / 容器崩溃 / UPS」勾上,其余先关 |
| 轮询汇总模式 | 短时间多条并成一条 | 事件多、或用 MeoW/邮件这类有频率限制的渠道时开 |
| 极简推送 | 全部压成一行关键信息 | 只看”有没有事”的阶段开,看细节时关 |
| 勿扰模式 | 时段内不推,结束后汇总一条 | 默认 22:00–07:00,跨日自动处理 |
再加一层兜底:300 秒去重窗口——同一事件 5 分钟内只推一次。一块硬盘反复唤醒、SSH 被人爆破,都靠这个和 5 秒合并窗口挡住,否则手机真的会被震到没电。
十三、排错对照表
配完不成功,先查这张表再看日志:
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 企业微信不弹消息 | 没绑管理员微信 / 勾了「仅在企业微信接收」 | 回第 3 节重走一遍 |
| 钉钉日志成功但没消息 | 自定义关键字 ≠ 事件标题前缀 | 改成和 title_prefix 一致(默认 飞牛NAS) |
| 飞书发不出 | 群里拉了外部人员 | 换成纯内部群 |
60020 | 企业微信应用未配可信 IP | 加公网 IP,或用固定 IP 反代 |
40001 / 40013 | corpid 或 Secret 错 | 注意 Secret 与应用(AgentId)要对应 |
81013 | 接收对象不在应用可见范围 | 去应用详情加可见范围 |
邮件 535 / 认证失败 | 用了登录密码而不是授权码 | 重新生成授权码 |
| 邮件超时 | 端口与加密方式不匹配 | 465 或 587,按服务商要求 |
魔法推送 403 | 基础 URL 用了 *.fnos.net 反代 | 换成局域网 IP:端口 |
魔法推送 400 部分推送失败 | 下游渠道失败 | 去魔法推送后台查 |
MeoW 429 | 撞频率限制 | 开轮询汇总,或升级会员 |
MeoW 404 | 昵称未注册/拼错 | 改对昵称保存即恢复 |
| Webhook 没反应 | 模板不是合法 JSON | 先在本地验证 JSON |
| 全部渠道静默 | 环境变量覆盖了配置 | 查 *_PARAMS 等变量 |
十四、最后一句
十个渠道看着多,实际常用的就两三个。先把一个配通、把「发送测试」点绿、再往上加——比一次配五个然后不知道哪一步错了要快得多。
配置页最下面的「发送测试」就是为这个存在的,它会把每个渠道的结果分开列出来:哪个成功、哪个失败、失败返回了什么。
相关阅读:
- 安装与部署(Docker / 应用中心两种装法):FnMessageBots:让 NAS 主动给你发消息
- 它是怎么实现的(轮询、去重、投递与重试):FnMessageBots 项目主页
- 各渠道原始文档:
docs/channels/
