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.bins为himalaya,即本机必须先安装 Himalaya CLI(技能内置 brew 安装项:formula: himalaya); - 技能提供两份参考文档:configuration.md(账户配置、认证、后端设置)与 message-composition.md(MML 编写语法)。SKILL.md 明确建议:"Use MML for attachments and rich messages; read
references/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 正文(而非作为附件)需要三步:
- 用
<#multipart type=related>声明各部分互相引用; - HTML 部分里用
<img src="cid:image1">引用内容 ID; - 图片部分用
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/html、application/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/forward和template 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),仅供参考