Read Email
read_emailUse this when the user wants the full content of an email that lives in the Mac's Apple Mail (message ID from list_emails/search_emails). For a Microsoft 365 message ID from m365_list_emails, use m365_read_email. Pass account= (and mailbox= if known, both from list_emails/search_emails) so the lookup targets one account instead of scanning all of them. Call sequentially, not in parallel — concurrent calls serialize behind Mail.app's JXA lock and later calls will time out.
Performance: body fetch is the primary latency source (avg 20s on slow IMAP). Pass include_body=false to skip it and get metadata-only (fast). Pass max_body_chars=N to cap the body at N chars after HTML stripping (default 30000; 0=unlimited). Response includes body_fetch_ms when fetch took >2s, body_omitted=true when skipped, body_truncated_at=N when cut.
When a body isn't cached on this Mac, read_email returns metadata with body_omitted=true and body_omit_reason="not_downloaded" (iCloud/IMAP optimized storage) rather than making Mail fetch it (that can be slow and tie Mail up). If the user wants it anyway, retry with force_download=true to have Mail pull the body over IMAP now and return it (waits up to ~60s). Off by default; ignored while Mail is in a cooldown.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | ||
| mailbox | No | ||
| message_id | Yes | ||
| include_body | No | true | |
| force_download | No | false | |
| max_body_chars | No | 30000 |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| id | No | ||
| to | No | ||
| body | No | ||
| date | No | ||
| from | No | ||
| unread | No | ||
| account | No | ||
| mailbox | No | ||
| subject | No | ||
| body_omitted | No | ||
| body_fetch_ms | No | ||
| body_truncated_at | No |