himalaya-email-manager
Email management using Himalaya CLI tool (IMAP). Search, summarize, and delete emails from an IMAP account. Supports natural language queries for email operations.
When & Why to Use This Skill
The Himalaya Email Manager is a robust Claude skill designed for efficient IMAP email management via the Himalaya CLI. It empowers users to search, summarize, archive, and delete emails using natural language commands. By bridging the gap between terminal-based email tools and AI, it streamlines inbox workflows, supports multi-format saving (Markdown, Text, JSON), and ensures secure operations with safety previews for deletions.
Use Cases
- Automated Daily Briefing: Generate a categorized summary of all emails received in the last 24 hours from both INBOX and Sent folders to quickly prioritize tasks.
- Advanced Inbox Search: Use natural language to locate specific communications, such as 'Find all invoices from last month' or 'Search for newsletters containing unsubscribe'.
- Email Archiving and Documentation: Save important email threads as Markdown files with a date-prefix and download attachments directly to a local directory for project documentation.
- Secure Inbox Maintenance: Perform safe cleanup by previewing search results and confirming deletions of unwanted emails or old notifications using the dry-run safety feature.
- Developer Workflow Integration: Access and manage technical communications or system alerts directly within the coding environment without switching to a heavy GUI email client.
| name | himalaya-email-manager |
|---|---|
| description | Email management using Himalaya CLI tool (IMAP). Search, summarize, and delete emails from an IMAP account. Supports natural language queries for email operations. |
Himalaya Email Manager
Manage emails using Himalaya IMAP CLI tool. Search, summarize, and delete emails from an IMAP account. Use natural language queries for email operations.
Configuration
Himalaya config: ~/.config/himalaya/config.toml
Invocation: uv run scripts/<script>.py (handles Python environment and dependencies)
Get Daily Email Summary
Show emails from the past 24 hours in INBOX and Sent folders:
uv run scripts/email-summary.py
Options:
-v, --verbose- Show himalaya commands being executed
Output includes:
- Rich table format with timestamps, senders, and subjects
- Categorized by folder (📥 INBOX, 📤 Sent)
- Unicode support (Finnish characters, emojis)
Search Emails
Find emails by sender, subject, date range, or folder:
uv run scripts/email-search.py [options]
Options:
--folder FOLDER- Folder to search (default: INBOX)--from SENDER- Filter by sender email/name (case-insensitive)--subject TEXT- Filter by subject text (case-insensitive)--date-start DATE- Start date (YYYY-MM-DD)--date-end DATE- End date (YYYY-MM-DD)--limit N- Maximum results (default: 20, capped at 100)--no-limit- Bypass the 100-result limit cap-v, --verbose- Show himalaya commands being executed--help- Show help message
All filters apply with AND logic. Results include message IDs for deletion. Dates must be in YYYY-MM-DD format. FROM filter matches both sender name and email address.
Examples:
# Search by sender
uv run scripts/email-search.py --from "spotify.com"
# Search by subject
uv run scripts/email-search.py --subject "invoice"
# Search by date range
uv run scripts/email-search.py --date-start "2025-12-17" --date-end "2025-12-31"
# Search in Sent folder
uv run scripts/email-search.py --folder Sent --limit 10
# Multiple filters
uv run scripts/email-search.py --from "@newsletter.com" --subject "unsubscribe" --limit 5
# Search with no limit
uv run scripts/email-search.py --limit 200 --no-limit
Save Emails to File
Save email content to a file in various formats:
uv run scripts/email_save.py <message-id> [options]
Options:
--folder FOLDER- Folder to search (default: INBOX)--output PATH- Output directory or file path (default: current directory)--format FORMAT- Output format: markdown, text, or json (default: markdown)--date-prefix- Add YYYY-MM-DD date prefix to filename (uses email date)--download-attachments- Download email attachments--attachment-dir PATH- Directory for attachments (default: current directory, same as email save location)--overwrite- Overwrite existing file without confirmation-v, --verbose- Show himalaya commands being executed--help- Show help message
Arguments:
message-id- Message ID to save (obtained from search results)
Output formats:
- markdown: Rich format with headers and metadata
- text: Plain text with basic headers
- json: Raw JSON output from himalaya (envelope + body data)
Filename behavior:
- Default:
{message-id}.{ext} - With
--date-prefix:{YYYY-MM-DD}-{subject-sanitized}.{ext} - Subject characters: Spaces and emojis preserved, slashes converted to dashes
Examples:
# Save as markdown to current directory
uv run scripts/email_save.py 56873
# Save to specific directory
uv run scripts/email_save.py 56873 --output ~/saved-emails
# Save with date prefix
uv run scripts/email_save.py 56873 --date-prefix --output /tmp/emails
# Save as text format
uv run scripts/email_save.py 56873 --format text
# Save as JSON
uv run scripts/email_save.py 56873 --format json
# Save to specific file path
uv run scripts/email_save.py 56873 --output ~/important-email.md
# Overwrite existing file without prompt
uv run scripts/email_save.py 56873 --overwrite --output ~/email.md
# Save from Sent folder
uv run scripts/email_save.py --folder Sent 12345 --output ~/sent-emails
# Save with attachments
uv run scripts/email_save.py 56873 --download-attachments
# Save with attachments to custom directory
uv run scripts/email_save.py 56873 --download-attachments --attachment-dir ~/attachments
Delete Emails
Delete emails by message ID with safety preview:
uv run scripts/email-delete.py <message-id> [options]
Options:
--folder FOLDER- Folder to delete from (default: INBOX)--execute- Actually perform deletion (default: dry-run mode)-v, --verbose- Show himalaya commands being executed--help- Show help message
Arguments:
message-id- Message ID to delete (obtained from search results)
Safety: Always run in dry-run mode first to verify the correct message.
In interactive mode, you'll be prompted for confirmation before deletion.
When called by OpenCode agent, deletion proceeds immediately with --execute flag.
Examples:
# Preview deletion
uv run scripts/email-delete.py 56838
# Actually delete (interactive - will prompt for confirmation)
uv run scripts/email-delete.py 56838 --execute
# Delete from specific folder
uv run scripts/email-delete.py --folder Sent 12345 --execute
Translate Natural Language Queries
Interpret natural language queries as appropriate script calls:
Summary queries:
- "Show me today's emails" → email-summary.py
- "What emails did I get today?" → email-summary.py
- "Summary of recent emails" → email-summary.py
Search queries:
- "Find emails from Spotify" → email-search.py --from "spotify.com"
- "Show me emails about invoices" → email-search.py --subject "invoice"
- "Search for Atomikettu emails from the past two weeks" → email-search.py --from "atomikettu" --date-start "2025-12-17" --date-end "2025-12-31"
- "What did I send yesterday?" → email-search.py --folder Sent --date-start "2025-12-30" --date-end "2025-12-30"
- "Search INBOX for emails from john@example.com" → email-search.py --from "john@example.com"
- "Find emails with 'newsletter' in subject" → email-search.py --subject "newsletter"
Save queries:
- "Save email ID 56873" → email_save.py 56873
- "Save as JSON" → email_save.py 56873 --format json
- "Save to ~/emails folder with date prefix" → email_save.py 56873 --output ~/emails --date-prefix
Delete queries:
- "Delete email ID 56838" → email-delete.py 56838 (show preview, ask for confirmation)
- "Remove the email from Spotify" → First search to find ID, then delete with confirmation
Implementation Notes
When calling scripts:
- Always invoke with
uv run scripts/<script-name>.py(handles environment and deps) - For search by sender or subject, use --from and --subject flags
- Date range uses --date-start and --date-end (YYYY-MM-DD format)
- Case-insensitive search is automatic - don't worry about capitalization
- FROM filter searches both sender name and email address
- Always run delete operations in dry-run mode first without --execute flag
- Ask user for confirmation before running delete with --execute flag (interactive mode only)
- Use -v/--verbose to see himalaya commands being executed (for debugging)
Avoid these pitfalls:
- Don't use --since or --until (not implemented - use --date-start/--date-end)
- Don't try to search body content (only headers are available in JSON output)
- Don't forget to add --execute flag when actually deleting (dry-run by default)
- Don't use incorrect date format (must be YYYY-MM-DD)
Follow this workflow for search and delete:
- Use email-search.py to find messages
- Review results with user
- Use email-delete.py
to preview deletion - Get user confirmation
- Use email-delete.py
--execute to actually delete
Technical context:
- Backend: Himalaya v1.1.0 (Rust-based IMAP CLI tool) via Python 3.13 with typer and rich
- Installation: Himalaya must be installed on your system
- Output format: JSON → Rich tables with Python json.loads()
- Authentication: Keyring-based (managed by Himalaya)
- Protocol: IMAP over TLS (direct server communication)
- Date format: YYYY-MM-DD (ISO 8601)
- Case sensitivity: All search filters are case-insensitive using Python .lower()
- Agent detection: Uses sys.stdin.isatty() to determine if running interactively
Using the Scripts
All scripts use PEP 723 inline metadata and require Python 3.13+.
Invoke with uv run to automatically handle Python environment and dependencies:
uv run scripts/<script-name>.py [options]
Dependencies (auto-managed by uv):
- typer - for CLI argument parsing
- rich - for beautiful terminal output