Install
openclaw skills install clawhub-thunderbird-skillRead and search local Mozilla Thunderbird mail storage on disk. Use when working with Thunderbird profiles, extracting emails from local folders or IMAP cache, locating messages by sender/recipient/subject/body, checking which account a mailbox belongs to, or answering inbox questions for a specific Thunderbird account such as "do I have unread mail today?" or "search mail for user@example.com".
openclaw skills install clawhub-thunderbird-skillUse Thunderbird's local profile data as the source of truth for offline mail inspection. Prefer read-only access and search the raw local storage directly rather than relying on UI automation.
Run the bundled script from the skill directory, or use an absolute path resolved from the skill root:
python scripts/search_thunderbird.py ...If the current working directory is not the skill directory, resolve scripts/search_thunderbird.py relative to this SKILL.md location before running it.
python scripts/search_thunderbird.py --list-profilespython scripts/search_thunderbird.py --profile default-release --list-accountspython scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --query invoice --limit 10--subject-only to search only the subject line--body-only to search only the body/preview text--exclude <text> to remove noisy matchespython scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --unread-only --limit 20--show-body--unread-only--subject-only--body-only--exclude wordpress--has-attachment--attachment-name invoice--list-attachments--save-attachments ./out--today--yesterday--since 2026-03-11--until 2026-03-12T08:00:00+01:00--sort-by date|from|subject|to--sort-order asc|desc--jsonUse --list-profiles first if the profile is unknown. The script now checks common Thunderbird profile roots on Windows and Linux automatically. Accept either:
If multiple profiles match, stop and choose explicitly.
For account-specific requests, do not scan every mailbox first.
Use:
--list-accounts to inspect the profile--account <email-or-fragment> to restrict work to one Thunderbird account--folder inbox|sent|archive|drafts|junk|trash|spam to narrow furtherThis is usually both faster and easier than scanning the whole profile.
Use scripts/search_thunderbird.py for most tasks. It scans common Thunderbird storage roots:
Mail/ImapMail/It supports:
Inbox, Sent, Archivescur/ and new/%APPDATA%/Thunderbird/Profiles, ~/.thunderbird, ~/.mozilla/thunderbird)By default, summarize:
Prefer focused summaries for the user. Use --show-body only when the full message text is necessary.
python scripts/search_thunderbird.py --list-profiles
python scripts/search_thunderbird.py --profile default-release --list-accounts
python scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --query contract --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --from billing@example.com --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --subject invoice --json --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --unread-only --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --query invoice --subject-only --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --query password --body-only --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --query update --exclude wordpress --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --has-attachment --list-attachments --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --attachment-name invoice --save-attachments .\out --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --sort-by from --sort-order asc --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --since 2026-01-01 --until 2026-01-02T08:00:00+01:00 --sort-by date --sort-order desc --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --folder inbox --yesterday --sort-by date --sort-order desc --limit 20
python scripts/search_thunderbird.py --profile default-release --account user@example.com --query "reset password" --show-body --limit 5
.msf files as indexes, not message sources..msf both exist.--account before broader searches.--unread-only depends on Thunderbird folder indexes (.msf) for mbox folders; if unread state is unavailable, say so instead of guessing.--since and --until accept YYYY-MM-DD or ISO-8601 timestamps. Bare --since dates are interpreted as UTC midnight, while bare --until dates are interpreted as UTC end-of-day.--today and --yesterday are UTC-based shortcuts and cannot be combined with --since or --until.--subject-only and --body-only only change how --query is matched; do not combine them with each other.--has-attachment filters to messages with attachments; --attachment-name filters by attachment filename.--save-attachments <dir> writes matching attachments to disk and implicitly enables attachment-aware filtering when needed.When the user asks for an attachment, do not save or open it immediately unless they already said what they want done.
Default follow-up:
Should I save it or open it?If the user says save:
--save-attachments <dir>If the user says open:
If the attachment is text-like and the user likely wants contents rather than launching an external app, it is also acceptable to read or summarize it directly after asking.
Read references/storage-layout.md when you need a quick map of Thunderbird's on-disk structure.