OpenClaw Himalaya 技能实战:用 MML(MIME Meta Language)通过 CLI 编写、回复与发送富文本邮件
2026/9/7 6:10:40 网站建设 项目流程

OpenClaw Himalaya 技能实战:用 MML(MIME Meta Language)通过 CLI 编写、回复与发送富文本邮件

【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 🦞项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw

本文基于 OpenClaw 仓库中的 Himalaya 邮件技能参考文档 message-composition.md 展开,系统讲解 Himalaya CLI 使用的 MML(MIME Meta Language)邮件编写语法:从基础头字段与纯文本正文,到 multipart 富文本、文件附件、内联图片与混合内容的完整示例,并覆盖message write/reply/forward/template send等 CLI 发送工作流。读完后你可以直接用 Himalaya 通过 IMAP/SMTP 从零编写并发送结构正确的 MIME 邮件,包括带附件和 HTML 内嵌图片的复杂场景。

一、Himalaya 技能在 OpenClaw 中的定位

OpenClaw 通过skills/目录组织各类可被 Agent 调用的 CLI 技能。Himalaya 技能 用于"在 shell 中完成 IMAP/SMTP 邮件操作:列出、读取、搜索、编写、回复、转发、拷贝、移动、删除"。其技能元数据(SKILL.md 的 frontmatter)声明了运行前提与安装方式:

  • 依赖二进制:requires.binshimalaya,即本机必须先安装 Himalaya CLI(技能内置 brew 安装项:formula: himalaya);
  • 技能提供两份参考文档:configuration.md(账户配置、认证、后端设置)与 message-composition.md(MML 编写语法)。SKILL.md 明确建议:"Use MML for attachments and rich messages; readreferences/message-composition.mdfirst."——即凡是要发附件或富文本消息,都应先掌握本文讲解的 MML 语法。

技能给出的初始化流程非常简短:

himalaya --version himalaya account configure

配置文件位于~/.config/himalaya/config.toml,凭据建议使用密码管理器/系统 keyring 托管,不要把密钥粘贴进聊天或日志。发送类命令(write/reply/forward/template send)最终都通过配置中的 SMTP 后端把 MML 编译后的 MIME 消息投递出去,而接收侧则由 IMAP 后端负责——配置细节不在本文展开,可结合 configuration.md 中的最小 IMAP + SMTP 配置示例使用。

二、MML 基础:消息结构、头字段与地址格式

Himalaya 使用 MML 编写邮件。MML 是一种简单的类 XML 语法,会被编译为标准的 MIME 消息。其基本结构是:一段头字段(headers)+ 一个空行 + 正文(body),这一点与手写的原始邮件文本完全一致:

From: sender@example.com To: recipient@example.com Subject: Hello World This is the message body.

常用头字段

头字段作用
From发件人地址
To主要收件人
Cc抄送收件人
Bcc密送收件人
Subject邮件主题
Reply-To回复地址(与 From 不同时使用)
In-Reply-To正在回复的消息 ID

地址书写格式

To/Cc/Bcc等字段的地址支持以下写法,可混用逗号分隔多个地址:

To: user@example.com To: John Doe <john@example.com> To: "John Doe" <john@example.com> To: user1@example.com, user2@example.com, "Jane" <jane@example.com>

要点:显示名可省略;含空格等特殊字符的显示名建议加引号;多地址用逗号分隔。

三、纯文本邮件:最简单的场景

不需要任何 MML 标签的纯文本邮件,正文直接写在空行之后即可:

From: alice@localhost To: bob@localhost Subject: Plain Text Example Hello, this is a plain text email. No special formatting needed. Best, Alice

这是日常通知类邮件的默认形态。当需要 HTML 版本、附件或内联图片时,才引入下文中的<#multipart>/<#part>标签。

四、用 MML 编写富文本邮件

4.1 multipart:纯文本 + HTML 双版本

<#multipart type=alternative>包裹两个"同一内容的不同表示",客户端会选择其中一种呈现(通常是 HTML 版本):

From: alice@localhost To: bob@localhost Subject: Multipart Example <#multipart type=alternative> This is the plain text version. <#part type=text/html> <html><body><h1>This is the HTML version</h1></body></html> <#/multipart>

4.2 附件:单附件、自定义文件名、多附件

在正文后追加<#part filename=...><#/part>即挂一个附件;用name=指定收件人看到的显示文件名:

From: alice@localhost To: bob@localhost Subject: With Attachment Here is the document you requested. <#part filename=/path/to/document.pdf><#/part>

自定义附件显示名:

<#part filename=/path/to/file.pdf name=report.pdf><#/part>

一次挂多个附件,就是连续写多个<#part>

<#part filename=/path/to/doc1.pdf><#/part> <#part filename=/path/to/doc2.pdf><#/part>

4.3 内联图片:type=related + cid 引用

把图片"嵌入"HTML 正文(而非作为附件)需要三步:

  1. <#multipart type=related>声明各部分互相引用;
  2. HTML 部分里用<img src="cid:image1">引用内容 ID;
  3. 图片部分用disposition=inline id=image1 filename=...注册该 cid。

完整示例:

From: alice@localhost To: bob@localhost Subject: Inline Image <#multipart type=related> <#part type=text/html> <html><body> <p>Check out this image:</p> <img src="cid:image1"> </body></html> <#part disposition=inline id=image1 filename=/path/to/image.png><#/part> <#/multipart>

4.4 混合内容:正文 + 多个独立附件

正文与附件彼此独立、都要送达,用type=mixed

From: alice@localhost To: bob@localhost Subject: Mixed Content <#multipart type=mixed> <#part type=text/plain> Please find the attached files. Best, Alice <#part filename=/path/to/file1.pdf><#/part> <#part filename=/path/to/file2.zip><#/part> <#/multipart>

五、MML 标签速查

<#multipart>

把多个 part 分组,type决定 MIME 结构语义:

  • type=alternative:同一内容的不同表示(如纯文本 + HTML),客户端择一展示;
  • type=mixed:彼此独立的部分(正文 + 附件),全部展示;
  • type=related:互相引用的部分(HTML + 内联图片)。

<#part>

定义单个消息部分,支持以下属性:

属性说明
type=<mime-type>内容类型,如text/htmlapplication/pdf
filename=<path>要附加的文件路径
name=<name>附件的显示文件名
disposition=inline以行内方式展示而非附件
id=<cid>供 HTML 中cid:引用的内容 ID

六、CLI 发送工作流:write / reply / forward / template send

交互式撰写

himalaya message write

该命令会打开$EDITOR(编辑器由环境变量指定,见 configuration.md 中export EDITOR="vim"的说明)。编辑器打开的是一个模板:填写头字段与正文(含 MML 标签),保存退出即发送,不保存退出即取消。MML 部分在发送时会被编译为正确的 MIME 结构。

回复(带引用原文)

himalaya message reply 42 himalaya message reply 42 --all # reply-all

编辑器会预填被回复消息的引用内容。回复场景下可结合头字段表中的In-Reply-To保持线程关联。

转发

himalaya message forward 42

从 stdin 发送模板(脚本化发送)

cat message.txt | himalaya template send

把已写好(可含 MML 标签)的邮件文件从标准输入送入,适合在脚本、cron 或 Agent 自动化流程中批量发送,无需打开编辑器。

用 CLI 参数预填头字段

不打开编辑器的场景下,可直接用-H传入Key:Value形式的头字段,正文作为位置参数:

himalaya message write \ -H "To:recipient@example.com" \ -H "Subject:Quick Message" \ "Message body here"

Agent 使用安全约定

Himalaya 技能本身(SKILL.md)还给出三条面向自动化场景的安全约定,编写发送流程时应一并遵守:

  • 发送、删除或批量移动消息前先确认(confirm before sending, deleting, or moving many messages);
  • 多账户环境一律显式使用--account指定账户(如himalaya --account work envelope list);
  • 在摘要中引用消息时精确引用消息 ID,避免歧义。

七、验证与排错:查看原始 MIME

发送效果不符合预期(附件没挂上、内联图片显示为附件等)时,可用文档 Tips 一节给出的方法检查真实 MIME 结构:

himalaya message export --full

--full会导出接收到的邮件的完整原始 MIME(含 multipart 边界、Content-Type、Content-Disposition 等),逐层对照本文第四节的 MML 标签映射关系即可定位问题:

  • 想用cid:引用图片 → 必须type=related且图片部分带id/disposition=inline
  • 想正文与附件并存 → 用type=mixed而不是type=alternative
  • 想纯文本与 HTML 二选一展示 → 用type=alternative

八、小结

Himalaya 的 MML 把"写 MIME"简化为两种原语:<#multipart>决定分组语义(alternative/mixed/related),<#part>决定每个部分的内容类型、文件与展示方式;配合message write/reply/forwardtemplate send四种 CLI 入口,覆盖从交互式撰写到脚本化发送的完整链路。在 OpenClaw 中,这套语法通过 Himalaya 技能 暴露给 Agent 使用,账户与认证配置则交由 configuration.md 描述的~/.config/himalaya/config.toml管理——两者配合,即可让 Agent 在 shell 中安全地完成带附件、带 HTML 内嵌图片的邮件收发。

【免费下载链接】openclawThe AI that really does things. Any OS. Any Platform. The lobster way. 🦞项目地址: https://gitcode.com/GitHub_Trending/cl/openclaw

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询