Core · 使用插件 · 通知

通知渠道

提供的能力

@nocobase/app-plugin-notification-providers 为通知提供 SMTP、Resend、飞书机器人和钉钉机器人渠道。它只有 Server 运行时入口,不提供配置页面或用户邮箱工作台。

选择渠道类型

type使用场景消息要求
smtp通过 SMTP 服务器发送邮件原生邮箱地址、subject、text 或 html
resend通过 Resend 发送邮件原生邮箱地址、subject、text 或 html
feishu-webhook向飞书机器人 Webhook 发消息text,可选完整 HTTP(S) target URL
dingtalk-webhook向钉钉机器人 Webhook 发消息text,可选完整 HTTP(S) target URL

一个类型可以配置多个命名渠道,分别使用不同凭据。新增配置使用 type;旧 provider 别名仍兼容,但两者同时出现时必须一致。

使用场景与示例

示例:业务通知与运维告警分开

将 system-email 配置为邮件渠道,将 ops-feishu 配置为飞书渠道。业务调用 notification.send() 时,分别在 messages['system-email'] 和 messages['ops-feishu'] 提供完整消息。

邮件可传单个邮箱或邮箱数组;机器人 Webhook 不接受 to,目标由配置的 Webhook 决定。插件不负责把用户 ID 换成邮箱。飞书、钉钉渠道校验官方 HTTPS Webhook 主机,且不跟随重定向。

开发提示词(交给当前应用目录中的 Coding Agent):

纯文本
请使用通知渠道插件,将业务邮件与运维飞书告警分开。
配置 system-email 与 ops-feishu 两个具名渠道,凭据来自服务端私有配置,显式处理环境变量映射。
邮件提供邮箱收件人,机器人使用配置中的 Webhook,不传 to。
使用受控收件人与测试群验证实际投递及失败结果,不额外开发个人邮箱页面。

完成标志:测试邮件与告警分别到达指定目标,错误凭据的失败可在日志中定位。

重要原理与实现

以下是实现本例时的接入位置与预期界面变化;它们是开发说明,具体文件名沿用当前应用结构。

接入位置代码或配置变化界面与行为变化
server/plugins.ts 与通知配置注册 Server 渠道插件和具名实例不新增页面,服务端可以选择投递实现
配置工厂和私密环境配置显式映射 SMTP 或 Webhook 凭据配置名称与实际读取路径一致
业务通知构造按渠道准备邮件或机器人消息两类消息投递到各自目标

配置渠道

将 Server 插件放在通知插件之后注册,并在 notification.channels 下添加命名渠道:

YAML
notification:
  channels:
    system-email:
      type: smtp
      host: smtp.example.com
      port: 587
      from: notifications@example.com

此示例只展示配置结构;实际 SMTP 认证需通过服务端私有配置提供。YAML 值是字面量,不会自动展开 ${...}。默认模板的 defineMailChannelsConfig 将 SMTP_PASSWORD 映射到 channels.system-email.auth.pass;自定义渠道名称或凭据路径需要显式环境变量映射。

AI 开发的约束与验证

本插件的开发约束

  • 区分渠道名与 type,YAML 不自动展开环境变量,不能把占位表达式当作有效凭据。
  • 保留官方 Webhook 主机与重定向校验;不要为跑通测试关闭提供方校验。
  • 实际检查认证失败、收件人格式和投递日志;使用测试目标避免将验收消息发给业务用户。

验证与扩展

通过真实业务或服务端发送验证渠道,并检查通知日志。同时确认配置可读、认证可用和收件人格式正确;不要仅凭配置保存成功判断发送成功。

需要新渠道时,通过 ChannelInstance 与 registry.registerChannelType() 扩展;通用扩展实现属于插件开发。本插件不包含站内信和 Web Push,它们分别由站内信和浏览器推送提供。需要连接用户自己的邮箱,参阅邮件。

上述检查是接入后的验收要求,不表示本文已完成运行验证。让 Agent 报告实际改动、执行过的检查和未验证项;项目指引、Skills 与通用检查流程见持续开发应用和测试。

源码依据:插件公开入口与实现。

NocoBase 文档助手

关于 NocoBase,你想了解什么?

每次提问独立回答,不会参考之前的问答。请提供完整背景。