TIP
这篇文档帮你完成系统消息通知配置。你可以按渠道准备机器人或 SMTP 信息,再创建应用级渠道配置和 dataset 级通知通道,最后用一次真实操作检查是否发送成功。
什么时候用消息通知
当系统里的数据新增、修改、删除或特定接口被调用后,需要把结果推送到群、Webhook 接收方或邮箱时,使用消息通知。
| 你想完成的事 | 推荐渠道 | 配置重点 |
|---|---|---|
| 把业务变更推到飞书群 | FEISHU Webhook | 准备飞书自定义机器人 Webhook 地址和安全设置 |
| 把业务变更推到钉钉群 | DINGTALK | 准备钉钉自定义机器人 Webhook、加签或关键词规则 |
| 把通知交给外部系统处理 | WEBHOOK | 按接收方 HTTP API 准备 URL、Header、鉴权和请求体要求 |
| 把通知发给固定邮箱或按角色解析出的邮箱 | 准备 SMTP 发件配置,并确认收件人来源 |
TIP
本文只写飞书 Webhook 模式,不展开飞书 APP 模式。飞书 APP 通知涉及应用授权、可见范围和接收人解析,配置口径与群机器人不同。
先选通知渠道
先确认通知要发到哪里,再准备对应渠道的官方配置。
| 渠道 | 适合场景 | 官方配置规范 |
|---|---|---|
| FEISHU Webhook | 飞书群内接收业务通知 | 飞书自定义机器人使用指南 |
| DINGTALK | 钉钉群内接收业务通知 | 钉钉自定义机器人创建与安装 |
| WEBHOOK | 发送到自建服务、自动化平台或第三方 HTTP 入口 | 按接收方官方 HTTP API 文档确认 URL、Header、鉴权和请求体 |
| 发送邮件通知,适合审批、告警、结果抄送 | RFC 3207 STARTTLS、RFC 8314 邮件传输 TLS 建议 |
准备信息
[ ] 已确认要配置的应用和 dataset。
[ ] 已确认触发通知的接口编号,优先使用
triggerConfig.interfaceCodes。[ ] 已准备渠道侧 Webhook、签名密钥或 SMTP 发件配置。
[ ] 已准备消息标题、摘要、字段展示和跳转按钮。
配置流程
TIP
消息通知分两层配置:先创建应用级渠道配置,再创建 dataset 级通知通道。不要把消息模板写进应用级渠道配置。
| 配置层级 | 保存什么 | 不要放什么 |
|---|---|---|
| 应用级渠道配置 | Webhook 地址、SMTP 地址、签名密钥、发件账号、请求头等协议配置 | messageTemplate、EMAIL 收件人、触发规则 |
| dataset 级通知通道 | channelConfigId、触发规则、interfaceCodes、sceneCode、triggerConfig.messageTemplate、EMAIL 收件目标 | 真实密钥、SMTP 密码、机器人 token 明文展示给无关人员 |
步骤 1:创建应用级渠道配置
在通知渠道配置入口选择渠道类型,填写该渠道的协议配置。保存后会得到一个应用级渠道配置 ID。
{
"channelType": "FEISHU",
"channelConfig": {
"webhookUrl": "https://open.feishu.cn/open-apis/bot/v2/hook/<BOT_TOKEN>",
"signSecret": "<SIGN_SECRET>"
}
}完成后,检查列表里是否出现该渠道配置,并确认状态可用。
步骤 2:创建 dataset 级通知通道
在目标 dataset 下创建通知通道,选择上一步得到的 channelConfigId,再配置触发接口和消息模板。
{
"channelConfigId": "<CHANNEL_CONFIG_ID>",
"channelType": "FEISHU",
"triggerConfig": {
"sceneCode": "DATASET_CHANGE",
"interfaceCodes": ["DATA_CREATE", "DATA_UPDATE"],
"messageTemplate": {
"mode": "CUSTOM",
"version": "v1",
"templateType": "STANDARD_CARD",
"theme": "blue",
"title": "${event.operation} 通知",
"summary": "数据已发生变化",
"facts": [
{"label": "数据集", "value": "${context.datasetName}"},
{"label": "操作人", "value": "${event.operatorName}"}
]
}
}
}步骤 3:启用通道并触发一次真实操作
启用通知通道后,在对应 dataset 上执行一次会命中 interfaceCodes 的操作。看到目标群或邮箱收到消息,说明配置生效。
WARNING
新配置优先使用 triggerConfig.interfaceCodes 描述 CRUD 或接口触发范围。operations 只作为历史兼容概念,不作为新配置口径。
操作流程
TIP
这一节把消息通知配置拆成两个独立页面:先在应用级页面注册通知渠道,再在 dataset 页面注册通知通道。渠道注册保存协议配置;通道注册保存触发规则和消息模板。
| 页面 | 注册对象 | 保存内容 |
|---|---|---|
| 渠道管理 | 应用级通知渠道 | Webhook 地址、签名密钥、SMTP 等协议配置。 |
| dataset 消息通知 | dataset 级通知通道 | channelConfigId、interfaceCodes、messageTemplate 等触发和内容配置。 |
Step 1:注册应用级通知渠道
TIP
完成这个场景后,应用里会出现一个可复用的 FEISHU Webhook 渠道配置。后续多个 dataset 通知通道都可以绑定它。
- 打开应用管理里的“通知配置”,进入“渠道管理”列表。
- 点击“新增通知渠道”。页面右侧会打开新增抽屉。
- 渠道类型选择“飞书”,填写配置名称、描述、端点地址和渠道配置。
- 点击“创建”。回到列表后,看到新渠道出现在第一行,说明渠道注册完成。
| 字段 | 填写内容 | 注意事项 |
|---|---|---|
| 配置名称 | 填写便于识别的名称。 | 建议带业务场景或测试时间,方便在通道注册时选择。 |
| 端点地址 | 填写飞书自定义机器人 Webhook 地址。 | 截图和客户文档中只展示打码值。 |
| 渠道配置 | 填写协议相关 JSON,例如机器人模式和签名密钥。 | 这里只放协议配置,不写 messageTemplate。 |
渠道注册截图
渠道注册界面


Step 2:注册 dataset 级通知通道
TIP
完成这个场景后,当前 dataset 会新增一条通知通道。runtime 会根据 interfaceCodes 命中触发接口,再通过绑定的应用级渠道发送消息。
- 打开目标 dataset,切换到“消息通知”页签。
- 点击“新通知”。页面右侧会打开新增通知抽屉。
- 填写通知名称和说明,勾选需要触发通知的接口。
- 在“通知渠道”中选择前面注册的应用级渠道。
- 填写消息标题和消息内容,保持状态为“启用”。
- 点击“创建”。回到列表后,看到新通道出现在第一行,说明通道注册完成。
| 字段 | 填写内容 | runtime 消费方式 |
|---|---|---|
| 触发接口 | 勾选数据新增、数据更新等接口。 | 保存到 triggerConfig.interfaceCodes。 |
| 通知渠道 | 选择应用级通知渠道。 | 保存为 channelConfigId,用于找到协议配置。 |
| 消息标题和内容 | 填写要发送给接收方的标题和正文。 | 保存到 triggerConfig.messageTemplate。 |
通道注册截图


WARNING
这组截图只验证注册流程和列表状态,没有触发真实消息发送。需要发送验收时,请使用专门的测试机器人和测试数据。
调用规则
运行态只读取已经落到通知通道里的字段。配置页面可以按业务组织表单,但最终要确认这些字段已经落到运行态能消费的位置。
| 消费点 | 运行态读取字段 | 结果 |
|---|---|---|
| CRUD 触发匹配 | triggerConfig.interfaceCodes | 当前接口编号命中后才发送通知 |
| 手动触发匹配 | triggerConfig.sceneCode | 场景编码一致后才发送通知 |
| 消息模板解析 | triggerConfig.messageTemplate | 作为新模板主来源;channelConfig.messageTemplate 只做历史数据兜底 |
| 渠道协议配置 | endpointUrl、channelConfig | 不同渠道会把这些字段转换成不同的 HTTP 请求或 SMTP 邮件 |
WARNING
operations 不参与当前运行态匹配。新配置不要依赖它判断新增、修改或删除。
按渠道配置
FEISHU Webhook
用于把通知发送到飞书群。runtime 按 Webhook 群机器人方式发送飞书 interactive 卡片,不展开飞书 APP 模式。
| runtime 消费字段 | 消费方式 | 最终效果 |
|---|---|---|
| Webhook URL | endpointUrl | 作为 HTTP POST 目标地址 |
| 签名密钥 | channelConfig.signSecret | 生成飞书要求的 timestamp 和 sign |
| 消息模板 | triggerConfig.messageTemplate | 渲染卡片标题、主题色、摘要、字段和按钮 |
{
"channelType": "FEISHU",
"endpointUrl": "https://open.feishu.cn/open-apis/bot/v2/hook/<BOT_TOKEN>",
"channelConfig": {
"signSecret": "<SIGN_SECRET>"
},
"triggerConfig": {
"interfaceCodes": ["DATA_CREATE"],
"messageTemplate": {
"mode": "CUSTOM",
"version": "v1",
"templateType": "STANDARD_CARD",
"theme": "blue",
"title": "数据变更通知",
"summary": "有一条数据已新增"
}
}
}{
"msg_type": "interactive",
"timestamp": "<EPOCH_SECONDS>",
"sign": "<FEISHU_SIGN>",
"card": {
"header": {
"template": "blue",
"title": {"tag": "plain_text", "content": "数据变更通知"}
},
"elements": [
{"tag": "div", "text": {"tag": "lark_md", "content": "有一条数据已新增"}}
]
}
}官方规范:飞书自定义机器人使用指南。
DINGTALK
用于把通知发送到钉钉群。runtime 会把标准消息模板渲染成钉钉 markdown 消息。
| runtime 消费字段 | 消费方式 | 最终效果 |
|---|---|---|
| Webhook URL | endpointUrl | 作为 HTTP POST 目标地址 |
| 签名密钥 | channelConfig.signSecret | 有值时把 timestamp 和 sign 追加到 URL |
| @ 设置 | channelConfig.atAll、channelConfig.atMobiles | 写入钉钉消息体的 at 字段 |
| 消息模板 | triggerConfig.messageTemplate | 渲染 markdown 标题、正文、字段和链接 |
{
"channelType": "DINGTALK",
"endpointUrl": "https://oapi.dingtalk.com/robot/send?access_token=<ACCESS_TOKEN>",
"channelConfig": {
"signSecret": "<SIGN_SECRET>",
"atAll": false,
"atMobiles": ["13800000000"]
},
"triggerConfig": {
"interfaceCodes": ["DATA_UPDATE"],
"messageTemplate": {
"mode": "CUSTOM",
"version": "v1",
"templateType": "STANDARD_CARD",
"theme": "orange",
"title": "数据更新通知",
"summary": "有一条数据已更新"
}
}
}{
"msgtype": "markdown",
"markdown": {
"title": "数据更新通知",
"text": "### 数据更新通知\n\n有一条数据已更新"
},
"at": {
"isAtAll": false,
"atMobiles": ["13800000000"]
}
}官方规范:钉钉自定义机器人创建与安装。
WEBHOOK
用于把通知发送到自建服务或第三方 HTTP 入口。runtime 会把标准消息和原始触发 payload 一起发给接收方。
| runtime 消费字段 | 消费方式 | 最终效果 |
|---|---|---|
| 请求地址 | endpointUrl | 作为 HTTP POST 目标地址 |
| 请求头 | channelConfig.headers | 当前 runtime 直发路径不消费;不要把 Header 鉴权写成已生效能力 |
| 消息模板 | triggerConfig.messageTemplate | 渲染 message 对象 |
| 触发上下文 | 触发时的 payload | 原样放入请求体的 payload 对象 |
TIP
如果接收方必须使用 Header、签名或 Bearer Token,请先确认运行态是否已实现对应能力;当前直发路径不会读取 channelConfig.headers。
{
"channelType": "WEBHOOK",
"endpointUrl": "https://example.com/notification/webhook",
"channelConfig": {
"headers": {
"Authorization": "Bearer <TOKEN>"
}
},
"triggerConfig": {
"interfaceCodes": ["DATA_CREATE"],
"messageTemplate": {
"mode": "CUSTOM",
"version": "v1",
"templateType": "STANDARD_CARD",
"theme": "blue",
"title": "数据新增通知",
"summary": "请处理新增数据"
}
}
}{
"channel": {
"channelCode": "<CHANNEL_CODE>",
"channelName": "业务通知",
"channelType": "WEBHOOK"
},
"message": {
"templateType": "STANDARD_CARD",
"theme": "blue",
"title": "数据新增通知",
"summary": "请处理新增数据",
"facts": [],
"actions": []
},
"payload": {
"interfaceCode": "DATA_CREATE",
"recordId": "<RECORD_ID>"
}
}EMAIL
用于发送邮件通知。EMAIL 不走 HTTP Webhook,调用时 会把 endpointUrl 解析成 SMTP/SMTPS 主机和端口。
| runtime 消费字段 | 消费方式 | 最终效果 |
|---|---|---|
| SMTP 地址 | endpointUrl | 解析 smtp:// 或 smtps:// 的 host、port、SSL |
| SMTP 配置 | channelConfig.username/password/from/auth/startTls/ssl | 创建 SMTP 连接和发件身份 |
| 收件人、抄送、密送 | triggerConfig.emailTargets | 作为固定收件目标 |
| 动态接收人 | triggerConfig.audiences | 非空时优先生成主收件人,并清空 cc/bcc |
| 邮件模板 | triggerConfig.messageTemplate.subject/content | 优先生成邮件主题和正文;缺失时回退标准卡片模板 |
{
"channelType": "EMAIL",
"endpointUrl": "smtps://smtp.example.com:465",
"channelConfig": {
"username": "<SMTP_USERNAME>",
"password": "<SMTP_PASSWORD>",
"from": "notice@example.com",
"auth": true,
"startTls": false,
"ssl": true
},
"triggerConfig": {
"interfaceCodes": ["DATA_CREATE", "DATA_UPDATE"],
"emailTargets": {
"recipients": ["user@example.com"],
"ccList": [],
"bccList": [],
"subjectPrefix": "[业务通知]",
"fromName": "小系统通知"
},
"messageTemplate": {
"subject": "数据变更通知",
"content": "请查看本次数据变更:${event.recordId}"
}
}
}SMTP:
host=smtp.example.com
port=465
ssl=true
auth=true
Mail:
from=notice@example.com
to=user@example.com
subject=[业务通知] - 数据变更通知
html/text=请查看本次数据变更:<RECORD_ID>WARNING
EMAIL 当前运行态口径是 audiences 优先。只要 triggerConfig.audiences 非空,系统会用它解析主收件人,不再合并 emailTargets.recipients,并且不会继续读取 ccList 和 bccList。
官方规范:RFC 3207 STARTTLS、RFC 8314 邮件传输 TLS 建议。
内容占位符解释
标准占位符
${event.appCode} 触发通知的应用编码
${event.datasetCode} 触发通知的数据集编码
${event.operation} 数据操作类型,如新增、更新、删除、读取
${event.interfaceCode} 触发通知的数据接口事件码,如 DATA_CREATE、DATA_UPDATE
${event.recordId} 触发通知的业务记录 ID事件消息信息详情占位符
WARNING
需要注意的是,${event.record}占位符仅在触发接口类型为数据新增(Create)和数据更新(Update)的时候会生效
${event.record} 事件消息信息详情
${event.record.****} 其中****指代操作数据的具体字段
${event.record.createUserId_label.****} 可以实现业务信息的多层选择例如:需要通知显示:供应商渠道信息------>变量选择:$
检查结果
配置完成后,用一次真实触发检查是否生效。
[ ] 目标 dataset 的通知通道状态为启用。
[ ] 触发操作命中了
triggerConfig.interfaceCodes中的接口编号。[ ] 群机器人、Webhook 接收方或邮箱收到了消息。
[ ] 消息标题、摘要、字段和按钮内容符合
triggerConfig.messageTemplate。[ ] 失败时能在运行态日志里看到渠道类型、通道信息和错误原因。
| 现象 | 优先检查 | 处理方式 |
|---|---|---|
| 没有收到消息 | 通道是否启用、interfaceCodes 是否命中 | 先用一次确定会触发的新增或修改操作复现 |
| 群机器人返回鉴权失败 | Webhook、签名密钥、关键词或 Header | 按对应官方机器人文档重新复制配置 |
| EMAIL 没有收件人 | audiences 是否为空,或是否能解析出邮箱 | 动态收件人为空时,改用 emailTargets.recipients 配固定收件人 |
| EMAIL 抄送或密送没有生效 | audiences 是否非空 | 如果需要使用 cc/bcc,不要同时配置非空 audiences |
常见问题
messageTemplate 应该写在哪里?
写在 dataset 级通知通道的 triggerConfig.messageTemplate。不要写进应用级 channelConfig。
channelConfigId 是什么?
它是应用级渠道配置的引用 ID。dataset 级通知通道通过它复用 Webhook、SMTP、签名密钥或发件账号等协议配置。
新配置还要写 operations 吗?
不需要。新配置用 triggerConfig.interfaceCodes 表达触发接口。operations 只用于理解历史配置。
EMAIL 固定收件人和 audiences 会合并吗?
不会。audiences 非空时优先作为主收件人来源,固定收件人、抄送和密送不会合并进本次发送。
文档里能写真实密钥吗?
不能。Webhook 地址中的机器人令牌、签名密钥、SMTP 密码、访问密钥、登录态凭证、内部测试账号都不要写进客户文档。需要示例时使用 <PLACEHOLDER>。