Gmail IMAP Skill
All Gmail access uses IMAP. Credentials are read from environment variables — never printed.
Requirements
Set these environment variables before use:
| Variable | Description |
|---|
GMAIL_IMAP_USER | Your Gmail address (e.g. user@gmail.com) |
GMAIL_IMAP_PASSWORD | A Google App Password (not your account password) |
Generate an App Password at: https://myaccount.google.com/apppasswords (requires 2FA enabled)
Quick Reference
# Locate the script (adjust SKILL_DIR to match your install location):
# Default: ~/.openclaw/skills/gmail-imap
# Custom: <workspace>/skills/gmail-imap
SCRIPT="$SKILL_DIR/scripts/gmail_imap.py"
# List inbox (most recent 20)
"$SCRIPT" list
# List with custom limit
"$SCRIPT" list --limit 50
# List unread only (shorthand)
"$SCRIPT" list --unread
# List unread with limit
"$SCRIPT" list --unread --limit 10
# Search by sender (IMAP header search)
"$SCRIPT" list --search 'FROM "boss@example.com"'
# Full-text search (Gmail X-GM-RAW — searches body + headers)
"$SCRIPT" search "invoice"
"$SCRIPT" search "from:boss@example.com is:unread" --limit 5
"$SCRIPT" search "subject:meeting this week"
# Read a message (by UID shown in list output)
"$SCRIPT" read <uid>
# Read from a specific folder
"$SCRIPT" read <uid> --folder "[Gmail]/All Mail"
# Delete (moves to [Gmail]/Trash — correct Gmail deletion)
"$SCRIPT" trash <uid>
# Move to a label/folder
"$SCRIPT" move <uid> "Work"
# Send email
"$SCRIPT" send --to recipient@example.com --subject "Hello" --body "Message text"
Deletion Rule (Critical)
Never use the standard IMAP \Deleted flag on Gmail — it only archives, it does not delete.
Always use trash <uid> which moves to [Gmail]/Trash. The script handles this correctly.
Credentials
Set in env (never output raw password):
GMAIL_IMAP_USER — Gmail address
GMAIL_IMAP_PASSWORD — App password (generate at myaccount.google.com/apppasswords)
Reference
For folder names, search syntax, direct Python IMAP usage, and connection details:
→ See references/gmail-imap-reference.md