Files
2026-09-02 11:44:52 +08:00

1890 lines
85 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 邮箱 (mail) 命令参考
## 命令速查目录
| 命令 | 功能简述 |
|------|----------|
| `dws mail mailbox list` | 查询**当前用户自己**的可用邮箱列表 |
| `dws mail mailbox profile` | 获取用户邮箱详细信息(容量、别名等) |
| `dws mail message list` | 列出指定文件夹中的邮件(默认收件箱) |
| `dws mail message search` | 搜索邮件(KQL 语法,按主题/发件人/日期等) |
| `dws mail message get` | 查看邮件完整内容(含正文) |
| `dws mail message send` | 发送邮件(支持附件/内联图片) |
| `dws mail message reply` | 回复邮件(支持附件/内联图片) |
| `dws mail message reply-all` | 回复所有人(支持附件/内联图片) |
| `dws mail message forward` | 转发邮件(支持附件/内联图片) |
| `dws mail message batch-move` | 批量移动邮件到指定文件夹 |
| `dws mail message batch-delete` | 批量删除邮件 |
| `dws mail message batch-update` | 批量修改邮件状态(标记已读/未读/添加标签/移除标签) |
| `dws mail message batch-get` | 批量获取邮件详情(最多 20 封) |
| `dws mail message verify` | 根据 internetMessageId 查询邮件发送状态 |
| `dws mail sent-message recall` | 撤回已发送的邮件(仅支持同组织内未读邮件) |
| `dws mail sent-message recall-detail` | 查询邮件撤回进度 |
| `dws mail draft create` | 创建草稿(保留在草稿箱,不发送) |
| `dws mail draft update` | 更新草稿内容(保留在草稿箱,不发送) |
| `dws mail draft send` | 发送草稿箱中已有的草稿 |
| `dws mail folder list` | 列举邮件文件夹 |
| `dws mail folder create` | 创建邮件文件夹 |
| `dws mail folder delete` | 删除邮件文件夹 |
| `dws mail folder update` | 更新邮件文件夹名称 |
| `dws mail attachment list` | 列举指定邮件的所有附件 |
| `dws mail attachment download` | 下载邮件附件到本地(**仅支持逐个下载,不支持批量下载**) |
| `dws mail tag list` | 列举邮件标签 |
| `dws mail tag create` | 创建邮件标签 |
| `dws mail tag delete` | 删除邮件标签 |
| `dws mail tag update` | 更新邮件标签名称 |
| `dws mail thread list` | 列出指定邮箱、指定文件夹下的邮件会话 |
| `dws mail thread get` | 获取会话详情 |
| `dws mail thread update` | 修改单个邮件会话的状态或标签(标记已读/未读/添加标签/移除标签) |
| `dws mail thread batch-update` | 批量修改邮件会话的状态或标签(单次最多 100 个) |
| `dws mail thread trash` | 将单个邮件会话移动到已删除文件夹(不会永久删除) |
| `dws mail thread batch-trash` | 将多个邮件会话批量移动到已删除文件夹(单次最多 100 个,不会永久删除) |
| `dws mail user search` | 搜索通讯录用户(**按姓名或工号查他人邮箱**,不是搜邮件) |
| `dws mail template create` | 创建邮件模板 |
| `dws mail template list` | 列举邮件模板 |
| `dws mail template get` | 获取邮件模板详情 |
| `dws mail template update` | 更新邮件模板 |
| `dws mail template delete` | 删除邮件模板 |
| `dws mail contact create` | 创建个人邮件联系人(添加到自己的联系人列表) |
| `dws mail contact list` | 列举个人邮件联系人(查看自己保存的联系人,**不是搜索通讯录用户**) |
| `dws mail contact update` | 更新个人邮件联系人信息 |
| `dws mail contact batch-delete` | 批量删除个人邮件联系人 |
| `dws mail auto-reply get` | 获取用户的自动回复配置 |
| `dws mail auto-reply update` | 更新/设置用户的自动回复配置 |
| `dws mail allow-list list` | 列出个人收信白名单 |
| `dws mail allow-list add` | 添加个人收信白名单 |
| `dws mail allow-list remove` | 移除个人收信白名单 |
| `dws mail block-list list` | 列出个人收信黑名单 |
| `dws mail block-list add` | 添加个人收信黑名单 |
| `dws mail block-list remove` | 移除个人收信黑名单 |
| `dws mail rule list` | 列出个人收信规则 |
| `dws mail rule create` | 创建个人收信规则 |
| `dws mail rule update` | 更新个人收信规则 |
| `dws mail rule delete` | 删除个人收信规则 |
| `dws mail rule adjust` | 调整收信规则排序 |
> **查找他人邮箱**(如「获取严龙的邮箱」)→ **不要用 `mailbox list`**,应走三路并发查询,详见「查找他人邮箱地址」章节。
---
## 默认邮箱选择规则(重要)
所有 mail 相关命令,**除非用户明确要求使用个人邮箱,否则一律默认使用企业邮箱**。
**适用范围:** 任何需要传入 `--email` / `--from` / `--sender` 参数的 mail 子命令一律适用。
**默认选择策略:**
1. 调用 `dws mail mailbox list --format json` 获取当前用户的所有邮箱。
2. 从返回的 `mailboxes` 中**优先选择企业邮箱**(账号类型为企业邮箱、域名非 `@dingtalk.com` 的邮箱),将其作为 `--email` / `--from` 的默认值。
3. 仅当用户在指令中**明确指定**「用我的个人邮箱」「用 dingtalk.com 邮箱」「用我的私人邮箱」等表述时,才选择个人邮箱(`@dingtalk.com` 域名)。
4. 若用户同时拥有多个企业邮箱(如分属多家公司),优先选择与当前会话上下文匹配的企业邮箱;若仍无法判断,向用户确认后再操作。
5. 若用户**仅拥有个人邮箱**(无企业邮箱),可直接使用个人邮箱,但需注意 `mail user search` 等仅企业邮箱可用的命令会因权限报错,需走「查找他人邮箱地址」章节的替代路径。
**触发个人邮箱的关键词举例:** 「我的个人邮箱」「私人邮箱」「dingtalk.com 邮箱」「@dingtalk 的邮箱」「我的 personal 邮箱」。
> 该规则覆盖文档后续所有命令示例:示例中虽以 `user@company.com` 等占位邮箱书写,实际执行时**必须按上述策略动态选择企业邮箱**,不要直接照抄示例中的邮箱字面量,更不要默认使用 `@dingtalk.com` 个人邮箱。
---
## 命令总览
### 查询可用邮箱地址
> **注意:** 仅返回当前登录用户**自己的**邮箱列表,不能用于查找他人邮箱。查找他人邮箱请使用三路并发流程(见"查找他人邮箱地址"章节)。
```
Usage:
dws mail mailbox list [flags]
Example:
dws mail mailbox list
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `mailboxes` | `List[]` | 邮箱列表,每条包含邮箱地址、账号类型、所属企业 |
### 获取用户邮箱信息
```
Usage:
dws mail mailbox profile [flags]
Example:
dws mail mailbox profile --email user@company.com
Flags:
--email string 用户的邮箱地址 (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `email` | `string` | 邮箱地址 |
| `emailAliases` | `string[]` | 邮件地址别名列表 |
| `name` | `string` | 用户名 |
| `nickname` | `string` | 用户昵称 |
| `displayName` | `string` | 用户显示名 |
| `mboxSize` | `string` | 邮箱容量(字节) |
| `mboxSizeUsed` | `string` | 已使用的邮箱容量(字节) |
| `createdTime` | `string` | 创建时间 |
| `modifiedTime` | `string` | 修改时间 |
### 查找他人邮箱地址(通讯录查人)
> **这不是 `mailbox list`。** 当需要获取**某人**的邮箱地址时,必须走以下三路并发查询,取最先返回有效邮箱的结果。禁止臆测邮箱地址。
**触发场景:** 用户说「获取/查找/得到 某人的邮箱地址」、「给某人发邮件」、「某人发给我的邮件」等任何涉及按姓名找邮箱的场景。
**三路并发查询流程:**
```bash
# 主路径:aisearch + contact user get
dws aisearch person --query "姓名" --dimension name --format json
# → 取 userId,再执行:
dws contact user get --ids <userId> --format json
# → 提取 orgAuthEmail 字段
# orgAuthEmail 为空时的邮箱侧补查:mail user search(仅企业邮箱可用;已知工号时可用 --employee-no 替代 --keyword
dws mail user search --email <当前邮箱> --keyword "姓名" --format json
# 或按工号查询:dws mail user search --email <当前邮箱> --employee-no "工号" --format json
# → 提取 users[].email
```
若两步均无有效邮箱,必须 `ask_human` 请用户手动提供,**严禁臆测**。
### 列出文件夹中的邮件
> **注意:** `message list` 用于按文件夹列出邮件;若需根据主题/发件人/日期等条件精确搜索,请使用 `message search`。
```
Usage:
dws mail message list [flags]
Example:
dws mail message list --email user@company.com
dws mail message list --email user@company.com --folder-id 1
dws mail message list --email user@company.com --folder-id 2 --limit 50
dws mail message list --email user@company.com --cursor <nextCursor>
Flags:
--email string 邮件所属邮箱地址 (必填)
--folder-id string 文件夹 ID1=已发送, 2=收件箱, 3=垃圾邮件, 5=草稿, 6=已删除),默认为收件箱,别名: --folder
--limit string 每页返回数量(最大限制 100, 默认 20),别名: --size, --page-size
--cursor string 邮件的起始偏移标识, 其值取自响应中的nextCursor字段。""表示从头开始
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `messages` | `List[]` | 邮件列表,每条包含邮件 ID 及元信息(不含正文) |
| `total` | `int32` | 符合条件的总邮件数 |
| `nextCursor` | `string` | 下一页游标,传入 `--cursor` 翻页;值为 `$` 表示已到达列表尾部 |
### 搜索邮件 (KQL 语法)
```
Usage:
dws mail message search [flags]
Example:
dws mail message search --email user@company.com --query "subject:\"周报\"" --limit 20
dws mail message search --email user@company.com --query "from:alice AND date>2025-06-01T00:00:00Z" --limit 10
Flags:
--cursor string 邮件的起始偏移标识, 其值取自响应中的nextCursor字段。""表示从头开始
--email string 搜索目标邮箱地址 (必填)
--query string KQL 查询表达式 (必填), 其中 date 格式需遵循 ISO8601 规范
--limit string 每页返回数量(最大限制 100, 默认 20),别名: --size, --page-size
```
KQL 查询字段: date, size, tag, folderId, isRead, hasAttachments, subject, attachname, body, from, to
常用文件夹 ID: 1=已发送, 2=收件箱, 3=垃圾邮件, 5=草稿, 6=已删除
### KQL 查询字段说明
| 字段 | 类型 | 说明 | 正确示例 | 错误示例 |
|------|------|------|----------|----------|
| `date` | ISO8601 日期时间 | 邮件日期,支持 `>` `<` `>=` `<=` 比较运算符 | `date>2025-06-01T00:00:00Z` | `date>2025-06-01`(缺少时间部分) |
| `size` | 整数(字节数) | 邮件大小,支持 `>` `<` `>=` `<=` 比较运算符 | `size>1024` | `size>"1024"`(值不需要引号) |
| `tag` | 字符串 | 邮件标签 | `tag:important` | `tag:""` |
| `folderId` | 整数 | 文件夹 ID(1=已发送, 2=收件箱, 3=垃圾邮件, 5=草稿, 6=已删除) | `folderId:2` | `folderId:"收件箱"`(必须用数字 ID |
| `isRead` | 布尔 `true`/`false` | 是否已读 | `isRead:false` | `isRead:0``isRead:"false"`(不支持数字或字符串形式) |
| `hasAttachments` | 布尔 `true`/`false` | 是否有附件 | `hasAttachments:true` | `hasAttachments:yes` |
| `subject` | 字符串 | 邮件主题,含空格须加双引号 | `subject:周报``subject:"项目 进展"` | `subject:项目 进展`(含空格未加引号) |
| `attachname` | 字符串 | 附件文件名,含空格须加双引号 | `attachname:report.pdf``attachname:"月度 报告.xlsx"` | `attachname:月度 报告.xlsx`(含空格未加引号) |
| `body` | 字符串 | 邮件正文内容,含空格须加双引号 | `body:会议纪要``body:"Q1 总结"` | `body:Q1 总结`(含空格未加引号) |
| `from` | 字符串(邮件地址或名称) | 发件人,支持:纯邮件地址、纯名称(含空格须加双引号)、`"名称<邮件地址>"` 格式 | `from:alice@company.com``from:"张 三"``from:"alice<a@b.com>"` | `from:张 三`(含空格未加引号) |
| `to` | 字符串(邮件地址或名称) | 收件人,支持:纯邮件地址、纯名称(含空格须加双引号)、`"名称<邮件地址>"` 格式 | `to:bob@company.com``to:"李 四"``to:"alice<a@b.com>"` | `to:李 四`(含空格未加引号) |
**组合查询说明:**
- 支持 `AND` / `OR` / `NOT` 逻辑运算符(大写)
- 括号用于分组:`(from:alice OR from:bob) AND folderId:2`
- 排除特定文件夹:`(NOT folderId:3) AND (NOT folderId:6)`
### message search 返回值说明
| 字段 | 类型 | 说明 |
|------|------|------|
| `messages` | `List[]` | 邮件列表,每条包含邮件 ID 及元信息(不含正文) |
| `total` | `int32` | 符合条件的总邮件数 |
| `nextCursor` | `string` | 下一页游标,传入 `--cursor` 翻页;值为 `$` 表示已到达列表尾部 |
**翻页示例:**
```bash
# 第一页
dws mail message search --email user@company.com --query "folderId:2" --limit 20 --format json
# 取返回中的 nextCursor,传入下一次请求(nextCursor="$" 时停止)
dws mail message search --email user@company.com --query "folderId:2" --limit 20 --cursor <nextCursor> --format json
```
### 查看邮件完整内容
```
Usage:
dws mail message get [flags]
Example:
dws mail message get --email user@company.com --id <messageId>
Flags:
--email string 邮件所属邮箱地址 (必填)
--id string 邮件 ID (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `message` | `object` | 邮件完整信息,包含主题、发件人、收件人、正文、附件等 |
### 批量获取邮件详情
```
Usage:
dws mail message batch-get [flags]
Example:
dws mail message batch-get --email user@company.com --ids <id1>,<id2>
dws mail message batch-get --email user@company.com --ids <id1>,<id2>,<id3>
Flags:
--email string 邮件所属邮箱地址 (必填)
--ids string 要获取的邮件 ID 列表,逗号分隔,最多 20 个 (必填)
```
单次最多获取 20 封邮件。
**返回 JSON**
```json
{
"success": true,
"messages": [
{ "subject": "...", "from": "...", "to": [...], "body": "...", ... },
{ "subject": "...", "from": "...", "to": [...], "body": "...", ... }
]
}
```
> **注意:** 如果某个邮件 ID 获取失败,整个命令会报错并中止。建议先通过 `message search` 或 `message list` 确认邮件 ID 有效后再批量获取。
### 发送邮件
```
Usage:
dws mail message send [flags]
Example:
dws mail message send --from user@company.com --to colleague@company.com \
--subject "周报" --content "本周完成任务A和任务B"
dws mail message send --from user@company.com --to colleague@company.com \
--subject "周报" --content "见附件" --attachment ./report.pdf
dws mail message send --from user@company.com --to colleague@company.com \
--subject "周报" --content "见附件" --attachment ./a.pdf --attachment ./b.xlsx
dws mail message send --from user@company.com --to colleague@company.com \
--subject "图表周报" --content "图表如下:[inline:chart.png]" --inline-attachment ./chart.png
dws mail message send --from user@company.com --to colleague@company.com \
--subject "带图文档" --content "见附件,图表:[inline:img.png]" --attachment ./doc.pdf --inline-attachment ./img.png
Flags:
--content string 邮件正文 (必填),别名: --body
--cc string 抄送人列表
--from string 发件人邮箱 (必填),别名: --sender
--subject string 邮件标题 (必填)
--to string 收件人列表 (必填)
--attachment stringArray 附件文件路径,可多次指定 (可选)
--inline-attachment stringArray 内联图片路径,可多次指定,cid 自动生成 (可选)
```
**附件发送说明:**
当指定 `--attachment``--inline-attachment` 时,CLI 自动执行以下编排流程:
1. 创建邮件草稿(若有内联图片,正文自动转为 HTML 并注入 `<img>` 标签)
2. 为每个普通附件调用 `create_upload_session``isInline=false`),从响应的 `uploadUrl` 字段获取完整上传地址,HTTP POST 上传文件内容
3. 为每个内联图片调用 `create_upload_session``isInline=true`,传入 contentId),从响应的 `uploadUrl` 字段获取完整上传地址,HTTP POST 上传文件内容
4. 调用 `send_draft` 发送草稿
> **注意:** 附件必须通过 `--attachment` / `--inline-attachment` 参数传入,**严禁使用钉钉媒体存储(media upload)上传附件**。
**内联图片说明(`--inline-attachment`):**
- 仅支持图片类型:`jpg` / `jpeg` / `png` / `gif` / `webp` / `bmp` / `svg`
- CLI 自动生成 contentId,格式:`inline-{文件名(不含扩展名)}-{序号}@alimail.com`,例:`inline-chart-1@alimail.com`
-`--content` 中使用占位符 `[inline:文件名]` 引用图片,CLI 自动替换为 `<img src="cid:...">` 标签
- 若 content 中没有对应占位符,内联图片会自动追加到正文末尾
- 非图片类型(PDF、视频、音频等)请改用 `--attachment`
### 列举邮件文件夹
```
Usage:
dws mail folder list [flags]
Example:
dws mail folder list --email user@company.com
dws mail folder list --email user@company.com --folder <folderId>
Flags:
--email string 邮件所属邮箱地址 (必填)
--folder string 父文件夹唯一标识,不传则返回顶层文件夹 (可选),别名: --folder-id
```
不传 `--folder` 返回顶层文件夹列表;传入则返回该文件夹的子文件夹列表。
**返回字段(`folders` 数组):**
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | `string` | 文件夹唯一标识 |
| `displayName` | `string` | 文件夹显示名称 |
| `parentFolderId` | `string` | 父文件夹 ID |
| `childFolderCount` | `int` | 子文件夹数量 |
| `totalItemCount` | `int` | 邮件总数 |
| `unreadItemCount` | `int` | 未读邮件数量 |
### 创建邮件文件夹
```
Usage:
dws mail folder create [flags]
Example:
dws mail folder create --email user@company.com --name "项目资料"
dws mail folder create --email user@company.com --name "子文件夹" --folder <folderId>
Flags:
--email string 邮件所属邮箱地址 (必填)
--name string 新建邮件文件夹名称 (必填)
--folder string 父文件夹 ID,不传则创建顶层文件夹 (可选)
```
不传 `--folder` 创建顶层文件夹;传入 `--folder` 时创建指定父文件夹下的子文件夹。
> **重要:** `--folder` 必须填写父文件夹 ID,不是文件夹名称。父文件夹 ID 来自 `dws mail folder list --email <邮箱>` 返回的 `folders[].id`。
**返回 JSON**
```json
{
"success": true,
"result": {
"folder": {
"id": "104",
"displayName": "项目资料",
"parentFolderId": "0",
"childFolderCount": 0,
"totalItemCount": 0,
"unreadItemCount": 0,
"extensions": {}
}
}
}
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | `boolean` | 是否创建成功 |
| `result.folder.id` | `string` | 文件夹唯一标识 |
| `result.folder.displayName` | `string` | 文件夹显示名称 |
| `result.folder.parentFolderId` | `string` | 父文件夹 ID |
| `result.folder.childFolderCount` | `number` | 子文件夹数量 |
| `result.folder.totalItemCount` | `number` | 邮件总数 |
| `result.folder.unreadItemCount` | `number` | 未读邮件数量 |
| `result.folder.extensions` | `object` | 文件夹扩展信息 |
### 删除邮件文件夹
```
Usage:
dws mail folder delete [flags]
Example:
dws mail folder delete --email user@company.com --id <folderId>
Flags:
--email string 邮件所属邮箱地址 (必填)
--id string 要删除的邮件文件夹 ID (必填)
```
`--id` 必须填写要删除的文件夹 ID,不是文件夹名称。文件夹 ID 来自 `dws mail folder list --email <邮箱>` 返回的 `folders[].id`,或来自 `folder create` 返回的 `result.folder.id`
**返回 JSON**
```json
{
"success": true,
"result": {}
}
```
### 更新邮件文件夹
```
Usage:
dws mail folder update [flags]
Example:
dws mail folder update --email user@company.com --id <folderId> --name "新文件夹名"
Flags:
--email string 邮件所属邮箱地址 (必填)
--id string 要更新的邮件文件夹 ID (必填)
--name string 更新后的邮件文件夹名称 (必填)
```
`--id` 必须填写要更新的文件夹 ID,不是文件夹名称;`--name` 是更新后的文件夹名称。若用户只给出原文件夹名称,必须先调用 `folder list` 找到对应 `folders[].id`,再执行 update。
**返回 JSON**
```json
{
"success": true,
"result": {}
}
```
### 列举邮件附件
> **重要:** 不存在 `attachment download_batch` / `download_all` 等批量下载命令。如需下载多封邮件的所有附件,必须按以下流程逐个下载:1) `message search` 搜索邮件获取 messageId 列表 → 2) 对每封邮件 `attachment list` 获取 attachmentId + name → 3) 对每个附件逐个调用 `attachment download`。
```
Usage:
dws mail attachment list [flags]
Example:
dws mail attachment list --email user@company.com --id <messageId>
Flags:
--email string 用户邮箱地址 (必填)
--id string 邮件唯一标识 messageId (必填)
```
列出指定邮件的所有附件信息。
**返回字段(`attachments` 数组):**
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | `string` | 附件唯一标识 |
| `name` | `string` | 附件文件名 |
| `contentType` | `string` | 附件 MIME 类型 |
| `size` | `int` | 附件大小(字节) |
### 下载邮件附件
> **重要:** `attachment download` 每次只能下载**一个**附件。不存在 `download_batch` / `download_all` / `batch_download` 等批量下载命令,不要编造不存在的命令。如需下载多封邮件的所有附件,必须循环执行:对每封邮件先 `attachment list` 获取附件列表,再对每个附件逐个调用 `attachment download`。
```
Usage:
dws mail attachment download [flags]
Example:
# 先列出附件获取 id 和 name
dws mail attachment list --email user@company.com --id <messageId>
# 再下载指定附件到当前目录(每次只能下载一个附件)
dws mail attachment download --email user@company.com --message-id <messageId> --attachment-id <attachmentId> --name report.pdf
# 下载到指定目录
dws mail attachment download --email user@company.com --message-id <messageId> --attachment-id <attachmentId> --name img.png --output /tmp
Flags:
--email string 用户邮箱地址 (必填)
--message-id string 邮件唯一标识 messageId (必填)
--attachment-id string 附件唯一标识,取自 attachment list 的 id 字段 (必填)
--name string 保存到本地的文件名,取自 attachment list 的 name 字段 (必填)
--output string 保存目录,默认为当前目录
```
下载指定邮件的某个附件到本地。CLI 自动执行以下编排流程:
1. 调用 `create_download_session`,从响应的 `downloadUrl` 字段获取完整下载地址
2. 通过 HTTP GET 下载附件内容并保存到本地
> **注意:** `--name` 和 `--attachment-id` 均来自 `attachment list` 的返回结果,建议先执行 `attachment list` 再执行 `attachment download`。
### 列举邮件标签
```
Usage:
dws mail tag list [flags]
Example:
dws mail tag list --email user@company.com
Flags:
--email string 用户的邮箱地址 (必填)
```
列出指定邮箱下的所有邮件标签,返回标签的 ID 和元信息。
**返回字段(`tags` 数组):**
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | `string` | 标签唯一标识 |
| `name` | `string` | 标签显示名称 |
| `parentId` | `string` | 父标签 ID |
| `totalItemCount` | `int` | 标签下邮件总数 |
| `unreadItemCount` | `int` | 标签下未读邮件数量 |
### 创建邮件标签
```
Usage:
dws mail tag create [flags]
Example:
dws mail tag create --email user@company.com --name "项目资料"
dws mail tag create --email user@company.com --name "子标签" --parent-id <tagId>
Flags:
--email string 用户的邮箱地址 (必填)
--name string 新建邮件标签名称 (必填)
--parent-id string 父标签 ID,不传则创建顶层标签 (可选)
```
不传 `--parent-id` 创建顶层标签;传入 `--parent-id` 时创建指定父标签下的子标签。
> **重要:** `--parent-id` 必须填写父标签 ID,不是标签名称。父标签 ID 来自 `dws mail tag list --email <邮箱>` 返回的 `tags[].id`。
**返回 JSON**
```json
{
"success": true,
"result": {
"tag": {
"id": "tag-001",
"name": "项目资料",
"parentId": "0",
"totalItemCount": 0,
"unreadItemCount": 0,
"extensions": {}
}
}
}
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | `boolean` | 是否创建成功 |
| `result.tag.id` | `string` | 标签唯一标识 |
| `result.tag.name` | `string` | 标签显示名称 |
| `result.tag.parentId` | `string` | 父标签 ID |
| `result.tag.totalItemCount` | `number` | 标签下邮件总数 |
| `result.tag.unreadItemCount` | `number` | 标签下未读邮件数量 |
| `result.tag.extensions` | `object` | 标签扩展信息 |
### 删除邮件标签
```
Usage:
dws mail tag delete [flags]
Example:
dws mail tag delete --email user@company.com --id <tagId>
Flags:
--email string 用户的邮箱地址 (必填)
--id string 要删除的邮件标签 ID (必填)
```
`--id` 必须填写要删除的标签 ID,不是标签名称。标签 ID 来自 `dws mail tag list --email <邮箱>` 返回的 `tags[].id`,或来自 `tag create` 返回的 `result.tag.id`
只能删除用户自定义标签,系统标签不能删除。
**返回 JSON**
```json
{
"success": true,
"result": {}
}
```
### 更新邮件标签
```
Usage:
dws mail tag update [flags]
Example:
dws mail tag update --email user@company.com --id <tagId> --name "新标签名"
Flags:
--email string 用户的邮箱地址 (必填)
--id string 要更新的邮件标签 ID (必填)
--name string 更新后的邮件标签名称 (必填)
```
`--id` 必须填写要更新的标签 ID,不是标签名称;`--name` 是更新后的标签名称。若用户只给出原标签名称,必须先调用 `tag list` 找到对应 `tags[].id`,再执行 update。
只能更新用户自定义标签,系统标签不能更新。
**返回 JSON**
```json
{
"success": true,
"result": {}
}
```
### 列出邮件会话
```
Usage:
dws mail thread list [flags]
Example:
dws mail thread list --email user@company.com --folder <folderId> --limit 10
dws mail thread list --email user@company.com --folder 104 --limit 20 --cursor <nextCursor>
Flags:
--email string 会话所属邮箱地址 (必填)
--folder string 邮件文件夹 ID,不是文件夹名称 (必填)
--limit int 本次列出的会话数,最大 100 (必填)
--cursor string 分页游标,首次请求可不传 (可选)
--start string 开始 UTC 时间字符串,如 2024-01-01T00:00:00Z (可选)
--end string 结束 UTC 时间字符串,如 2024-12-31T23:59:59Z (可选)
--ascending 是否按时间升序;不传由服务端默认排序 (可选)
```
`--folder` 必须填写文件夹 ID,不是文件夹名称。若用户只给出“收件箱/已删除/某个自定义文件夹”这类名称,必须先调用 `folder list` 找到对应 `folders[].id`,再执行 `thread list`
**返回 JSON**
```json
{
"success": true,
"result": {
"conversations": [
{
"id": "conversationId",
"subject": "会话主题",
"summary": "会话摘要",
"lastModifiedDateTime": "2024-02-06T01:05:07Z",
"messageCount": 1,
"tags": [],
"senders": [
{
"email": "sender@example.com",
"name": "发件人"
}
],
"isRead": true,
"priority": "PRY_NORMAL",
"flag": "FLAG_NONE",
"hasAttachments": false
}
],
"nextCursor": "",
"hasMore": false
}
}
```
### 获取会话详情
```
Usage:
dws mail thread get [flags]
Example:
dws mail thread get --email user@company.com --id <conversationId>
Flags:
--email string 会话所属邮箱地址 (必填)
--id string 会话唯一标识 conversationId (必填)
```
**返回字段(`conversation` 对象):**
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | `string` | 会话唯一标识 |
| `subject` | `string` | 会话主题 |
| `summary` | `string` | 会话摘要信息 |
| `lastModifiedDateTime` | `string (date-time)` | 会话最后修改时间 |
| `messageCount` | `int32` | 会话邮件数量 |
| `tags` | `array[string]` | 会话 tag 信息 |
| `senders` | `List[{email, name}]` | 会话发件人列表 |
| `isRead` | `boolean` | 会话是否已读(全部已读/未读) |
| `priority` | `string` | 会话重要性,取会话内邮件最高优先级(`PRY_HIGH` / `PRY_NORMAL` |
| `flag` | `string` | 会话标识,取会话内最近邮件的标识(`FLAG_NONE` / `FLAG_REPLY` / `FLAG_FORWARD` |
| `hasAttachments` | `boolean` | 会话是否包含附件(不含 inline 资源) |
### 修改邮件会话状态
```
Usage:
dws mail thread update [flags]
Example:
dws mail thread update --email user@company.com --id <conversationId> --action markRead
dws mail thread update --email user@company.com --id <conversationId> --action addTags --tag-ids 1,2
Flags:
--email string 会话所属邮箱地址 (必填)
--id string 会话唯一标识 conversationId (必填)
--action string 操作类型:markRead、markUnread、addTags、removeTags (必填)
--tag-ids string 标签 ID 列表,多个用英文逗号分隔;addTags/removeTags 时必填 (可选)
```
`--id` 必须填写会话 ID,不是邮件 ID。会话 ID 可通过 `thread list``conversations[].id` 获取。
支持的 `--action`
| action | 说明 | 是否需要 `--tag-ids` |
|--------|------|----------------------|
| `markRead` | 标记会话为已读 | 否 |
| `markUnread` | 标记会话为未读 | 否 |
| `addTags` | 给会话增加标签 | 是 |
| `removeTags` | 从会话移除标签 | 是 |
**常用标签 ID**
| 标签 ID | 名称 | 图标 |
|---------|------|------|
| `1` | 跟进事项 | 小红旗 |
| `2` | 完成事项 | 绿色小勾 |
| `11` | 重要 | 星标 |
成功时返回:
```json
{
"success": true,
"result": {}
}
```
### 批量修改邮件会话状态
```
Usage:
dws mail thread batch-update [flags]
Example:
dws mail thread batch-update --email user@company.com --ids <conversationId1>,<conversationId2> --action markUnread
dws mail thread batch-update --email user@company.com --ids <conversationId1>,<conversationId2> --action removeTags --tag-ids 11
Flags:
--email string 会话所属邮箱地址 (必填)
--ids string 会话 ID 列表,多个用英文逗号分隔,最多 100 个 (必填)
--action string 操作类型:markRead、markUnread、addTags、removeTags (必填)
--tag-ids string 标签 ID 列表,多个用英文逗号分隔;addTags/removeTags 时必填 (可选)
```
`--ids` 必须填写会话 ID 列表,不是邮件 ID 列表,最多 100 个。
成功时返回:
```json
{
"success": true,
"result": {}
}
```
### [危险] 删除邮件会话
```
Usage:
dws mail thread trash [flags]
Example:
dws mail thread trash --email user@company.com --id <conversationId> --yes
Flags:
--email string 会话所属邮箱地址 (必填)
--id string 要删除的会话 ID (必填)
--yes 跳过确认提示,直接执行 (可选)
```
> ⚠️ **危险操作**:此命令会将邮件会话移动到已删除文件夹。建议先通过 `thread get` 确认目标会话后再执行。
将指定邮件会话移动到已删除文件夹,不会永久删除邮件。`--id` 必须填写会话 ID,不是邮件 ID。默认需要用户确认,传入 `--yes` 可跳过确认。
成功时返回:
```json
{
"success": true,
"result": {}
}
```
### [危险] 批量删除邮件会话
```
Usage:
dws mail thread batch-trash [flags]
Example:
dws mail thread batch-trash --email user@company.com --ids <conversationId1>,<conversationId2> --yes
Flags:
--email string 会话所属邮箱地址 (必填)
--ids string 要删除的会话 ID 列表,多个用英文逗号分隔,最多 100 个 (必填)
--yes 跳过确认提示,直接执行 (可选)
```
> ⚠️ **危险操作**:此命令会批量将邮件会话移动到已删除文件夹。建议先通过 `thread list` 确认目标会话后再执行。
将指定邮件会话批量移动到已删除文件夹,单次最多 100 个会话。不会永久删除邮件。`--ids` 必须填写会话 ID 列表,不是邮件 ID 列表。默认需要用户确认,传入 `--yes` 可跳过确认。
成功时返回:
```json
{
"success": true,
"result": {}
}
```
### 回复邮件
```
Usage:
dws mail message reply [flags]
Example:
dws mail message reply --from user@company.com --id <messageId>
dws mail message reply --from user@company.com --id <messageId> --subject "Re: 周报" --content "已收到,谢谢!"
Flags:
--from string 发件人邮箱 (必填),别名: --sender
--to string 收件人列表(可选)
--id string 要回复的邮件 ID (必填)
--subject string 回复邮件标题(可选)
--content string 回复正文(可选),别名: --body
--attachment stringArray 附件文件路径,可多次指定 (可选)
--inline-attachment stringArray 内联图片路径,可多次指定,cid 自动生成 (可选)
```
**附件发送说明:**
当指定 `--attachment``--inline-attachment` 时,CLI 自动执行以下编排流程:
1. 调用 `create_reply_draft` 创建回复草稿(若有内联图片,正文自动转为 HTML 并注入 `<img>` 标签)
2. 为每个普通附件创建上传会话并上传(`isInline=false`
3. 为每个内联图片创建上传会话并上传(`isInline=true`,传入自动生成的 contentId
4. 发送草稿
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `messageId` | `string` | 新生成的回复邮件 ID |
### 回复所有人
```
Usage:
dws mail message reply-all [flags]
Example:
dws mail message reply-all --from user@company.com --id <messageId>
dws mail message reply-all --from user@company.com --id <messageId> --subject "Re: 周报" --content "感谢大家的参与!"
Flags:
--from string 发件人邮箱 (必填),别名: --sender
--to string 收件人列表(可选,包含发件人及所有原始收件人)
--id string 要回复的邮件 ID (必填)
--subject string 回复邮件标题(可选)
--content string 回复正文(可选),别名: --body
--attachment stringArray 附件文件路径,可多次指定 (可选)
--inline-attachment stringArray 内联图片路径,可多次指定,cid 自动生成 (可选)
```
**附件发送说明:**
当指定 `--attachment``--inline-attachment` 时,CLI 自动执行以下编排流程:
1. 调用 `create_replyall_draft` 创建回复全部草稿(若有内联图片,正文自动转为 HTML 并注入 `<img>` 标签)
2. 为每个普通附件创建上传会话并上传(`isInline=false`
3. 为每个内联图片创建上传会话并上传(`isInline=true`,传入自动生成的 contentId
4. 发送草稿
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `messageId` | `string` | 新生成的回复邮件 ID |
### 转发邮件
```
Usage:
dws mail message forward [flags]
Example:
dws mail message forward --from user@company.com --id <messageId>
dws mail message forward --from user@company.com --to colleague@company.com --id <messageId> --subject "Fwd: 周报"
Flags:
--from string 发件人邮箱 (必填),别名: --sender
--to string 转发收件人列表(可选)
--id string 要转发的邮件 ID (必填)
--subject string 转发邮件标题(可选)
--content string 转发附言(可选),别名: --body
--attachment stringArray 附件文件路径,可多次指定 (可选)
--inline-attachment stringArray 内联图片路径,可多次指定,cid 自动生成 (可选)
```
**附件发送说明:**
当指定 `--attachment``--inline-attachment` 时,CLI 自动执行以下编排流程:
1. 调用 `create_forward_draft` 创建转发草稿(若有内联图片,正文自动转为 HTML 并注入 `<img>` 标签)
2. 为每个普通附件创建上传会话并上传(`isInline=false`
3. 为每个内联图片创建上传会话并上传(`isInline=true`,传入自动生成的 contentId
4. 发送草稿
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `messageId` | `string` | 新生成的转发邮件 ID |
### 批量移动邮件到指定文件夹
```
Usage:
dws mail message batch-move [flags]
Example:
dws mail message batch-move --email user@company.com --ids <id1>,<id2> --folder 6
Flags:
--email string 邮件所属邮箱地址 (必填)
--ids string 要移动的邮件 ID 列表,逗号分隔 (必填)
--folder string 目标文件夹 ID (必填)
```
常用文件夹 ID: 1=已发送, 2=收件箱, 3=垃圾邮件, 5=草稿, 6=已删除
### 批量删除邮件
```
Usage:
dws mail message batch-delete [flags]
Example:
dws mail message batch-delete --email user@company.com --ids <id1>,<id2>
Flags:
--email string 邮件所属邮箱地址 (必填)
--ids string 要删除的邮件 ID 列表,逗号分隔 (必填)
```
### 批量修改邮件状态
批量修改邮件的已读状态或标签,通过 `--action` 指定操作类型。
**支持的操作类型(--action):**
| action | 说明 | 需要的额外参数 |
|--------|------|---------------|
| `markRead` | 标记邮件为已读 | 无 |
| `markUnread` | 标记邮件为未读 | 无 |
| `addTags` | 给邮件增加标签 | `--tags`(标签 ID 列表,必填) |
| `removeTags` | 从邮件移除标签 | `--tags`(标签 ID 列表,必填) |
**常用标签 ID**
| 标签 ID | 名称 | 图标 |
|---------|------|------|
| `1` | 跟进事项 | 小红旗 |
| `2` | 完成事项 | 绿色小勾 |
| `11` | 重要 | 星标 |
```
Usage:
dws mail message batch-update [flags]
Example:
dws mail message batch-update --email user@company.com --ids <id1>,<id2> --action markRead
dws mail message batch-update --email user@company.com --ids <id1>,<id2> --action addTags --tags 1,2
dws mail message batch-update --email user@company.com --ids <id1>,<id2> --action removeTags --tags 11
Flags:
--email string 邮件所属邮箱地址 (必填)
--ids string 要修改的邮件 ID 列表,逗号分隔 (必填)
--action string 操作类型: markRead/markUnread/addTags/removeTags (必填)
--tags string 标签 ID 列表,逗号分隔 (action 为 addTags/removeTags 时必填)
```
> **查询标签 ID** 使用 `dws mail tag list --email <邮箱>` 可查看所有可用标签及其 ID。
### 查询邮件发送状态
```
Usage:
dws mail message verify [flags]
Example:
dws mail message verify --email user@company.com --internet-message-id <internetMessageId>
Flags:
--email string 邮件所属邮箱地址 (必填)
--internet-message-id string 邮件的 internetMessageId (必填),取自发送类命令返回值
```
根据 `internetMessageId` 查询某封邮件当前的发送投递状态。
> **internetMessageId 来源:** `message send` / `draft send` / `message reply` / `message reply-all` / `message forward` 等发送类命令的返回值中均会带 `internetMessageId` 字段,可直接传入此命令查询发送结果。
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `message` | `object` | 邮件完整信息 |
| `sendStatus` | `string` | 发送状态,取值见下表 |
**`sendStatus` 取值说明:**
| 值 | 含义 |
|------|------|
| `none` | 未发送 |
| `posting` | 投递中 |
| `partial_success` | 部分成功(部分收件人投递成功) |
| `success` | 发送成功 |
| `failed` | 发送失败 |
| `unknown` | 未知状态 |
### [危险] 撤回已发送的邮件
```
Usage:
dws mail sent-message recall [flags]
Example:
dws mail sent-message recall --email user@company.com --id <mailId> --subject "邮件主题" --yes
Flags:
--email string 发件人邮箱地址 (必填)
--id string 要撤回的邮件 ID (必填)
--subject string 邮件主题 (必填)
--yes 跳过确认提示,直接执行 (可选)
```
> ⚠️ **危险操作**:此命令会撤回已发送的邮件。仅支持撤回同组织内未读邮件。
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | `string` | 撤回任务 ID(可用于 recall-detail 查询进度) |
| `success` | `boolean` | 接口调用是否成功 |
| `errorCode` | `string` | 错误码(仅失败时存在) |
| `errorMsg` | `string` | 错误信息(仅失败时存在) |
### 查询邮件撤回进度
```
Usage:
dws mail sent-message recall-detail [flags]
Example:
dws mail sent-message recall-detail --email user@company.com --id <recallTaskId>
Flags:
--email string 用户的邮箱地址 (必填)
--id string 撤回任务 ID (必填),由 recall 命令返回
```
根据撤回任务 ID 查询邮件撤回的详细进度。撤回任务 ID 来源:`sent-message recall` 命令返回值中的 `id` 字段。
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | `boolean` | 调用是否成功 |
| `id` | `string` | 任务 ID |
| `status` | `string` | 任务状态(见下方枚举) |
| `errorCode` | `string` | 错误码(仅失败时存在) |
| `errorMsg` | `string` | 错误信息(仅失败时存在) |
**任务状态枚举:**
| 状态值 | 说明 |
|--------|------|
| `UNINITED` | 未初始化 |
| `SUBMITTED` | 已提交 |
| `RUNNING` | 执行中 |
| `FINISHED` | 已完成 |
| `CANCELED` | 已取消 |
| `FAILED` | 失败 |
### 创建草稿
```
Usage:
dws mail draft create [flags]
Example:
dws mail draft create --from user@company.com --to colleague@company.com \
--subject "草稿标题" --content "草稿正文"
dws mail draft create --from user@company.com --subject "草稿标题"
dws mail draft create --from user@company.com --subject "带附件草稿" \
--content "见附件" --attachment ./report.pdf
dws mail draft create --from user@company.com --subject "带图片草稿" \
--content "图表:[inline:chart.png]" --inline-attachment ./chart.png
Flags:
--from string 发件人邮箱 (必填),别名: --sender
--subject string 邮件标题 (必填)
--to string 收件人列表(可选,有确定收件人时才传)
--cc string 抄送人列表(可选,有确定抄送人时才传)
--content string 邮件正文(可选,有正文内容时才传),别名: --body
--attachment stringArray 附件文件路径,可多次指定 (可选)
--inline-attachment stringArray 内联图片路径,可多次指定,cid 自动生成 (可选)
```
> **注意:** `--to`、`--cc`、`--content` 均为可选参数,**仅在用户明确提供对应信息时才传入**。若用户未指定收件人,不要传 `--to ""`(空字符串)。
**附件说明:**
指定 `--attachment``--inline-attachment` 时,CLI 自动完成草稿创建和附件上传,**草稿保留在草稿箱,不会发送**。内联图片用法同 `message send``--content` 中使用 `[inline:文件名]` 占位符)。
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `messageId` | `string` | 新建草稿的邮件 ID |
### 更新草稿
```
Usage:
dws mail draft update [flags]
Example:
dws mail draft update --from user@company.com --id <messageId> --subject "新标题" --content "新正文"
dws mail draft update --from user@company.com --id <messageId> --content "见附件" --attachment ./report.pdf
dws mail draft update --from user@company.com --id <messageId> \
--content "图表:[inline:chart.png]" --inline-attachment ./chart.png
Flags:
--from string 发件人邮箱 (必填),别名: --sender
--id string 草稿邮件 ID (必填)
--to string 收件人列表(可选)
--cc string 抄送人列表(可选)
--subject string 邮件标题(可选)
--content string 邮件正文(可选),别名: --body
--attachment stringArray 附件文件路径,可多次指定 (可选)
--inline-attachment stringArray 内联图片路径,可多次指定,cid 自动生成 (可选)
```
**附件说明:**
指定 `--attachment``--inline-attachment` 时,CLI 自动完成草稿更新和附件上传,**草稿保留在草稿箱,不会发送**。内联图片用法同 `message send``--content` 中使用 `[inline:文件名]` 占位符)。
### 发送草稿
```
Usage:
dws mail draft send [flags]
Example:
dws mail draft send --from user@company.com --id <messageId>
Flags:
--from string 发件人邮箱 (必填),别名: --sender
--id string 草稿邮件 ID (必填)
```
将草稿箱中已有的草稿发送出去。草稿 ID 来自 `draft create``message search``folderId:5`)的返回结果。
### 搜索邮箱用户(通讯录)
```
Usage:
dws mail user search [flags]
Example:
dws mail user search --keyword "张三"
dws mail user search --email user@company.com --keyword "张三"
dws mail user search --email user@company.com --keyword "alice" --limit 10
dws mail user search --email user@company.com --keyword "alice" --cursor <nextCursor>
dws mail user search --email user@company.com --employee-no "E123456"
Flags:
--email string 搜索目标邮箱地址 (可选)
--keyword string 搜索关键词(未提供 --employee-no 时为必填)
--employee-no string 按工号搜索用户;提供此参数时 keyword 不再必填
--cursor string 分页游标,取自响应中的 nextCursor 字段(可选)
--limit string 每页返回数量(可选),别名: --size
```
> **重要区别(三个容易混淆的命令):**
> - `mail user search` — 搜索**企业通讯录用户**(按姓名/关键词或工号找人),用于获取某人的邮箱地址。需要企业邮箱权限。
> - `mail contact list` — 列举**个人联系人**(用户自己保存/创建的联系人列表),不需要关键词,返回自己的联系人。
> - `mail message search` — 搜索**邮件内容**(按 KQL 语法搜邮件,如主题、发件人、日期等)
>
> 不要混淆:查找"某人的邮箱地址"用 `user search`;查看"自己保存的联系人"用 `contact list`;查找"某封邮件"用 `message search`。
>
> 仅企业邮箱(非 `@dingtalk.com` 个人邮箱)可使用 `user search`;使用个人邮箱调用将因无权限而报错。
>
> `--keyword` 与 `--employee-no` 至少需要提供一个;当提供 `--employee-no` 时,`--keyword` 不再是必填字段。
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `users` | `List[]` | 匹配的用户列表,每条包含用户 ID、邮箱地址、姓名、昵称、工号、职位、工作地 |
| `nextCursor` | `string` | 下一页游标,传入 `--cursor` 翻页 |
| `hasMore` | `boolean` | 是否还有更多数据 |
**user 对象字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | `string` | 用户 ID |
| `email` | `string` | 展示使用的邮件地址 |
| `name` | `string` | 用户名(人名) |
| `nickname` | `string` | 用户昵称(或者花名) |
| `employeeNo` | `string` | 工号 |
| `jobTitle` | `string` | 职位 |
| `workLocation` | `string` | 工作地 |
### 创建邮件模板
```
Usage:
dws mail template create [flags]
Example:
dws mail template create --email user@company.com --name "周报模板" --subject "周报" --content "本周工作总结..."
dws mail template create --email user@company.com --from user@company.com --name "通知模板" --subject "通知" --content "..." --to a@x.com,b@x.com --cc c@x.com
Flags:
--email string 用户邮箱地址 (必填)
--from string 模板发件人邮箱 (可选)
--subject string 模板邮件标题 (必填)
--content string 模板邮件正文 (必填),别名: --body
--name string 模板名称 (必填)
--to string 模板收件人列表,逗号分隔 (可选)
--cc string 模板抄送人列表,逗号分隔 (可选)
--is-draft 是否为草稿模板 (可选,默认 false)
```
> **草稿模板说明:** 传入 `--is-draft` 创建的模板为草稿模板,草稿模板支持后续通过 `template update` 修改内容。**非草稿模板创建后不可修改**`template update` 仅对草稿模板有效)。
### 列举邮件模板
```
Usage:
dws mail template list [flags]
Example:
dws mail template list --email user@company.com --limit 20
dws mail template list --email user@company.com --limit 20 --cursor <nextCursor>
Flags:
--email string 用户邮箱地址 (必填)
--cursor string 分页游标,取自响应中的 nextCursor 字段 (可选)
--limit string 每页返回数量 (必填),别名: --size
```
### 获取邮件模板详情
```
Usage:
dws mail template get [flags]
Example:
dws mail template get --email user@company.com --id <templateId>
Flags:
--email string 用户邮箱地址 (必填)
--id string 模板唯一标识 (必填)
```
### 更新邮件模板
> **重要限制:** `template update` **仅对草稿模板有效**。只有通过 `template create --is-draft` 创建的草稿模板才支持更新,非草稿模板调用 update 会返回 `Invalid parameter` 错误。
```
Usage:
dws mail template update [flags]
Example:
dws mail template update --email user@company.com --id <templateId> --subject "新标题" --content "新正文"
dws mail template update --email user@company.com --id <templateId> --name "新模板名"
Flags:
--email string 用户邮箱地址 (必填)
--id string 模板唯一标识 (必填,必须是草稿模板的 ID)
--from string 模板发件人邮箱 (可选)
--subject string 模板邮件标题 (可选)
--content string 模板邮件正文 (可选),别名: --body
--name string 模板名称 (可选)
--to string 模板收件人列表,逗号分隔 (可选)
--cc string 模板抄送人列表,逗号分隔 (可选)
```
### 删除邮件模板
```
Usage:
dws mail template delete [flags]
Example:
dws mail template delete --email user@company.com --id <templateId>
Flags:
--email string 用户邮箱地址 (必填)
--id string 模板唯一标识 (必填)
```
> **特殊字符注意:** `--contact-id` 等 ID 参数的值可能包含 `$`、`!` 等 shell 特殊字符。在终端手动执行时,**必须用单引号**包裹这类参数值(如 `--contact-id '101_0:DzzzzyJqO10$---.hp5uBuR'`),双引号会导致 `$` 被 shell 变量展开,使 ID 值被篡改从而报错。通过 MCP 协议(JSON 传参)调用时无此问题。
### 创建邮件联系人
```
Usage:
dws mail contact create [flags]
Example:
dws mail contact create --email user@company.com --contact-email colleague@company.com --display-name "张三"
dws mail contact create --email user@company.com --contact-email colleague@company.com --first-name "三" --last-name "张"
Flags:
--email string 用户邮箱地址 (必填)
--contact-email string 联系人邮箱地址 (必填)
--first-name string 联系人名 (可选)
--middle-name string 联系人中间名 (可选)
--last-name string 联系人姓 (可选)
--display-name string 联系人显示名称 (可选)
```
### 列举邮件联系人
```
Usage:
dws mail contact list [flags]
Example:
dws mail contact list --email user@company.com --limit 20
dws mail contact list --email user@company.com --limit 20 --cursor <nextCursor>
Flags:
--email string 用户邮箱地址 (必填)
--cursor string 分页游标,取自响应中的 nextCursor 字段 (可选)
--limit string 每页返回数量 (必填),别名: --size
```
### 更新邮件联系人
```
Usage:
dws mail contact update [flags]
Example:
dws mail contact update --email user@company.com --contact-id <contactId> --display-name "李四"
dws mail contact update --email user@company.com --contact-id <contactId> --contact-email new@company.com --first-name "四" --last-name "李"
Flags:
--email string 用户邮箱地址 (必填)
--contact-id string 联系人唯一标识 (必填)
--contact-email string 联系人邮箱地址 (可选)
--first-name string 联系人名 (可选)
--middle-name string 联系人中间名 (可选)
--last-name string 联系人姓 (可选)
--display-name string 联系人显示名称 (可选)
```
### 批量删除邮件联系人
> **特殊字符注意:** `--contact-ids` 的值可能包含 `$`、`!` 等 shell 特殊字符。在终端手动执行时,**必须用单引号**包裹这类参数值(如 `--contact-ids '101_0:DzzzzyJqO10$---.hp5uBuR'`),双引号会导致 `$` 被 shell 变量展开,使 ID 值被篡改从而报错。通过 MCP 协议(JSON 传参)调用时无此问题。
```
Usage:
dws mail contact batch-delete [flags]
Example:
dws mail contact batch-delete --email user@company.com --contact-ids <id1>,<id2>
Flags:
--email string 用户邮箱地址 (必填)
--contact-ids string 要删除的联系人 ID 列表,逗号分隔 (必填)
```
### 获取自动回复配置
获取当前用户的邮件自动回复配置,包括是否启用、生效时间、回复范围和回复内容。
```
Usage:
dws mail auto-reply get [flags]
Example:
dws mail auto-reply get --email user@company.com
Flags:
--email string 用户的邮箱地址 (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `enabled` | bool | 是否启用自动回复 (true=启用, false=禁用) |
| `startTime` | string | 自动回复开始时间 |
| `endTime` | string | 自动回复结束时间 |
| `scope` | string | 回复范围: "contact"(仅联系人) 或 "all"(所有人) |
| `content` | string | 自动回复内容 |
### 更新自动回复配置
更新或设置用户的邮件自动回复配置。所有参数均为必填。建议先通过 `auto-reply get` 获取当前配置,再传入需要修改的字段值。
```
Usage:
dws mail auto-reply update [flags]
Example:
dws mail auto-reply update --email user@company.com --enabled true \
--start "2026/07/01 09:00:00 +0800" --end "2026/07/07 18:00:00 +0800" \
--scope all --content "出差中,请稍后联系"
dws mail auto-reply update --email user@company.com --enabled false \
--start "2026/07/01 09:00:00 +0800" --end "2026/07/07 18:00:00 +0800" \
--scope all --content "已关闭自动回复"
Flags:
--email string 用户的邮箱地址 (必填)
--enabled string 是否启用自动回复: true/false (必填)
--start string 自动回复开始时间,格式: YYYY/MM/DD HH:MM:SS +ZZZZ (必填)
--end string 自动回复结束时间,格式: YYYY/MM/DD HH:MM:SS +ZZZZ (必填)
--scope string 回复范围: contact(仅联系人)/all(所有人) (必填)
--content string 自动回复内容 (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | boolean | 更新是否成功 |
| `result` | object | 更新结果,成功时为空对象 |
| `errorCode` | string | 错误码(仅失败时存在) |
| `errorMsg` | string | 错误信息(仅失败时存在) |
### 个人收信白名单管理
#### 列出白名单
```
Usage:
dws mail allow-list list [flags]
Example:
dws mail allow-list list --email user@company.com
Flags:
--email string 用户的邮箱地址 (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `total` | number | 白名单总数 |
| `entries` | string[] | 白名单地址列表(邮件地址如 `123@domain.com`,域名如 `@domain.com`,域名前需加 `@` |
| `success` | boolean | 调用是否成功 |
| `errorCode` | string | 错误码(仅失败时存在) |
| `errorMsg` | string | 错误信息(仅失败时存在) |
#### 添加白名单
```
Usage:
dws mail allow-list add [flags]
Example:
dws mail allow-list add --email user@company.com --entries a@b.com,@spam.com
Flags:
--email string 用户的邮箱地址 (必填)
--entries string 逗号分隔的地址列表,支持邮件地址(如123@domain.com)或域名(如@domain.com)
```
#### 移除白名单
```
Usage:
dws mail allow-list remove [flags]
Example:
dws mail allow-list remove --email user@company.com --entries a@b.com,@spam.com
Flags:
--email string 用户的邮箱地址 (必填)
--entries string 逗号分隔的地址列表,支持邮件地址(如123@domain.com)或域名(如@domain.com)
```
### 个人收信黑名单管理
#### 列出黑名单
```
Usage:
dws mail block-list list [flags]
Example:
dws mail block-list list --email user@company.com
Flags:
--email string 用户的邮箱地址 (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `total` | number | 黑名单总数 |
| `entries` | string[] | 黑名单地址列表(邮件地址如 `123@domain.com`,域名如 `@domain.com`,域名前需加 `@` |
| `success` | boolean | 调用是否成功 |
| `errorCode` | string | 错误码(仅失败时存在) |
| `errorMsg` | string | 错误信息(仅失败时存在) |
#### 添加黑名单
```
Usage:
dws mail block-list add [flags]
Example:
dws mail block-list add --email user@company.com --entries spam@bad.com,@junk.com
Flags:
--email string 用户的邮箱地址 (必填)
--entries string 逗号分隔的地址列表,支持邮件地址(如123@domain.com)或域名(如@domain.com)
```
#### 移除黑名单
```
Usage:
dws mail block-list remove [flags]
Example:
dws mail block-list remove --email user@company.com --entries spam@bad.com,@junk.com
Flags:
--email string 用户的邮箱地址 (必填)
--entries string 逗号分隔的地址列表,支持邮件地址(如123@domain.com)或域名(如@domain.com)
```
### 收信规则管理
#### 列出收信规则
列出当前用户的所有收信规则,包括规则名称、启用状态、条件、动作和排序。
```
Usage:
dws mail rule list [flags]
Example:
dws mail rule list --email user@company.com
Flags:
--email string 用户的邮箱地址 (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `total` | int | 规则总数 |
| `rules` | List[] | 规则列表 |
| `rules[].id` | string | 规则 ID |
| `rules[].name` | string | 规则名称 |
| `rules[].enabled` | bool | 是否启用 |
| `rules[].conditions` | List[] | 规则条件列表 |
| `rules[].actions` | List[] | 规则动作列表 |
| `rules[].order` | int | 规则排序 |
#### 创建收信规则
创建一条新的收信规则。支持设置规则名称、启用状态、匹配条件和执行动作。
> **`--conditions` 和 `--actions`** 为 JSON 数组字符串。
**界面与参数对应关系:**
| 界面元素 | CLI 参数 / JSON 字段 | 说明 |
|----------|---------------------|------|
| 规则名称 | `--name` | 必填,规则的显示名称 |
| 如果满足以下「全部」条件 | `--conditions` | 多个条件之间为 **AND** 关系(即所有条件都满足才触发) |
| ├ 对象下拉(发件人) | `object: "from"` | 条件匹配的对象,可选值见下方 |
| ├ 操作下拉(包含) | `operation: "include"` | 匹配方式,可选值见下方 |
| └ 关键词输入框 | `keyword: "a@test.com"` | 匹配的具体值 |
| 执行以下操作 | `--actions` | 条件满足后执行的动作列表 |
| ├ 动作下拉(移动到文件夹) | `action: "ActSavetoFolder"` | 动作类型,可选值见下方 |
| └ 参数选择(收件箱) | `parameters: ["2"]` | 动作的参数,如目标文件夹 ID |
**条件逻辑说明:**
- `--conditions` 数组中的多个条件之间为 **AND(且)** 关系,即所有条件都满足才触发规则
- 同一个条件对象(如 `from`)内部的 `or` 数组中多个表达式之间为 **OR(或)** 关系
- 同一个 `and` 数组中的多个子条件之间为 **AND(且)** 关系
**条件对象 (object) 与合法操作类型 (operation) 组合:**
| object | 合法 operation | 说明 |
|--------|---------------|------|
| `from` | `include`(包含), `exclude`(不包含), `oneof`(是联系人之一), `noneof`(不是联系人之一) | 匹配发件人地址或名称 |
| `to` | `include`(包含), `exclude`(不包含), `oneof`(是联系人之一), `noneof`(不是联系人之一) | 匹配收件人地址或名称 |
| `subject` | `include`(包含), `exclude`(不包含) | 匹配邮件主题 |
| `attachment` | `exist`(是否存在附件) | keyword="1" 表示有附件,keyword="0" 表示无附件 |
| `x-aliyun-size` | `greater`(大于), `less`(小于) | 邮件大小,单位为 **字节(Bytes)**1KB=1024, 1MB=1048576);可组合使用表示范围区间 |
**操作类型 (operation) 详细说明:**
| 值 | 界面显示 | 适用 object | 说明 |
|----|---------|------------|------|
| `include` | 包含 | from, to, subject | 字段包含关键词 |
| `exclude` | 不包含 | from, to, subject | 字段不包含关键词 |
| `oneof` | 是联系人之一 | from, to | 字段值在给定联系人列表中 |
| `noneof` | 不是联系人之一 | from, to | 字段值不在给定联系人列表中 |
| `greater` | 大于 | x-aliyun-size | 数值大于阈值,单位字节(Bytes) |
| `less` | 小于 | x-aliyun-size | 数值小于阈值,单位字节(Bytes) |
| `exist` | 存在 | attachment | keyword="1" 表示有附件,keyword="0" 表示无附件 |
**动作类型 (action) 可选值:**
| 值 | 界面显示 | parameters 说明 | 前置依赖 |
|----|---------|----------------|----------|
| `ActSavetoFolder` | 移动到文件夹 | 目标文件夹 ID,如 `["2"]`2=收件箱) | 需先通过 `dws mail folder list` 获取文件夹 ID |
| `ActFlagMail` | 标记标签 | 标签 ID 列表,逗号分隔,如 `["102,11,1"]` | 需先通过 `dws mail tag list` 获取标签 ID |
| `ActFlagMail2` | 标记已读 | `"asread"`(标记已读),服务端仅支持标记已读,不支持标记未读 | 无 |
| `ActReply` | 自动回复 | 回复内容文本,如 `["感谢您的来信"]` | 无 |
**条件 JSON 结构说明:**
每个条件由 `object`(匹配对象)和 `or`OR 表达式列表)组成,`or` 内嵌 `and`AND 条件列表)。
| 字段 | 说明 |
|------|------|
| `object` | 条件对象,取值及合法 operation 见上方组合表 |
| `or` | OR 表达式列表,同一 object 下多个 or 项之间为 **OR** 关系 |
| `and` | AND 条件列表,同一 or 项内多个 and 子条件之间为 **AND** 关系 |
| `operation` | 操作类型,必须与 object 合法组合(见上方组合表) |
| `keyword` | 关键词/阈值;attachment+exist 时 "1"=有附件/"0"=无附件;x-aliyun-size 时单位为字节(Bytes),如 1KB=1024, 1MB=1048576 |
| `ignoreCase` | 是否忽略大小写(布尔值,仅 from/to/subject + include/exclude 时需要) |
**完整 conditions JSON 示例:**
```json
[
{"object":"from","or":[
{"and":[{"operation":"oneof","keyword":"a@test.com","ignoreCase":true}]},
{"and":[{"operation":"oneof","keyword":"b@test.com","ignoreCase":true}]}
]},
{"object":"subject","or":[{"and":[{"operation":"include","keyword":"报告","ignoreCase":true}]}]},
{"object":"attachment","or":[{"and":[{"operation":"exist","keyword":"1"}]}]},
{"object":"x-aliyun-size","or":[{"and":[{"operation":"greater","keyword":"1024"},{"operation":"less","keyword":"10240"}]}]}
]
```
> 上例表示:发件人是 a@test.com **或** b@test.com **且** 主题包含"报告" **且** 有附件 **且** 大小在 1KB(1024字节)~10KB(10240字节) 之间。
>
> **同一 object 下匹配多个值的 OR 写法:** 在 `or` 数组中放多个 `and` 项(每个 `and` 对应一个匹配值),而非在一个 `and` 中放多个条件。例如上方 `from` 条件中,两个邮箱地址分别作为独立的 `and` 项放在 `or` 数组中,表示"满足任一即可"。
**完整 actions JSON 示例:**
```json
[
{"action":"ActSavetoFolder","parameters":["2"]},
{"action":"ActFlagMail","parameters":["102,11,1"]},
{"action":"ActFlagMail2","parameters":["asread"]},
{"action":"ActReply","parameters":["感谢您的来信,我将尽快回复"]}
]
```
> **注意:** 使用 `ActSavetoFolder` 前需先通过 `dws mail folder list` 获取文件夹 ID;使用 `ActFlagMail` 前需先通过 `dws mail tag list` 获取标签 ID。
```
Usage:
dws mail rule create [flags]
Example:
dws mail rule create --email user@company.com --name "VIP邮件标记" --enabled true \
--conditions '[{"object":"from","or":[{"and":[{"operation":"include","keyword":"vip@company.com","ignoreCase":true}]}]}]' \
--actions '[{"action":"ActFlagMail2","parameters":["asread"]}]'
dws mail rule create --email user@company.com --name "大附件归档" \
--conditions '[{"object":"x-aliyun-size","or":[{"and":[{"operation":"greater","keyword":"10485760"}]}]}]' \
--actions '[{"action":"ActSavetoFolder","parameters":["6"]}]'
Flags:
--email string 用户的邮箱地址 (必填)
--name string 规则名称 (必填)
--enabled string 是否启用: true/false (必填)
--conditions string 规则条件 JSON 数组 (可选)
--actions string 规则动作 JSON 数组 (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | bool | 创建是否成功 |
| `errorCode` | string | 错误码 |
| `errorMsg` | string | 错误消息 |
| `id` | string | 新建规则 ID |
#### 更新收信规则
更新已有的收信规则。**除 `--conditions` 外所有参数均为必填**。
> **建议工作流:** 先通过 `dws mail rule list` 获取当前规则的完整配置,再传入需要修改的字段值。
>
> `--conditions` 为空或不传表示命中所有邮件(无条件匹配)。`--actions` 格式同 create 命令。
```
Usage:
dws mail rule update [flags]
Example:
dws mail rule update --email user@company.com --id <ruleId> --name "新规则名" --enabled true \
--actions '[{"action":"ActSavetoFolder","parameters":["6"]}]'
dws mail rule update --email user@company.com --id <ruleId> --name "全量归档" --enabled false \
--conditions '[{"object":"subject","or":[{"and":[{"operation":"include","keyword":"报告","ignoreCase":true}]}]}]' \
--actions '[{"action":"ActSavetoFolder","parameters":["6"]}]'
Flags:
--email string 用户的邮箱地址 (必填)
--id string 规则 ID (必填)
--name string 规则名称 (必填)
--enabled string 是否启用: true/false (必填)
--conditions string 规则条件 JSON 数组 (可选,为空表示命中所有邮件)
--actions string 规则动作 JSON 数组 (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | bool | 更新是否成功 |
| `errorCode` | string | 错误码 |
| `errorMsg` | string | 错误信息 |
| `result` | object | 更新结果 |
#### 删除收信规则
删除指定的收信规则。
```
Usage:
dws mail rule delete [flags]
Example:
dws mail rule delete --email user@company.com --id <ruleId>
Flags:
--email string 用户的邮箱地址 (必填)
--id string 规则 ID (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | bool | 删除是否成功 |
| `errorCode` | string | 错误码 |
| `errorMsg` | string | 错误信息 |
| `result` | object | 删除结果 |
#### 调整收信规则排序
调整指定收信规则的排序位置,向上(up)或向下(down)移动。
```
Usage:
dws mail rule adjust [flags]
Example:
dws mail rule adjust --email user@company.com --id <ruleId> --direction up
dws mail rule adjust --email user@company.com --id <ruleId> --direction down
Flags:
--email string 用户的邮箱地址 (必填)
--id string 规则 ID (必填)
--direction string 调整方向: up/down (必填)
```
**返回字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| `success` | bool | 调整是否成功 |
| `errorCode` | string | 错误码 |
| `errorMsg` | string | 错误消息 |
| `result` | object | 调整结果 |
## 通用错误说明
以下错误适用于所有 mail 命令。
| 错误标识 | 含义 | 处理建议 |
|----------|------|----------|
| `domain.notFound` | 该用户的邮箱不是由钉钉邮箱托管,无法完成操作 | 确认邮箱是否已开通钉钉企业邮箱服务 |
## 意图判断
用户说"我的邮箱/邮箱地址" → `mailbox list`(**仅限查询自己的邮箱,不能查他人**)
用户说"获取/查找/得到 某人的邮箱地址" → **不是 `mailbox list`**,走三路并发查询流程(见「查找他人邮箱地址」章节)
用户说"找邮件/搜邮件/查邮件" → `message search`
用户说"看邮件/打开邮件/邮件内容" → 先 `message search` 获取 messageId,再 `message get`
用户说"发邮件/写邮件" → 先 `mailbox list` 获取发件地址,再 `message send`
用户说“给(某人名字)发邮件” / “查询某人发给我的邮件” / “查询发给某人的邮件” / 任何涉及按人名查找邮箱的场景 →
**第一步**`aisearch person --query <姓名> --dimension name``contact user get --ids <userId>`,提取 `orgAuthEmail`;为空时再用 `mail user search --email <当前邮箱> --keyword <姓名>` 补查。仍无有效邮箱则 ask_human 请用户提供,禁止臆测。
**第二步**:用获得的目标邮箱拼入 KQL(如 `from:<email>``to:<email>`)执行 `message search`,或用于 `message send`
用户说"发带附件的邮件/发邮件附件" → 先 `mailbox list` 获取发件地址,再 `message send --attachment <文件路径>`
用户说"给(某人名字)发邮件" → 先 `aisearch person` 获取 userId,再 `contact user get` 获取收件人邮箱,再 `message send`
用户说"查看附件/邮件附件/有什么附件" → 先 `message search` 获取 messageId,再 `attachment list`
用户说"下载附件/保存附件/把附件存到本地/把所有附件下载到..." → 先 `message search` 获取 messageId,再 `attachment list` 获取 attachmentId 和 name,最后逐个 `attachment download`(**不支持批量下载,不存在 download_batch/download_all 命令,必须逐个下载**
用户说"把XX邮件的所有附件都下载" / "批量下载附件" / "下载4月所有发票邮件的附件" → **不存在批量下载命令**,必须按以下流程循环执行:1) `message search` 搜索匹配邮件获取 messageId 列表 → 2) 对每封邮件 `attachment list` 获取 attachmentId + name → 3) 对每个附件逐个调用 `attachment download`。不要编造 `download_batch` / `download_all` / `batch_download` 等不存在的命令
用户说"创建邮件文件夹/新建邮箱文件夹/新建邮件目录" → `folder create`
用户说"在某个邮件文件夹下创建子文件夹" → 先 `folder list` 找到父文件夹 ID,再 `folder create --folder <folderId>`;禁止把父文件夹名称直接填给 `--folder`
用户说"删除邮件文件夹/删除邮箱文件夹/删除邮件目录" → 先确认要删除的文件夹 ID;如果用户只给名称,先 `folder list` 找到 `folders[].id`,再 `folder delete --id <folderId>`
用户说"重命名邮件文件夹/修改邮箱文件夹名称/更新邮件目录名称" → 先确认要更新的文件夹 ID;如果用户只给原名称,先 `folder list` 找到 `folders[].id`,再 `folder update --id <folderId> --name <新名称>`
用户说"查看邮件标签/列出邮箱标签/查看邮箱 label" → `tag list`
用户说"创建邮件标签/新建邮箱标签/新增 label" → `tag create`
用户说"在某个邮件标签下创建子标签" → 先 `tag list` 找到父标签 ID,再 `tag create --parent-id <tagId>`;禁止把父标签名称直接填给 `--parent-id`
用户说"删除邮件标签/删除邮箱标签/删除 label" → 先确认要删除的标签 ID;如果用户只给名称,先 `tag list` 找到 `tags[].id`,再 `tag delete --id <tagId>`
用户说"重命名邮件标签/修改邮箱标签名称/更新 label 名称" → 先确认要更新的标签 ID;如果用户只给原名称,先 `tag list` 找到 `tags[].id`,再 `tag update --id <tagId> --name <新名称>`
用户说"列出邮件会话/查看会话列表/查看某个文件夹里的邮件会话" → 先确认邮箱地址和文件夹 ID;如果只有文件夹名称,先 `folder list` 找到 `folders[].id`,再 `thread list --folder <folderId>`
用户说"查看会话/获取会话/看这封邮件的会话详情" → 如果已有会话 ID,直接 `thread get`;如果只有邮件线索,先 `message search``message get` 获取 `conversationId`,再 `thread get`
用户说"标记会话已读/未读/给会话加标签/移除会话标签" → 用 `thread update`;如果是多条会话,用 `thread batch-update`;标签操作必须先有标签 ID
用户说"删除会话/把会话放入已删除/批量删除会话" → 单条用 `thread trash`,多条用 `thread batch-trash`;传入的是会话 ID,不是邮件 ID
用户说"搜索/查找/联系 邮箱用户/联系人/某人的邮箱地址" → `user search`(搜索通讯录人员,不是搜邮件内容)
用户说"发送草稿/把草稿发出去/发这封草稿" → 先 `message search --query "folderId:5"` 找到草稿 messageId,再 `draft send`
用户说"邮件发出去了吗/查邮件发送状态/确认邮件是否发送成功/邮件投递结果" → 用发送类命令返回的 `internetMessageId`,调用 `message verify` 查询 `sendStatus`
用户说"翻页继续搜索联系人/通讯录" → `user search --cursor <nextCursor>`(注意:不是 `message search`
**`user search` vs `message search` 关键区别:**
- `user search`:搜索的是**人**(通讯录联系人),入参是 `--keyword 姓名``--employee-no 工号`,返回用户信息
- `message search`:搜索的是**邮件**(邮件内容),入参是 `--query KQL表达式`,返回邮件列表
## 严格禁止 (NEVER DO)
- 明确禁止猜测、假设、推断发件人和收件人邮箱
- 无法获取邮箱时,强引导ask_human,由用户确认,不要通过假设或其他方式继续执行
- **严禁在用户未明确指定使用个人邮箱时,默认选择 `@dingtalk.com` 个人邮箱作为 `--email` / `--from`**;默认必须从 `mailbox list` 中挑选企业邮箱
- **涉及带附件的邮件操作时,严禁上传到钉钉媒体存储(media upload)**;必须使用对应命令的 `--attachment` / `--inline-attachment` 参数,由 CLI 内部完成附件处理
- **严禁编造不存在的批量下载命令**(如 `attachment download_batch``attachment download_all``attachment batch_download` 等)。下载附件只有 `attachment download` 一条命令,每次只能下载一个附件;需要批量下载时必须循环调用
- **严禁把文件夹名称当作 `folder create --folder` 的值**`--folder` 只能填父文件夹 ID,父文件夹 ID 必须来自 `folder list``folders[].id`
- **严禁把文件夹名称当作 `folder delete/update --id` 的值**`--id` 只能填要操作的文件夹 ID,文件夹 ID 必须来自 `folder list``folders[].id``folder create``result.folder.id`
- **严禁把标签名称当作 `tag create --parent-id` 的值**`--parent-id` 只能填父标签 ID,父标签 ID 必须来自 `tag list``tags[].id`
- **严禁把标签名称当作 `tag delete/update --id` 的值**`--id` 只能填要操作的标签 ID,标签 ID 必须来自 `tag list``tags[].id``tag create``result.tag.id`
- **严禁更新或删除系统标签**`tag update/delete` 只适用于用户自定义标签
- **严禁把文件夹名称当作 `thread list --folder` 的值**`--folder` 只能填文件夹 ID,文件夹 ID 必须来自 `folder list``folders[].id`
- **严禁把邮件 ID 当作 `thread get/update/trash/batch-update/batch-trash` 的会话 ID**;这些命令需要 conversationId,可来自 `thread list``conversations[].id` 或邮件结果中的 `conversationId`
## 核心工作流
```bash
# 1. 查看可用邮箱 — 提取邮箱地址
dws mail mailbox list --format json
# 1b. 创建顶层邮件文件夹
dws mail folder create --email user@company.com --name "项目资料" --format json
# 1c. 创建子文件夹 — 先通过 folder list 获取父文件夹 id,再传给 --folder
dws mail folder list --email user@company.com --format json
dws mail folder create --email user@company.com --name "子文件夹" --folder <folderId> --format json
# 1d. 更新或删除邮件文件夹 — 先通过 folder list 获取目标文件夹 id,再传给 --id
dws mail folder list --email user@company.com --format json
dws mail folder update --email user@company.com --id <folderId> --name "新文件夹名" --format json
dws mail folder delete --email user@company.com --id <folderId> --format json
# 1e. 创建顶层邮件标签
dws mail tag create --email user@company.com --name "项目资料" --format json
# 1f. 创建子标签 — 先通过 tag list 获取父标签 id,再传给 --parent-id
dws mail tag list --email user@company.com --format json
dws mail tag create --email user@company.com --name "子标签" --parent-id <tagId> --format json
# 1g. 更新或删除邮件标签 — 先通过 tag list 获取目标标签 id,再传给 --id
dws mail tag list --email user@company.com --format json
dws mail tag update --email user@company.com --id <tagId> --name "新标签名" --format json
dws mail tag delete --email user@company.com --id <tagId> --format json
# 1h. 列出文件夹中的邮件会话 — 先通过 folder list 获取文件夹 id,再传给 --folder
dws mail folder list --email user@company.com --format json
dws mail thread list --email user@company.com --folder <folderId> --limit 10 --format json
# 1i. 修改或删除邮件会话 — 先通过 thread list 获取 conversationId
dws mail thread update --email user@company.com --id <conversationId> --action markRead --format json
dws mail thread batch-update --email user@company.com --ids <conversationId1>,<conversationId2> --action markUnread --format json
dws mail thread trash --email user@company.com --id <conversationId> --format json
dws mail thread batch-trash --email user@company.com --ids <conversationId1>,<conversationId2> --format json
# 2. 搜索邮件 — 提取 messageId
dws mail message search --email user@company.com \
--query "subject:\"周报\" AND date>2025-06-01T00:00:00Z" --limit 10 --format json
# 3. 查看邮件详情
dws mail message get --email user@company.com --id <messageId> --format json
# 4. 发送邮件(纯文本)
dws mail message send --from user@company.com --to colleague@company.com \
--subject "周报" --content "本周完成…" --format json
# 4b. 发送带附件的邮件(自动编排:创建草稿→上传附件→发送草稿)
dws mail message send --from user@company.com --to colleague@company.com \
--subject "周报" --content "见附件" --attachment ./report.pdf --format json
# 4c. 发送带内联图片的邮件(正文自动转 HTML,<img> 标签自动注入)
dws mail message send --from user@company.com --to colleague@company.com \
--subject "图表周报" --content "本周图表如下:[inline:chart.png]" \
--inline-attachment ./chart.png --format json
# 5. 下载邮件附件到本地(每次只能下载一个附件,不支持批量下载)
# 步骤 5.1:搜索匹配的邮件,获取 messageId 列表
# 示例:下载4月所有发票邮件的附件
dws mail message search --email user@company.com \
--query "subject:发票 AND date>2025-04-01T00:00:00Z AND date<2025-05-01T00:00:00Z AND hasAttachments:true" --limit 50 --format json
# 步骤 5.2:对每封邮件,列出附件获取 attachmentId 和 name
# (对搜索结果中的每封邮件都要执行一次)
dws mail attachment list --email user@company.com --id <messageId> --format json
# 步骤 5.3:对每个附件逐个下载(没有批量下载命令,必须循环调用)
dws mail attachment download --email user@company.com \
--message-id <messageId> --attachment-id <attachmentId> --name report.pdf --output ~/invoices/
# 6. 获取邮件所属会话详情(thread)
# 步骤 6.1:先通过 message search 或 message get 获取邮件中的 conversationId
dws mail message search --email user@company.com \
--query "subject:\"周报\"" --limit 5 --format json
# 从返回的邮件列表中提取 conversationId 字段
# 步骤 6.2:用 conversationId 获取会话详情
dws mail thread get --email user@company.com --id <conversationId> --format json
```
## 上下文传递表
| 操作 | 从返回中提取 | 用于 |
|------|-------------|------|
| `mailbox list` | 邮箱地址 | message search/get/send/thread get 的 --email/--from |
| `message search` | `messageId` | message get 的 --id |
| `message search` | `conversationId` | thread get 的 --id |
| `message search` | `messageId` | attachment list 的 --id |
| `attachment list` | `attachments[].id` / `attachments[].name` | attachment download 的 --attachment-id / --name |
| `message get` | `conversationId` | thread get 的 --id |
| `folder list` | `folders[].id` | folder create 的 --folderfolder delete/update 的 --id |
| `folder create` | `result.folder.id` | 后续创建子文件夹或移动邮件时作为 --folder;更新/删除该文件夹时作为 --id |
| `folder list` | `folders[].id` | thread list 的 --folder |
| `thread list` | `conversations[].id` | thread get/update/trash/batch-update/batch-trash 的 --id/--ids |
| `tag list` | `tags[].id` | thread update/batch-update 的 --tag-ids |
| `tag list` | `tags[].id` | tag create 的 --parent-idtag delete/update 的 --id |
| `tag create` | `result.tag.id` | 后续创建子标签时作为 --parent-id;更新/删除该标签时作为 --id |
| `aisearch person``contact user get`;必要时 `mail user search` | 用户邮箱 (orgAuthEmail / email) | message send 的 --to/--cc |
| `user search` | 用户邮箱 (email) | message send 的 --to/--cc |
| `message send` / `draft send` / `message reply` / `message reply-all` / `message forward` | `internetMessageId` | `message verify` 的 --internet-message-id |
## 注意事项
- `mailbox list` 返回用户所有邮箱(含个人和企业),每条记录包含邮箱地址、账号类型、所属企业。**默认一律选择企业邮箱**(除非用户明确指定使用个人邮箱);若有多个企业邮箱可选,优先匹配用户当前所在企业的那一个;仍无法判断时向用户确认后再操作。详见文档顶部「默认邮箱选择规则」章节
- `message search` 返回邮件 ID 和元信息(不含正文),需 `message get` 获取完整内容
- KQL 查询支持 AND/OR/NOT 组合,字段值含空格时需用双引号
- `--cc` 抄送人支持多人,逗号分隔
- 收件人邮箱获取:用户只知道同事名字时,先 `dws aisearch person --query "名字" --dimension name` 取得 userId,再 `dws contact user get --ids <userId>` 提取 `orgAuthEmail`。该字段为空时,可用 `dws mail user search --email <发件人邮箱> --keyword "名字"` 补查(仅企业邮箱账号可调用;若已知工号,可改用 `--employee-no <工号>`)。仍无有效邮箱时必须 ask_human,严禁臆测和假设
- `thread list --folder` 的值必须是文件夹 ID,不是文件夹显示名称;不知道文件夹 ID 时,先调用 `folder list``folders[].id`
- `thread get/update/trash/batch-update/batch-trash` 使用的是会话 IDconversationId),不是邮件 ID;会话 ID 可来自 `thread list``conversations[].id`,也可来自 `message search``message get` 返回的 `conversationId`
- `thread update` / `thread batch-update` 仅支持 `markRead``markUnread``addTags``removeTags`;标签操作必须传 `--tag-ids`
- `user search` 仅支持企业邮箱(非 `@dingtalk.com` 个人邮箱),使用个人邮箱将因无权限报错;搜到的用户邮箱(`email` 字段)可直接用于 `message send``--to`/`--cc` 参数
- `folder create --folder` 的值必须是父文件夹 ID,不是文件夹显示名称;不知道父文件夹 ID 时,先调用 `folder list``folders[].id`
- `folder delete/update --id` 的值必须是目标文件夹 ID,不是文件夹显示名称;不知道目标文件夹 ID 时,先调用 `folder list``folders[].id`