# Gmail Imap

> Read, search, send, trash, move, and label Gmail via IMAP. Requires GMAIL_IMAP_USER (Gmail address) and GMAIL_IMAP_PASSWORD (Google App Password) environment variables — no API key needed. Use when an agent needs Gmail access: reading inbox, searching messages, sending email, or deleting messages.

- Skill: `lord1egypt/gmail-imap` (Agent Skill)
- Install (CLI): `npx skillmds@latest add lord1egypt/gmail-imap`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lord1egypt/gmail-imap/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: Lord1Egypt (https://skillmd.com/u/lord1egypt)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/lord1egypt/gmail-imap

---


# 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

```bash
# 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](references/gmail-imap-reference.md)

