Refactors the contacts system from being embedded in cal_tool.py into a standalone contacts skill that serves as the single source of truth for recipient validation across all outbound email paths. - New skills/contacts/ skill: list, add, delete, resolve commands - New skills/himalaya/scripts/himalaya.sh wrapper: validates To/Cc/Bcc recipients against contacts for message send, template send, and message write commands; passes everything else through unchanged - cal_tool.py now delegates to contacts.py resolve instead of inline logic - TOOLS.md updated: agent should use himalaya wrapper, not raw himalaya
242 lines
5.3 KiB
Markdown
242 lines
5.3 KiB
Markdown
---
|
|
name: himalaya
|
|
description: "CLI to manage emails via IMAP/SMTP. Use `himalaya` to list, read, write, reply, forward, search, and organize emails from the terminal. Supports multiple accounts and message composition with MML (MIME Meta Language)."
|
|
homepage: https://github.com/pimalaya/himalaya
|
|
metadata: {"clawdbot":{"emoji":"📧","requires":{"bins":["himalaya"]},"install":[{"id":"brew","kind":"brew","formula":"himalaya","bins":["himalaya"],"label":"Install Himalaya (brew)"}]}}
|
|
---
|
|
|
|
# Himalaya Email CLI
|
|
|
|
Himalaya is a CLI email client that lets you manage emails from the terminal using IMAP, SMTP, Notmuch, or Sendmail backends.
|
|
|
|
## Recipient-Safe Wrapper
|
|
|
|
Use the wrapper script (`scripts/himalaya.sh`) instead of calling `himalaya` directly. It validates outbound email recipients against the contacts list (see `skills/contacts/`) before sending.
|
|
|
|
**Gated commands** (recipients validated before sending):
|
|
- `message send` — parses To/Cc/Bcc from MIME headers on stdin
|
|
- `template send` — parses To/Cc/Bcc from MML headers on stdin
|
|
- `message write` — parses `-H` header flags for To/Cc/Bcc
|
|
|
|
**Pass-through commands** (no validation needed):
|
|
- Everything else: `envelope list`, `message read`, `message delete`, `folder`, `flag`, `attachment`, `account`, etc.
|
|
|
|
```bash
|
|
HIMALAYA=~/.openclaw/workspace/skills/himalaya/scripts/himalaya.sh
|
|
|
|
# All commands work the same as `himalaya`
|
|
$HIMALAYA envelope list
|
|
$HIMALAYA message read 42
|
|
|
|
# Sending commands validate recipients first
|
|
cat message.txt | $HIMALAYA template send # validates To/Cc/Bcc
|
|
$HIMALAYA message write -H "To:小橘子:work" -H "Subject:Test" "body"
|
|
```
|
|
|
|
## References
|
|
|
|
- `references/configuration.md` (config file setup + IMAP/SMTP authentication)
|
|
- `references/message-composition.md` (MML syntax for composing emails)
|
|
|
|
## Prerequisites
|
|
|
|
1. Himalaya CLI installed (`himalaya --version` to verify)
|
|
2. A configuration file at `~/.config/himalaya/config.toml`
|
|
3. IMAP/SMTP credentials configured (password stored securely)
|
|
|
|
## Configuration Setup
|
|
|
|
Run the interactive wizard to set up an account:
|
|
```bash
|
|
himalaya account configure
|
|
```
|
|
|
|
Or create `~/.config/himalaya/config.toml` manually:
|
|
```toml
|
|
[accounts.personal]
|
|
email = "you@example.com"
|
|
display-name = "Your Name"
|
|
default = true
|
|
|
|
backend.type = "imap"
|
|
backend.host = "imap.example.com"
|
|
backend.port = 993
|
|
backend.encryption.type = "tls"
|
|
backend.login = "you@example.com"
|
|
backend.auth.type = "password"
|
|
backend.auth.cmd = "pass show email/imap" # or use keyring
|
|
|
|
message.send.backend.type = "smtp"
|
|
message.send.backend.host = "smtp.example.com"
|
|
message.send.backend.port = 587
|
|
message.send.backend.encryption.type = "start-tls"
|
|
message.send.backend.login = "you@example.com"
|
|
message.send.backend.auth.type = "password"
|
|
message.send.backend.auth.cmd = "pass show email/smtp"
|
|
```
|
|
|
|
## Common Operations
|
|
|
|
### List Folders
|
|
|
|
```bash
|
|
himalaya folder list
|
|
```
|
|
|
|
### List Emails
|
|
|
|
List emails in INBOX (default):
|
|
```bash
|
|
himalaya envelope list
|
|
```
|
|
|
|
List emails in a specific folder:
|
|
```bash
|
|
himalaya envelope list --folder "Sent"
|
|
```
|
|
|
|
List with pagination:
|
|
```bash
|
|
himalaya envelope list --page 1 --page-size 20
|
|
```
|
|
|
|
### Search Emails
|
|
|
|
```bash
|
|
himalaya envelope list from john@example.com subject meeting
|
|
```
|
|
|
|
### Read an Email
|
|
|
|
Read email by ID (shows plain text):
|
|
```bash
|
|
himalaya message read 42
|
|
```
|
|
|
|
Export raw MIME:
|
|
```bash
|
|
himalaya message export 42 --full
|
|
```
|
|
|
|
### Reply to an Email
|
|
|
|
Interactive reply (opens $EDITOR):
|
|
```bash
|
|
himalaya message reply 42
|
|
```
|
|
|
|
Reply-all:
|
|
```bash
|
|
himalaya message reply 42 --all
|
|
```
|
|
|
|
### Forward an Email
|
|
|
|
```bash
|
|
himalaya message forward 42
|
|
```
|
|
|
|
### Write a New Email
|
|
|
|
Interactive compose (opens $EDITOR):
|
|
```bash
|
|
himalaya message write
|
|
```
|
|
|
|
Send directly using template:
|
|
```bash
|
|
cat << 'EOF' | himalaya template send
|
|
From: you@example.com
|
|
To: recipient@example.com
|
|
Subject: Test Message
|
|
|
|
Hello from Himalaya!
|
|
EOF
|
|
```
|
|
|
|
Or with headers flag:
|
|
```bash
|
|
himalaya message write -H "To:recipient@example.com" -H "Subject:Test" "Message body here"
|
|
```
|
|
|
|
### Move/Copy Emails
|
|
|
|
Move to folder:
|
|
```bash
|
|
himalaya message move 42 "Archive"
|
|
```
|
|
|
|
Copy to folder:
|
|
```bash
|
|
himalaya message copy 42 "Important"
|
|
```
|
|
|
|
### Delete an Email
|
|
|
|
```bash
|
|
himalaya message delete 42
|
|
```
|
|
|
|
### Manage Flags
|
|
|
|
Add flag:
|
|
```bash
|
|
himalaya flag add 42 --flag seen
|
|
```
|
|
|
|
Remove flag:
|
|
```bash
|
|
himalaya flag remove 42 --flag seen
|
|
```
|
|
|
|
## Multiple Accounts
|
|
|
|
List accounts:
|
|
```bash
|
|
himalaya account list
|
|
```
|
|
|
|
Use a specific account:
|
|
```bash
|
|
himalaya --account work envelope list
|
|
```
|
|
|
|
## Attachments
|
|
|
|
Save attachments from a message:
|
|
```bash
|
|
himalaya attachment download 42
|
|
```
|
|
|
|
Save to specific directory:
|
|
```bash
|
|
himalaya attachment download 42 --dir ~/Downloads
|
|
```
|
|
|
|
## Output Formats
|
|
|
|
Most commands support `--output` for structured output:
|
|
```bash
|
|
himalaya envelope list --output json
|
|
himalaya envelope list --output plain
|
|
```
|
|
|
|
## Debugging
|
|
|
|
Enable debug logging:
|
|
```bash
|
|
RUST_LOG=debug himalaya envelope list
|
|
```
|
|
|
|
Full trace with backtrace:
|
|
```bash
|
|
RUST_LOG=trace RUST_BACKTRACE=1 himalaya envelope list
|
|
```
|
|
|
|
## Tips
|
|
|
|
- Use `himalaya --help` or `himalaya <command> --help` for detailed usage.
|
|
- Message IDs are relative to the current folder; re-list after folder changes.
|
|
- For composing rich emails with attachments, use MML syntax (see `references/message-composition.md`).
|
|
- Store passwords securely using `pass`, system keyring, or a command that outputs the password.
|