Trigger whenever the user wants to do anything with a real email account: check inbox, read messages, reply, forward, compose, send, search, archive, delete. Typical phrasing: "check my inbox", "what did X send me", "查下我邮箱". **Do not use for**: instant messaging / IM / WeChat / Slack, translating text that merely contains the word "email", or offline parsing of `.eml` files (→ just use Read).
77
96%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
| Tool | Responsibility | Read-only |
|---|---|---|
EmailQuery | Query email accounts / messages / stats / search (mode: list-accounts / list-unified / list-messages / get-message / search / unread-stats / list-mailboxes) | Yes |
EmailMutate | Send / reply / forward / archive / delete / move messages (send / delete / move require approval) | No |
Loading: Both are deferred tools. Before calling either, activate its schema with
ToolSearch(names: "EmailQuery,EmailMutate").
Pick based on your goal — don't guess blindly:
Want to know how many unread? → unread-stats
Want a unified inbox view? → list-unified (scope: all-inboxes)
Want sent / drafts / flagged? → list-unified (scope: sent/drafts/flagged)
Want to browse a specific folder? → list-messages (needs accountEmail + mailbox)
Want to search by keyword/sender? → search (query accepts natural language)
Want to read a message in full? → get-message (needs messageId)
Don't know which accounts are set up? → list-accounts (always call this first to get accountEmail)
Need to know what folders exist? → list-mailboxesAll list modes support cursor + pageSize (1-50) pagination.
1. list-accounts → obtain the available accountEmail
2. list-unified (all-inboxes) → scan inbox overview
3. get-message (messageId) → read the full content of the message you need to reply to
4. Draft the reply
5. ⚠️ Show the draft (recipient / subject / body) in plain text and explicitly ask "send?" — wait for the user to confirm
6. send (with inReplyTo + references) → only send after the user confirmsWhy is step 5 mandatory? Because once an email is sent, it can't be recalled. Wrong recipient or wrong content can lead to irreversible embarrassment or even business damage. Always let the user verify recipient, subject, and body with their own eyes before sending.
Why must step 6 carry inReplyTo? Because without it, the reply shows up as a standalone new message in the recipient's inbox, detached from the original thread. All major mail clients (Gmail, Outlook, Apple Mail) rely on the Message-ID header to thread conversations. Set inReplyTo to the original message's messageId, and set references to the original's references chain plus the original messageId.
1. list-accounts → confirm which account to send from
2. Draft the email based on user intent
3. ⚠️ Show the complete email (recipient / subject / body) in plain text and explicitly ask "send?" — wait for the user to confirm
4. send → send after confirmation1. search (query: "newsletter") → find all matching messages
2. Report a summary of the results to the user
3. batch-move / batch-delete → perform bulk operations per user instructionHandling large result sets: Searches can return many results. Follow these principles:
pageSize: 20, then report the total count and a sample to the user1. unread-stats → quickly see unread counts per account
2. list-unified (all-inboxes, pageSize: 20) → fetch the latest message list
3. get-message on each important message → read the details
4. Produce a structured digest (grouped by urgency / sender)There is no standalone forward action — forwarding is implemented via send:
get-message to retrieve the full original contentto to the forwarding target, prefix subject with Fwd:, and include the original content in bodyText (add an "---------- Forwarded message ----------" separator along with the original sender / date / subject)sendThe current version does not support sending or downloading email attachments. If the user asks:
The bodyText parameter of the send action is plain text only — HTML is not supported. If the user asks for rich formatting (bold, images, tables, etc.), tell them only plain text is supported and recommend composing complex formatting in an email client.
inReplyTo: The thread breaks, and the recipient sees an orphan new message.accountEmail: Many actions require accountEmail. When unsure, call list-accounts first.Re: prefix on replies: Keep the subject as Re: <original subject> to preserve threading.Fwd: prefix on forwards: Keep the subject as Fwd: <original subject>.EmailQuery 7 modes: list-accounts · list-mailboxes · list-messages · list-unified · get-message · search · unread-stats
EmailMutate 8 actions: send · mark-read · flag · delete · move · batch-mark-read · batch-delete · batch-move
Send parameters (send): requires accountEmail, to, subject, bodyText; replies additionally require inReplyTo and references. See the tool schema for full parameter details.
a1ab5be
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.