
gogcligog gmail drafts forward实战指南在终端把邮件保存为转发草稿【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcligog gmail drafts forward是 gogcliGoogle Workspace in your terminal中「草稿drafts」子命令族的一员作用是把 Gmail 中任意一封已存在的邮件转存为转发草稿——即不立即发送而是生成一份带Fwd:主题、Gmail 风格转发分隔线和原附件内容的草稿供你随后用gog gmail drafts send发送或继续编辑。它非常适合需要「先拟稿、后审批、再发送」的自动化工作流以及希望在发送前人工复核转发内容、规避误发的场景。读完本文你将掌握该命令的完整用法、全部参数语义、与直接转发gog gmail forward的差异以及它在源码层面的实现原理。命令概览与别名gog gmail drafts forward的命令骨架如下gog gmail (mail,email) drafts (draft) forward (fwd) messageId [flags]其中gmail、drafts、forward三段均有别名gmail可写为mail或emaildrafts可写为draftforward可写为fwd。因此下面几种写法完全等价gog gmail drafts forward messageId --to aliceexample.com gog gmail draft fwd messageId --to aliceexample.com gog email drafts forward messageId --to aliceexample.com位置参数messageId是被转发的原始 Gmail 消息 ID可在gog gmail messages search或gog gmail thread get的输出中获得。该命令归属于 gog gmail drafts 命令族同族还有create、update、reply、reply-all、send、get、list、delete等子命令在源码中转发草稿命令定义于 internal/cmd/gmail_drafts_compose.go结构体GmailDraftsForwardCmd直接内嵌了与发送侧转发完全共享的GmailForwardOptions// GmailDraftsForwardCmd saves a forward as a draft. Mirrors GmailForwardCmd. type GmailDraftsForwardCmd struct { MessageID string arg: name:messageId help:Gmail message ID to forward Options GmailForwardOptions embed: } func (c *GmailDraftsForwardCmd) Run(ctx context.Context, flags *RootFlags) error { return c.Options.runDraft(ctx, flags, c.MessageID) }这意味着它完整继承了gog gmail forward的每一项能力只是最终落点是「保存草稿」而非「直接发送」。核心参数详解转发内容相关参数Flag类型默认值说明--tostring收件人逗号分隔。发送时必填保存草稿时可选——这是与直接转发最关键的行为差异--ccstring抄送收件人逗号分隔--bccstring密送收件人逗号分隔--fromstring以该邮箱地址发送必须是已验证的 send-as 别名--note--introstring放在被转发邮件上方的引言文字--note-filestring引言文件路径纯文本-表示从标准输入读取--skip-attachmentsbool不包含原始邮件的附件收件人解析--to/--cc/--bcc都走同一套地址感知解析parseComposeRecipients因此显示名中含逗号的收件人如Smith, John johnexample.com会被当作一个收件人而不是被错误拆分。测试 internal/cmd/execute_gmail_forward_test.go 同时覆盖了gmail forward与gmail drafts forward两条路径二者共享GmailForwardOptions下的 To/Cc/Bcc 头正确性。收件人合法性前置校验--to/--cc/--bcc中的非法地址会在发起任何 Gmail API 请求之前就报错错误信息中带有对应 flag 名原始邮件也不会被拉取见 execute_gmail_forward_test.go。引言去重读取--note与--note-file二选一resolveBodyInput保证内容只读取一次当--note-file -从 stdin 读取时若--to缺失发送路径会先快速失败而不会白白消耗 stdin源码见 internal/cmd/gmail_forward.go。输出与安全相关通用参数Flag类型默认值说明--access-tokenstring直接使用给定的访问令牌绕过存储的刷新令牌令牌约 1 小时过期-a--account--acctstring账户邮箱、别名或auto用于认证的 Google API 命令--clientstringOAuth 客户端名称选择存储的凭据与令牌桶--colorstringauto输出着色auto|always|never--disable-commandsstring逗号分隔的禁用命令列表支持点路径-n--dry-run--dryrun--noop--previewbool不做任何更改打印预期动作并以成功退出--enable-commandsstring逗号分隔的启用命令前缀列表支持点路径限制 CLI--enable-commands-exactstring逗号分隔的精确启用命令列表支持点路径父命令不会启用子命令-y--force--assume-yes--yesbool跳过破坏性命令的确认提示--gmail-no-sendboolfalse阻止 Gmail 发送操作Agent 安全开关-h--helpkong.helpFlag显示上下文相关帮助--homestring覆盖 gogcli 的 config/data/state/cache 根目录等价于GOG_HOME-j--json--machineboolfalse向 stdout 输出 JSON最适合脚本化--no-input--non-interactive--noninteractivebool永不提示否则失败适合 CI-p--plain--tsvboolfalse向 stdout 输出稳定可解析文本TSV无颜色--quota-projectstring用于 API 计费的 Google Cloud 项目以X-Goog-User-Project发送某些 API 与--access-token或 ADC 一起使用需要它--readonlyboolfalse在运行时阻止变更类 API 请求auth add也会请求只读 OAuth scope--results-onlyboolJSON 模式下只输出主结果丢弃nextPageToken等信封字段--select--pick--projectstringJSON 模式下选择逗号分隔的字段尽力而为支持点路径-v--verbosebool启用详细日志--versionkong.VersionFlag打印版本并退出--wrap-untrustedboolfalseJSON/raw 输出中将拉取的文本字段包在外部不可信内容标记内与 no-send 的关系重要保存草稿不是发送因此--gmail-no-send与账户级 no-send 配置不会拦截本命令。源码中GmailDraftsForwardCmd走requireGmailService而非发送路径的requireGmailSendService跳过了按账户的 no-send 检查internal/cmd/gmail_drafts_compose.go。这使草稿类命令在 no-send 保护环境下依然可用——你可以在严格禁止发送的 Agent 环境中安全地「拟稿不发出」。典型使用示例1. 基础用法带引言把邮件保存为转发草稿gog gmail drafts forward 18f0a2b3c4d5e6f7 --to aliceexample.com \ --note FYI see below生成的主题自动变为Fwd: 原主题正文中引言位于转发分隔线之上。2. 多收件人 抄送/密送gog gmail drafts forward 18f0a2b3c4d5e6f7 \ --to aliceexample.com, bobexample.com \ --cc carolexample.com \ --bcc auditexample.com3. 引用 stdin 作为引言echo 请审阅后由你发送 | gog gmail drafts fwd 18f0a2b3c4d5e6f7 \ --to aliceexample.com --note-file -4. 不携带原附件gog gmail drafts forward 18f0a2b3c4d5e6f7 --to aliceexample.com --skip-attachments5. 先干跑预览不产生任何 API 请求gog gmail drafts forward 18f0a2b3c4d5e6f7 --to aliceexample.com --dry-run --json干跑会输出将要执行的完整动作字典message_id、解析后的to/cc/bcc、from、note_len、skip_attachments动作名为gmail.drafts.forward且不会发起任何 Gmail API 调用——测试 execute_gmail_forward_test.go 对此有明确断言。6. 不填收件人仅存一份无地址转发草稿gog gmail drafts forward 18f0a2b3c4d5e6f7保存草稿路径以recipientsOptional调用resolveForwardInputs允许像 Gmail 网页版一样暂存一封还没有收件人的转发草稿发送侧则必须--to。对应源码见 internal/cmd/gmail_forward.go 中的recipientRequirement常量与发送/草稿两条路径的不同取值。输出与后续操作命令成功后默认以 TSV 输出草稿结果加--json时输出 JSON 对象outfmt.PrimaryResult包装。两个模式都包含以下字段draftId新草稿的 IDmessageId草稿内嵌消息的 IDthreadId草稿所在线程 IDJSON 模式还会额外输出inReplyTo、references、replyContextSource转发草稿不携带回复上下文这些字段为null。由于转发开启新线程且不写入In-Reply-To/Referencesexecute_gmail_forward_test.go 明确断言转发草稿不携带回复头writeDraftResult会回退使用Drafts.Create响应中 Gmail 分配的 thread idinternal/cmd/gmail_drafts_compose.go。拿到draftId后可以继续# 查看草稿详情 gog gmail drafts get draftId # 编辑草稿如补充正文 gog gmail drafts update draftId --body 新的正文内容 --body-html pHTML 正文/p # 最终发送 gog gmail drafts send draftId发送走requireGmailSendService此时若账户处于 no-send 配置或带了--gmail-no-send草稿发送会被正确拦截——所以「保存草稿 → 人工/流程审批 → 发送」的安全链路是完整闭合的。源码实现转发草稿是怎么构建的转发草稿的构建复用了发送侧转发的全部逻辑核心在 internal/cmd/gmail_forward.go 的buildForwardComposeMessage主要步骤为解析发送身份resolveComposeSender根据--from必须是已验证 send-as 别名或账户默认身份确定发件人。拉取原始邮件以Format(full)获取原始消息提取From/To/Cc/Date/Subject头及纯文本、HTML 正文。生成主题buildForwardSubject自动在主题前加Fwd:并通过stripForwardPrefix避免前缀堆叠Fwd: Fwd: ...会去重为单个Fwd:空主题则使用Fwd: (no subject)。测试 execute_gmail_forward_test.go 覆盖了Fwd:/Fw:/FWD:/Re:等各种前缀组合。重排原始日期原邮件日期会按本机配置时区mailDateLocation重排为 Gmail 风格的Date: Tue, Mar 10, 2026 at 1:00 PM格式。构建转发正文纯文本formatForwardedMessage生成以---------- Forwarded message ---------分隔、包含From/Date/Subject/To/Cc原头的正文引言位于最上方HTML若原邮件含 HTML 正文formatForwardedMessageHTML生成gmail_quote风格的 HTML 引用块引言做 HTML 转义From头会拆分出显示名与地址更友好地呈现。保留附件与内联资源preserveForwardMessageParts会把原邮件的附件以及 HTML 正文依赖的 CID 内联资源一并重新挂载--skip-attachments时跳过普通附件但 CID 内联资源仍会保留以保证 HTML 渲染正确。落点差异发送路径用Messages.Send草稿路径用Drafts.Create最终writeDraftResult输出结果。草稿与直接转发的关键差异对照维度gog gmail forwardgog gmail drafts forward最终动作users.messages.send直接发送users.drafts.create保存草稿--to要求必填recipientsRequired可选recipientsOptional可存无地址草稿服务门控requireGmailSendService受 no-send 拦截requireGmailServiceno-send 不拦截干跑动作名gmail.forwardgmail.drafts.forward输出发送结果messageId/threadId草稿结果draftId/messageId/threadId两者的resolveForwardInputs、buildForwardComposeMessage、dryRunFields完全共享代码注释明确说明这是「draft-saving counterpart」internal/cmd/gmail_drafts_compose.go因此在收件人解析、附件处理、主题与正文格式上行为完全一致——你可以放心地用gog gmail drafts forward先审后发。适用场景与使用建议拟稿审批流在 CI/Agent 任务中先生成转发草稿交由人工用gog gmail drafts listget复核确认无误后gog gmail drafts send避免自动化直接外发。no-send 安全环境Agent 或脚本即便处于--gmail-no-send或账户 no-send 保护下仍可安全地「拟稿不发出」需要发送时再走带发送门控的命令。批量转发前的预检配合--dry-run --json在不发起任何 API 请求的前提下验证收件人解析结果与引言内容特别适合需要精确控制收件人列表的场景。更多草稿操作可参考父命令文档 gog gmail drafts 与命令索引 docs/commands/README.md。【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考