# 联系方式

定义用户可以填写的联系方式字段，以及媒介如何从中选一个，决定每个人的通知发到哪里。

最后校对于 2026-10-10

这页办完你会得到：用户表单里正好提供你的媒介需要的联系方式字段——企业微信用户 ID、 内部 IM 账号、寻呼号码——通知规则里选了人或团队时，也知道该给每个人用哪个地址。

## 联系方式是什么[​](#联系方式是什么 "联系方式是什么的直接链接")

每个用户都有**手机号**和**邮箱**两个固定字段。除此之外的——机器人 token、IM 账号 ID、 你自己的集成需要的任何东西——都是**联系方式**：管理员维护的一份清单里的条目， 用户在个人资料的 **联系方式** 下按这些 key 填写自己的值。

| 条目的组成 | 说明                                                                  |
| ---------- | --------------------------------------------------------------------- |
| 名称       | 用户在下拉框里看到的文字                                              |
| 标识       | 值存在哪个 key 下，也是媒介引用它的名字。只能用字母、数字、`_` 和 `-` |
| 启用       | 关掉后，所有下拉框里都看不到它                                        |

## 在哪里维护这份清单[​](#在哪里维护这份清单 "在哪里维护这份清单的直接链接")

只有 `Admin` 能改，入口有三个，打开的是同一份清单：

* 用户表单里 **联系方式** 旁边的 **联系方式管理** 链接（**人员组织 → 用户管理 → 新增 / 编辑**）；
* 自己的个人资料页上同样的链接；
* 通知媒介 **变量配置** 里 **联系方式** 旁边的齿轮图标。

这份清单也有一个独立页面，地址是 `/contacts`。

点 **添加**，填名称和标识，保持启用，保存。改动立即生效，不用重启任何进程。

## 新装环境一开始有什么[​](#新装环境一开始有什么 "新装环境一开始有什么的直接链接")

**v9 新装环境里，这份清单是空的。** 在你添加之前，用户看不到任何可填的联系方式 key。

从老版本升级上来的环境，会保留老版本建的六个内置条目：

| 标识                   | 用途                    |
| ---------------------- | ----------------------- |
| `dingtalk_robot_token` | 钉钉群机器人 token      |
| `wecom_robot_token`    | 企业微信群机器人 key    |
| `feishu_robot_token`   | 飞书群机器人 token      |
| `lark_robot_token`     | Lark 群机器人 token     |
| `telegram_robot_token` | Telegram 机器人 token   |
| `mm_webhook_url`       | Mattermost webhook 地址 |

内置条目可以停用，不能删除，标识也不能改。它们来自「每个人的机器人 token 填在个人资料里」的年代； v9 里通常的做法是把机器人 token 填在通知规则里，见[钉钉 / 飞书 / 企业微信](https://n9e.github.io/zh/docs/notifications/dingtalk-feishu-wecom.md)。

## 媒介怎么用它[​](#媒介怎么用它 "媒介怎么用它的直接链接")

面向人发送的媒介——[Callback](https://n9e.github.io/zh/docs/notifications/callback.md)、[脚本](https://n9e.github.io/zh/docs/notifications/script.md) 以及基于 HTTP 的各类媒介——在 **变量配置** 里有一个 **联系方式** 下拉框， 列出 `phone`、`email` 和所有启用的联系方式。

通知规则给这个媒介选了用户或团队时，夜莺按选中的 key 去取每个人的值：

1. 没填这个 key 的人**静默跳过**——不报错，也不重试；
2. 剩下的值，在 HTTP 模板里是 `$sendto` / `$sendtos`，在脚本的 stdin 里是 `sendtos`。

所以「为什么这个人什么都没收到」，第一步就是来这里：打开他的个人资料， 看媒介用的那个 key 有没有填。

## 一个例子：按企业微信用户 ID 发送[​](#一个例子按企业微信用户-id-发送 "一个例子：按企业微信用户 ID 发送的直接链接")

假设有个内部服务负责发企业微信应用消息，需要每个接收人的企业微信用户 ID。

1. 添加一个联系方式：名称 `企业微信用户 ID`，标识 `wecomid`；

2. 让大家在个人资料里填上，或者管理员在用户表单里代填；

3. 在一个 Callback 媒介上，**联系方式** 选 `企业微信用户 ID`，请求体里把列表发出去：

   ```
   {"touser": {{ jsonMarshal $sendtos }}, "text": {{ jsonMarshal $tpl.content }}}
   ```

4. 在通知规则里选团队作为接收方。团队里填了 `wecomid` 的人，都会出现在同一次请求里。

## 修改或删除条目[​](#修改或删除条目 "修改或删除条目的直接链接")

* **停用**：用户表单和媒介下拉框里不再出现这个 key。已经填过的值还留在各人的资料里， 已经指向这个 key 的媒介也照常用它发送。
* **改自定义条目的标识**：已有的值不会跟着搬——它们还存在旧 key 下， 仍指向旧 key 的媒介也继续用旧 key。标识定了就别改。
* **删除自定义条目**：只是从清单里拿掉，已存的值不会被清理。

## 下一步[​](#下一步 "下一步的直接链接")

* 每个人的资料在哪里填：[用户与团队](https://n9e.github.io/zh/docs/security/users-teams.md)
* 在请求里用这些地址：[Callback（通用 Webhook）](https://n9e.github.io/zh/docs/notifications/callback.md)
* 或者在你自己的程序里用：[脚本媒介](https://n9e.github.io/zh/docs/notifications/script.md)
