# 邮箱 (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 --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 Flags: --email string 邮件所属邮箱地址 (必填) --folder-id string 文件夹 ID(1=已发送, 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"` | `from:张 三`(含空格未加引号) | | `to` | 字符串(邮件地址或名称) | 收件人,支持:纯邮件地址、纯名称(含空格须加双引号)、`"名称<邮件地址>"` 格式 | `to:bob@company.com`、`to:"李 四"`、`to:"alice"` | `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 --format json ``` ### 查看邮件完整内容 ``` Usage: dws mail message get [flags] Example: dws mail message get --email user@company.com --id 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 , dws mail message batch-get --email user@company.com --ids ,, 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 并注入 `` 标签) 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 自动替换为 `` 标签 - 若 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 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 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 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 --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 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 # 再下载指定附件到当前目录(每次只能下载一个附件) dws mail attachment download --email user@company.com --message-id --attachment-id --name report.pdf # 下载到指定目录 dws mail attachment download --email user@company.com --message-id --attachment-id --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 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 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 --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 --limit 10 dws mail thread list --email user@company.com --folder 104 --limit 20 --cursor 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 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 --action markRead dws mail thread update --email user@company.com --id --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 , --action markUnread dws mail thread batch-update --email user@company.com --ids , --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 --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 , --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 dws mail message reply --from user@company.com --id --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 并注入 `` 标签) 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 dws mail message reply-all --from user@company.com --id --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 并注入 `` 标签) 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 dws mail message forward --from user@company.com --to colleague@company.com --id --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 并注入 `` 标签) 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 , --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 , 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 , --action markRead dws mail message batch-update --email user@company.com --ids , --action addTags --tags 1,2 dws mail message batch-update --email user@company.com --ids , --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 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 --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 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 --subject "新标题" --content "新正文" dws mail draft update --from user@company.com --id --content "见附件" --attachment ./report.pdf dws mail draft update --from user@company.com --id \ --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 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 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 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 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 --subject "新标题" --content "新正文" dws mail template update --email user@company.com --id --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 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 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 --display-name "李四" dws mail contact update --email user@company.com --contact-id --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 , 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 --name "新规则名" --enabled true \ --actions '[{"action":"ActSavetoFolder","parameters":["6"]}]' dws mail rule update --email user@company.com --id --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 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 --direction up dws mail rule adjust --email user@company.com --id --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 `,提取 `orgAuthEmail`;为空时再用 `mail user search --email <当前邮箱> --keyword <姓名>` 补查。仍无有效邮箱则 ask_human 请用户提供,禁止臆测。 **第二步**:用获得的目标邮箱拼入 KQL(如 `from:` 或 `to:`)执行 `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 `;禁止把父文件夹名称直接填给 `--folder` 用户说"删除邮件文件夹/删除邮箱文件夹/删除邮件目录" → 先确认要删除的文件夹 ID;如果用户只给名称,先 `folder list` 找到 `folders[].id`,再 `folder delete --id ` 用户说"重命名邮件文件夹/修改邮箱文件夹名称/更新邮件目录名称" → 先确认要更新的文件夹 ID;如果用户只给原名称,先 `folder list` 找到 `folders[].id`,再 `folder update --id --name <新名称>` 用户说"查看邮件标签/列出邮箱标签/查看邮箱 label" → `tag list` 用户说"创建邮件标签/新建邮箱标签/新增 label" → `tag create` 用户说"在某个邮件标签下创建子标签" → 先 `tag list` 找到父标签 ID,再 `tag create --parent-id `;禁止把父标签名称直接填给 `--parent-id` 用户说"删除邮件标签/删除邮箱标签/删除 label" → 先确认要删除的标签 ID;如果用户只给名称,先 `tag list` 找到 `tags[].id`,再 `tag delete --id ` 用户说"重命名邮件标签/修改邮箱标签名称/更新 label 名称" → 先确认要更新的标签 ID;如果用户只给原名称,先 `tag list` 找到 `tags[].id`,再 `tag update --id --name <新名称>` 用户说"列出邮件会话/查看会话列表/查看某个文件夹里的邮件会话" → 先确认邮箱地址和文件夹 ID;如果只有文件夹名称,先 `folder list` 找到 `folders[].id`,再 `thread list --folder ` 用户说"查看会话/获取会话/看这封邮件的会话详情" → 如果已有会话 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 `(注意:不是 `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 --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 --name "新文件夹名" --format json dws mail folder delete --email user@company.com --id --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 --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 --name "新标签名" --format json dws mail tag delete --email user@company.com --id --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 --limit 10 --format json # 1i. 修改或删除邮件会话 — 先通过 thread list 获取 conversationId dws mail thread update --email user@company.com --id --action markRead --format json dws mail thread batch-update --email user@company.com --ids , --action markUnread --format json dws mail thread trash --email user@company.com --id --format json dws mail thread batch-trash --email user@company.com --ids , --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 --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, 标签自动注入) 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 --format json # 步骤 5.3:对每个附件逐个下载(没有批量下载命令,必须循环调用) dws mail attachment download --email user@company.com \ --message-id --attachment-id --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 --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 的 --folder;folder 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-id;tag 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 ` 提取 `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` 使用的是会话 ID(conversationId),不是邮件 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`