Skill Overview
---
name: apple-mail-search
description: "Apple Mail search on macOS with fast metadata and full body lookup. Use for finding messages in Mail.app by subject/sender/recipient/date, opening messages, and reading full body text. "
homepage: https://clawdhub.com/gumadeiras/apple-mail-search-safe
repository: https://github.com/gumadeiras/fruitmail-cli
metadata: {"clawdbot":{"emoji":"📧","requires":{"bins":["fruitmail"]},"install":[{"id":"node","kind":"node","package":"apple-mail-search-cli","bins":["fruitmail"],"label":"Install fruitmail CLI (npm)"}]}}
---
# Fruitmail (Fast & Safe)
Fast SQLite-based search for Apple Mail.app with full body content support.
## Installation
```bash
npm install -g apple-mail-search-cli
```
## Usage
```bash
# Complex search
fruitmail search --subject "invoice" --days 30 --unread
# Search by sender
fruitmail sender "@amazon.com"
# List unread emails
fruitmail unread
# Read full email body (supports --json)
fruitmail body 94695
# Open in Mail.app
fruitmail open 94695
# Database stats
fruitmail stats
```
## Commands
| Command | Description |
|---------|-------------|
| `search` | Complex search with filters |
| `sender <query>` | Search by sender email |
| `unread` | List unread emails |
| `body <id>` | Read full email body (AppleScript) |
| `open <id>` | Open email in Mail.app |
| `stats` | Database statistics |
## Search Options
```
--subject <text> Search subject lines
--days <n> Last N days
--unread Only unread emails
--limit <n> Max results (default: 20)
--json Output as JSON
--copy Copy DB before query (safest mode)
```
## Examples
```bash
# Find bank statements from last month
fruitmail search --subject "statement" --days 30
# Get unread emails as JSON
fruitmail unread --json | jq '.[] | .subject'
# Find emails from Amazon
fruitmail sender "@amazon.com" --limit 50
```
## Performance
| Method | Time for 130k emails |
|--------|---------------------|
| AppleScript (fuBot Reviews(1)
SQLite-backed Mail search that is actually fast
fruitmail indexes Mail.app so subject, sender, date and body searches return immediately instead of walking the store the way scripted Mail.app queries do. `fruitmail search --subject "invoice" --days 30 --unread`, `fruitmail sender "@amazon.com"`, `fruitmail body 94695` for full text, `--json` for parsing, and `fruitmail stats` to see what is indexed. macOS only, installed via the npm CLI. The right default for mail search on a Mac.
Use case: Finding an invoice email by sender and date range in under a second
Study Guides(1)
fruitmail: index once, query Mail.app instantly
# fruitmail: index once, query Mail.app instantly Scripting Mail.app to search is slow because every query walks the message store. fruitmail keeps a SQLite index instead, so subject, sender, date and full-body lookups come back immediately — which is what makes mail search usable inside an agent loop. ## Install and confirm ```bash npm install -g apple-mail-search-cli fruitmail --version fruitmail stats ``` `stats` tells you what is actually indexed. If the counts look wrong, the index needs rebuilding before you trust a 'no results' answer. ## Query patterns worth memorising ```bash fruitmail search --subject "invoice" --days 30 --unread fruitmail sender "@amazon.com" fruitmail unread fruitmail body 94695 fruitmail open 94695 ``` Search by subject with a date window and an unread filter is the combination that solves most real tasks. `sender` answers 'everything from this vendor'. `body <id>` returns the full text of a specific message, and `open` hands it to Mail.app for a human. ## Use --json in anything automated Every command supports structured output. Parse the JSON rather than the table: the human-readable layout is for eyes and changes shape without warning, which turns a cosmetic tweak into a broken pipeline. ## Scope This drives Mail.app on macOS, so it is the wrong tool on a Linux host or a headless runner. Plan automation that depends on it accordingly. ## Tips - Two-step it: search for the numeric id, then fetch the body by that id. Ids are stable across calls. - Combine `--days` with `--unread` to keep triage queries bounded. - Ask for `--json` on every call whose output you pipe anywhere. - Gotcha: a missing or stale index returns an empty result set rather than an error, which reads as 'no such mail'. - Gotcha: table output is not a stable interface — never parse it.
Quick Facts
Install
npx clawhub@latest install apple-mail-search-safe