gws Gmail 邮件转发指南使用gws gmail forward将邮件转发给新收件人【免费下载链接】cliGoogle Workspace CLI — one command-line tool for Drive, Gmail, Calendar, Sheets, Docs, Chat, Admin, and more. Dynamically built from Google Discovery Service. Includes AI agent skills.项目地址: https://gitcode.com/gh_mirrors/cli413/cligws gmail forward是 Google Workspace CLIgws内置的 Gmail 辅助命令用于把一封已有邮件完整转发给一个或多个新收件人。本文将围绕 skills/gws-gmail-forward/SKILL.md 展开结合 forward.rs 与 gmail/mod.rs 的源码实现完整讲解该命令的全部参数、典型用法、附件与 HTML 模式的行为细节以及它在底层的 MIME 构造与 Gmail API 调用链路。读完本文你将能用一条命令完成带备注、带附件、带 CC/BCC、甚至先存草稿的邮件转发并理解其行为与 Gmail 网页版保持一致的原因。前置条件认证与全局参数forward属于gws的 Gmail 辅助命令helper command家族。在使用前请先阅读 gws-shared 了解认证方式、全局参数与安全规则如果本地缺少该 skill 文件可运行gws generate-skills生成。认证支持两种方式# 浏览器 OAuth交互式推荐 gws auth login # 服务账号 export GOOGLE_APPLICATION_CREDENTIALS/path/to/key.jsonforward底层使用gmail.modify这一宽泛 scope见 gmail/mod.rs 中定义的GMAIL_SCOPE一个 token 即可同时覆盖原邮件元数据读取和最终发送/存草稿两个阶段。全局输出格式参数--format json|table|yaml|csv、--dry-run等同样适用于本命令。基本用法gws gmail forward --message-id ID --to EMAILS其中ID是待转发邮件的 Gmail message ID可通过gws gmail triage或gws gmail users.messages list获取EMAILS是收件人地址多个地址用逗号分隔。全部参数一览Flag必填默认值说明--message-id✓—要转发的 Gmail message ID--to✓—收件人邮箱地址逗号分隔至少一个--from——发件人地址用于 send-as/别名省略时使用账号默认地址--body——在转发内容上方附加的备注纯文本搭配--html时为 HTML--no-original-attachments——不包含原邮件的文件附件--html模式下的内联图片仍保留--attach——附加本地文件可多次指定短选项-a--cc——抄送邮箱地址逗号分隔--bcc——密送邮箱地址逗号分隔--html——将--body视为 HTML 内容默认按纯文本处理--dry-run——只展示将要发送的请求不真正执行--draft——保存为草稿而非直接发送从源码看参数解析集中在parse_forward_argsforward.rs--to为空会直接报错--to must specify at least one recipient--cc、--bcc、--from会被解析为逗号分隔的邮箱列表空白值视为未提供。--attach使用ArgAction::Append支持重复指定读取时会校验文件存在、非空且为普通文件。命令示例官方 SKILL 文档给出了 7 个可直接复制的典型场景# 1. 最简转发 gws gmail forward --message-id 18f1a2b3c4d --to daveexample.com # 2. 附加一行备注 gws gmail forward --message-id 18f1a2b3c4d --to daveexample.com --body FYI see below # 3. 带抄送 gws gmail forward --message-id 18f1a2b3c4d --to daveexample.com --cc eveexample.com # 4. HTML 备注 gws gmail forward --message-id 18f1a2b3c4d --to daveexample.com --body pFYI/p --html # 5. 追加本地附件 gws gmail forward --message-id 18f1a2b3c4d --to daveexample.com -a notes.pdf # 6. 不携带原附件 gws gmail forward --message-id 18f1a2b3c4d --to daveexample.com --no-original-attachments # 7. 保存为草稿 gws gmail forward --message-id 18f1a2b3c4d --to daveexample.com --draft在此基础上结合参数表还可以组合出更复杂的场景# 多条收件人 CC BCC 追加多个附件 gws gmail forward --message-id 18f1a2b3c4d --to aexample.com,bexample.com \ --cc cexample.com --bcc dexample.com -a a.pdf -a b.csv # 使用 send-as 别名发件 gws gmail forward --message-id 18f1a2b3c4d --to daveexample.com --from aliasexample.com # 发送前预览请求不产生真实发送 gws gmail forward --message-id 18f1a2b3c4d --to daveexample.com --dry-runzsh 提示如果邮箱或参数值中包含!例如某些查询语法zsh 会将其解释为历史展开建议用双引号包裹参数值参见 gws-shared 的 Shell Tips。底层流程从 message ID 到发出的 RFC 5322 邮件forward的处理入口是handle_forwardforward.rs整个流程可以概括为四步解析参数并判断 dry-run--dry-run时使用OriginalMessage::dry_run_placeholder构造占位原邮件gmail/mod.rs跳过认证与网络请求否则进入真实流程。拉取原邮件调用fetch_message_metadatagmail/mod.rs以formatfull请求GET https://gmail.googleapis.com/gmail/v1/users/me/messages/{id}解析出 From、To、Cc、Subject、Date、Message-ID、References 等头部以及正文与附件元数据。解析发件人resolve_sender会查询users/me/settings/sendAs获取 send-as 身份列表未指定--from时使用默认身份指定了裸邮箱时补充显示名必要时还会降级尝试 People API 补充显示名失败时仅打印提示不会中断转发见 gmail/mod.rs。构造并派发邮件create_forward_raw_message用mail_builder生成完整 MIME 消息最终由dispatch_raw_emailgmail/mod.rs调用 Gmail API 上传接口发送users.messages.send或创建草稿users.drafts.create。其中附件二进制数据通过GET /users/me/messages/{messageId}/attachments/{attachmentId}单独拉取并做 base64url 解码fetch_attachment_data见 gmail/mod.rs。从源码结构看转发与回复reply/reply-all共享了附件抓取fetch_and_merge_original_parts与邮件组装finalize_message等基础设施。转发块与原邮件完全一致的引用格式转发内容始终包含原邮件的发件人、日期、主题与收件人信息。纯文本模式下转发块采用经典的---------- Forwarded message ---------分隔线格式format_forwarded_messageforward.rs当原邮件缺失 Date 或 Cc 时对应行会被省略——这一点由单元测试test_format_forwarded_message_missing_date与test_format_forwarded_message_with_cc明确验证。HTML 模式下format_forwarded_message_htmlforward.rs转发块使用 Gmail 网页版同款结构外层div classgmail_quote gmail_quote_container属性区使用gmail_attr类发件人用strong classgmail_sendername显示名称邮箱包裹在mailto:链接中format_forward_fromgmail/mod.rs所有头部值均经过 HTML 转义邮箱链接做了百分号编码以防止mailto:参数注入format_email_link日期会被重新格式化为 Gmail 风格如Wed, Mar 4, 2026 at 3:01 PM无法解析时回退为转义后的原始值。与回复不同转发块不使用blockquote嵌套HTML 测试也专门断言了这一点test_format_forwarded_message_html_with_html_body。主题与线程头保持会话连续性build_forward_subjectforward.rs会自动给主题加上Fwd:前缀——除非原主题已经以Fwd:大小写不敏感开头避免重复添加。相关行为由test_build_forward_subject_without_prefix、test_build_forward_subject_with_prefix与test_build_forward_subject_case_insensitive三个测试锁定。在线程处理上forward与reply共享同一套ThreadingHeaders机制gmail/mod.rsIn-Reply-To指向原邮件的 message IDReferences由原邮件已有的 References 链加上当前 message ID 拼接而成build_references_chain发送时通过threadId元数据挂回原会话线程dispatch_raw_email中build_send_metadata会为 send 与 draft 两种场景分别构造{threadId: ...}或{message: {threadId: ...}}元数据gmail/mod.rs。test_create_forward_raw_message_references_chain验证了 References 头会包含完整的消息 ID 链而In-Reply-To只包含直接父消息。附件行为默认携带、可裁剪、可追加转发时附件遵循以下规则与 Gmail 网页版行为一致默认携带原附件原邮件的文件附件默认包含在转发中--no-original-attachments剔除文件附件但--html模式下的内联图片仍会保留——因为内联图片属于正文的一部分而不是 UI 意义上的“附件”-a/--attach追加新附件可多次指定MIME 类型根据文件扩展名推断mime_guess2总大小 25MB 上限原附件与用户新增附件的合并大小不得超过 25MB。fetch_original_partsgmail/mod.rs会先基于元数据做一次“大小预检”下载过程中还会按实际字节数二次校验超出即报错。之所以定在 25MB是因为 Gmail API 上传端点限制为 35MB而 25MB 原始附件经 base64 编码后约 33MB见 gmail/mod.rs 的注释说明。部件筛选逻辑集中在include_original_partforward.rs四种组合HTML/纯文本 × 是否剔除原附件的取舍由test_include_original_part_*系列测试逐一覆盖例如“纯文本模式下内联图片被丢弃”“剔除附件时 HTML 内联图片仍保留”。HTML 模式与内联图片使用--html时备注文本与转发块均按 HTML 处理。源码在finalize_messagegmail/mod.rs中构造了正确的 MIME 结构存在内联图片时HTML 正文与内联部件被封装进multipart/related图片通过Content-ID与正文中的cid:引用对应若同时还有普通附件multipart/related再被包进外层multipart/mixedGmail API 会把位于multipart/mixed下的Content-Disposition: inline重写为attachment因此显式的multipart/related结构是内联图片正确渲染的必要条件。test_create_forward_raw_message_html_with_inline_image验证了上述结构test_create_forward_raw_message_plain_text_no_inline_images则验证纯文本模式不携带任何内联图片。在 HTML 模式中写--body时只需使用片段标签p、b、a等无需html/body包裹。安全地试运行与存草稿--dry-run不触发认证与网络请求本地构造请求并展示将要发送的内容是 Agent 或脚本执行前的安全预览手段。dry-run 模式下原附件不会真实下载会打印Note: original attachments not included in dry-run preview且最终派发阶段会自动跳过认证见 gmail/mod.rs。--draft将转发保存为草稿而非立即发送。命令完成后会打印提示告知可用返回的草稿 id 通过gws gmail users.drafts.send --body {id:draft-id}稍后发送gmail/mod.rs。这与 gws-shared 中“对写/删操作先与用户确认、优先使用--dry-run”的安全规则一致。相关命令gws-shared — 认证、全局参数与安全规则gws-gmail — Gmail 全部发送、读取与管理命令含send、reply、reply-all、read、triage、watch【免费下载链接】cliGoogle Workspace CLI — one command-line tool for Drive, Gmail, Calendar, Sheets, Docs, Chat, Admin, and more. Dynamically built from Google Discovery Service. Includes AI agent skills.项目地址: https://gitcode.com/gh_mirrors/cli413/cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考