himalaya · git:20260404.579d601 · 2026-04-04 · sha256 0a592f443d660bb6

himalaya git:20260404.579d601A

Immutable. This exact content is served forever at /api/v1/blob/0a592f443d660bb6.

---
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)."
dependencies:
  commands:
    - himalaya
platforms:
  - macos
  - linux
---

# Himalaya Email CLI

Himalaya is a CLI email client that lets you manage emails from the terminal using IMAP, SMTP, Notmuch, or Sendmail backends.

## References

- `references/configuration.md` (config file setup + IMAP/SMTP authentication)

## Prerequisites

1. **Himalaya CLI** - the `himalaya` binary must already be on `PATH`. Check with `himalaya --version`.
   - **Recommended: v1.2.0 or newer.** Older releases can fail against some IMAP servers.
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 default
```

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"
```

If using 163 mail, add `backend.extensions.id.send-after-auth = true`.

## Common Operations

### List Folders

```bash
himalaya folder list
```

### List Emails

```bash
himalaya envelope list                           # INBOX (default)
himalaya envelope list --folder "Sent"           # Specific folder
himalaya envelope list --page 1 --page-size 20   # With pagination
```

### Search Emails

```bash
himalaya envelope list from john@example.com subject meeting
```

### Read an Email

```bash
himalaya message read 42          # Plain text
himalaya message export 42 --full # Raw MIME
```

### Send / Compose Emails

**Recommended:** Use `template write | template send` pipeline:

```bash
export EDITOR=cat
himalaya template write \
  -H "To: recipient@example.com" \
  -H "Subject: Email Subject" \
  "Email body content" | himalaya template send
```

**With CC:**

```bash
export EDITOR=cat
himalaya template write \
  -H "To: recipient@example.com" \
  -H "Cc: cc@example.com" \
  -H "Subject: Email Subject" \
  "Email body content" | himalaya template send
```

**With attachments (Python fallback):**

```python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

msg = MIMEMultipart()
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg['Subject'] = 'Email with attachment'
msg.attach(MIMEText('Email body', 'plain'))

with open('/path/to/file.pdf', 'rb') as f:
    part = MIMEBase('application', 'octet-stream')
    part.set_payload(f.read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename="file.pdf"')
    msg.attach(part)

server = smtplib.SMTP_SSL('smtp.example.com', 465)
server.login('sender@example.com', 'password')
server.send_message(msg)
server.quit()
```

**Known limitations:**
- MML attachment parsing may fail in himalaya v1.1.0 - use Python for attachments
- `message write` hangs in non-interactive mode - use `template write | template send`
- `message send` may fail with header parsing - use `template send`

**Configuration requirement:** Set `message.send.save-to-folder` in config.toml:

```toml
[accounts.default]
message.send.save-to-folder = "Sent"
```

### Move/Copy Emails

```bash
himalaya message move 42 "Archive"
himalaya message copy 42 "Important"
```

### Delete an Email

```bash
himalaya message delete 42
```

### Manage Flags

```bash
himalaya flag add 42 --flag seen
himalaya flag remove 42 --flag seen
```

## Multiple Accounts

```bash
himalaya account list                      # List accounts
himalaya --account work envelope list      # Use specific account
```

## Attachments

```bash
himalaya attachment download 42              # Save attachments
himalaya attachment download 42 --dir ~/dl   # Save to directory
```

## Output Formats

```bash
himalaya envelope list --output json
himalaya envelope list --output plain
```

## Debugging

```bash
RUST_LOG=debug himalaya envelope list
RUST_LOG=trace RUST_BACKTRACE=1 himalaya envelope list
```

## Tips

- Message IDs are relative to the current folder; re-list after folder changes.
- Store passwords securely using `pass`, system keyring, or a command.
- **For automation:** Always use `template write | template send` with `export EDITOR=cat`.
- **163 Mail:** Set `backend.extensions.id.send-after-auth = true` and `message.send.save-to-folder = "Sent"`.
- **Folder names:** Use English folder names for better compatibility.