Files
openclaw/skills/himalaya/references/message-composition.md
T
cpojer 76b5208b11
Docker Release / build-amd64 (push) Failing after 36s
Workflow Sanity / no-tabs (push) Failing after 31s
CI / install-check (push) Has been cancelled
CI / checks (bunx tsc -p tsconfig.json --noEmit false, bun, build) (push) Has been cancelled
CI / checks (pnpm build, node, build) (push) Has been cancelled
CI / checks (pnpm canvas:a2ui:bundle && bunx vitest run, bun, test) (push) Has been cancelled
CI / checks (pnpm canvas:a2ui:bundle && pnpm test, node, test) (push) Has been cancelled
CI / checks (pnpm format, node, format) (push) Has been cancelled
CI / checks (pnpm lint, node, lint) (push) Has been cancelled
CI / checks (pnpm protocol:check, node, protocol) (push) Has been cancelled
CI / checks (pnpm tsgo, node, tsgo) (push) Has been cancelled
CI / secrets (push) Has been cancelled
CI / checks-windows (pnpm build, node, build) (push) Has been cancelled
CI / checks-windows (pnpm canvas:a2ui:bundle && pnpm test, node, test) (push) Has been cancelled
CI / checks-windows (pnpm lint, node, lint) (push) Has been cancelled
CI / checks-windows (pnpm protocol:check, node, protocol) (push) Has been cancelled
CI / checks-macos (pnpm test, test) (push) Has been cancelled
CI / macos-app (set -euo pipefail for attempt in 1 2 3; do if swift build --package-path apps/macos --configuration release; then exit 0 fi echo "swift build failed (attempt $attempt/3). Retrying…" sleep $((attempt * 20)) done exit 1 , build) (push) Has been cancelled
CI / macos-app (set -euo pipefail for attempt in 1 2 3; do if swift test --package-path apps/macos --parallel --enable-code-coverage --show-codecov-path; then exit 0 fi echo "swift test failed (attempt $attempt/3). Retrying…" sleep $((attempt *… (push) Has been cancelled
CI / macos-app (swiftlint --config .swiftlint.yml swiftformat --lint apps/macos/Sources --config .swiftformat , lint) (push) Has been cancelled
CI / ios (push) Has been cancelled
CI / android (./gradlew --no-daemon :app:assembleDebug, build) (push) Has been cancelled
CI / android (./gradlew --no-daemon :app:testDebugUnitTest, test) (push) Has been cancelled
Docker Release / build-arm64 (push) Has been cancelled
Docker Release / create-manifest (push) Has been cancelled
chore: Also format scripts and skills.
2026-01-31 21:21:25 +09:00

3.7 KiB

Message Composition with MML (MIME Meta Language)

Himalaya uses MML for composing emails. MML is a simple XML-based syntax that compiles to MIME messages.

Basic Message Structure

An email message is a list of headers followed by a body, separated by a blank line:

From: sender@example.com
To: recipient@example.com
Subject: Hello World

This is the message body.

Headers

Common headers:

  • From: Sender address
  • To: Primary recipient(s)
  • Cc: Carbon copy recipients
  • Bcc: Blind carbon copy recipients
  • Subject: Message subject
  • Reply-To: Address for replies (if different from From)
  • In-Reply-To: Message ID being replied to

Address Formats

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>

Plain Text Body

Simple plain text email:

From: alice@localhost
To: bob@localhost
Subject: Plain Text Example

Hello, this is a plain text email.
No special formatting needed.

Best,
Alice

MML for Rich Emails

Multipart Messages

Alternative text/html parts:

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>

Attachments

Attach a file:

From: alice@localhost
To: bob@localhost
Subject: With Attachment

Here is the document you requested.

<#part filename=/path/to/document.pdf><#/part>

Attachment with custom name:

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

Multiple attachments:

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

Inline Images

Embed an image inline:

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>

Mixed Content (Text + Attachments)

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 Tag Reference

<#multipart>

Groups multiple parts together.

  • type=alternative: Different representations of same content
  • type=mixed: Independent parts (text + attachments)
  • type=related: Parts that reference each other (HTML + images)

<#part>

Defines a message part.

  • type=<mime-type>: Content type (e.g., text/html, application/pdf)
  • filename=<path>: File to attach
  • name=<name>: Display name for attachment
  • disposition=inline: Display inline instead of as attachment
  • id=<cid>: Content ID for referencing in HTML

Composing from CLI

Interactive compose

Opens your $EDITOR:

himalaya message write

Reply (opens editor with quoted message)

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

Forward

himalaya message forward 42

Send from stdin

cat message.txt | himalaya template send

Prefill headers from CLI

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

Tips

  • The editor opens with a template; fill in headers and body.
  • Save and exit the editor to send; exit without saving to cancel.
  • MML parts are compiled to proper MIME when sending.
  • Use himalaya message export --full to inspect the raw MIME structure of received emails.