Gmail
gog is a command-line interface (CLI) for interacting with Google services like Gmail, Calendar, Drive, and more. This skill guide shows how to use gog to interact with gmail.
Prerequisites
Before using gmail commands, ensure the account is configured and authenticated.
Check auth status
gog auth list --check # Verify tokens are usable gog auth status # Show current auth state/services
Environment setup
Source the config file before running commands:
source /home/slzatz/claude-sessions/.claude/gmail.env
This sets GOG_ACCOUNT to the configured email address.
Non-interactive mode
For agent/automated use, add --no-input to fail instead of prompting:
gog --no-input gmail search 'newer_than:7d'
Config location
- •Linux:
~/.config/gogcli/config.json
Troubleshooting auth
If commands fail with auth errors:
- •Run
gog auth list --checkto verify token validity - •If token is revoked/expired, re-authorize:
gog auth add <email> --force-consent - •If using file-based keyring (no GNOME Keyring), ensure
GOG_KEYRING_PASSWORDis set
Gmail Commands
# Search and read gog gmail search 'newer_than:7d' --max 10 gog gmail thread get <threadId> gog gmail thread get <threadId> --download # Download attachments to current dir gog gmail thread get <threadId> --download --out-dir ./attachments gog gmail get <messageId> gog gmail get <messageId> --format metadata gog gmail attachment <messageId> <attachmentId> gog gmail attachment <messageId> <attachmentId> --out ./attachment.bin gog gmail url <threadId> # Print Gmail web URL gog gmail thread modify <threadId> --add STARRED --remove INBOX # Send and compose gog gmail send --to a@b.com --subject "Hi" --body "Plain fallback" gog gmail send --to a@b.com --subject "Hi" --body-file ./message.txt gog gmail send --to a@b.com --subject "Hi" --body-file - # Read body from stdin gog gmail send --to a@b.com --subject "Hi" --body "Plain fallback" --body-html "<p>Hello</p>" gog gmail drafts list gog gmail drafts create --subject "Draft" --body "Body" gog gmail drafts create --to a@b.com --subject "Draft" --body "Body" gog gmail drafts update <draftId> --subject "Draft" --body "Body" gog gmail drafts update <draftId> --to a@b.com --subject "Draft" --body "Body" gog gmail drafts send <draftId> # Labels gog gmail labels list gog gmail labels get INBOX --json # Includes message counts gog gmail labels create "My Label" gog gmail labels modify <threadId> --add STARRED --remove INBOX # Batch operations gog gmail batch delete <messageId> <messageId> gog gmail batch modify <messageId> <messageId> --add STARRED --remove INBOX # Filters gog gmail filters list gog gmail filters create --from 'noreply@example.com' --add-label 'Notifications' gog gmail filters delete <filterId> # Settings gog gmail autoforward get gog gmail autoforward enable --email forward@example.com gog gmail autoforward disable gog gmail forwarding list gog gmail forwarding add --email forward@example.com gog gmail sendas list gog gmail sendas create --email alias@example.com gog gmail vacation get gog gmail vacation enable --subject "Out of office" --message "..." gog gmail vacation disable # Delegation (G Suite/Workspace) gog gmail delegates list gog gmail delegates add --email delegate@example.com gog gmail delegates remove --email delegate@example.com # Watch (Pub/Sub push) gog gmail watch start --topic projects/<p>/topics/<t> --label INBOX gog gmail watch serve --bind 127.0.0.1 --token <shared> --hook-url http://127.0.0.1:18789/hooks/agent gog gmail watch serve --bind 0.0.0.0 --verify-oidc --oidc-email <svc@...> --hook-url <url> gog gmail history --since <historyId>
Gmail watch (Pub/Sub push):
- •Create Pub/Sub topic + push subscription (OIDC preferred; shared token ok for dev).
- •Full flow + payload details:
docs/watch.md.
Email Tracking
Track when recipients open the emails that we've sent them:
# Set up local tracking config (per-account; generates keys; follow printed deploy steps) gog gmail track setup --worker-url https://gog-email-tracker.<acct>.workers.dev # Send with tracking gog gmail send --to recipient@example.com --subject "Hello" --body-html "<p>Hi!</p>" --track # Check opens gog gmail track opens <tracking_id> gog gmail track opens --to recipient@example.com # View status gog gmail track status
Docs: docs/email-tracking.md (setup/deploy) + docs/email-tracking-worker.md (internals).
Notes: --track requires exactly 1 recipient (no cc/bcc) and an HTML body (--body-html). Use --track-split to send per-recipient messages with individual tracking ids. The tracking worker stores IP/user-agent + coarse geo by default.
Human-readable output with colors (default):
$ gog gmail search 'newer_than:7d' --max 3 THREAD_ID SUBJECT FROM DATE 18f1a2b3c4d5e6f7 Meeting notes alice@example.com 2025-01-10 17e1d2c3b4a5f6e7 Invoice #12345 billing@vendor.com 2025-01-09 16d1c2b3a4e5f6d7 Project update bob@example.com 2025-01-08
Message-level search (one row per email; add --include-body to fetch/decode bodies):
$ gog gmail messages search 'newer_than:7d' --max 3 ID THREAD SUBJECT FROM DATE 18f1a2b3c4d5e6f7 9e8d7c6b5a4f3e2d Meeting notes alice@example.com 2025-01-10 17e1d2c3b4a5f6e7 9e8d7c6b5a4f3e2d Invoice #12345 billing@vendor.com 2025-01-09 16d1c2b3a4e5f6d7 7f6e5d4c3b2a1908 Project update bob@example.com 2025-01-08
JSON
Machine-readable output for scripting and automation:
$ gog gmail search 'newer_than:7d' --max 3 --json
{
"threads": [
{
"id": "18f1a2b3c4d5e6f7",
"snippet": "Meeting notes from today...",
"messages": [...]
},
...
]
}
$ gog gmail messages search 'newer_than:7d' --max 3 --json
{
"messages": [
{
"id": "18f1a2b3c4d5e6f7",
"threadId": "9e8d7c6b5a4f3e2d",
"subject": "Meeting notes",
"from": "alice@example.com",
"date": "2025-01-10"
},
...
]
}
$ gog gmail messages search 'newer_than:7d' --max 1 --include-body --json
{
"messages": [
{
"id": "18f1a2b3c4d5e6f7",
"threadId": "9e8d7c6b5a4f3e2d",
"subject": "Meeting notes",
"from": "alice@example.com",
"date": "2025-01-10",
"body": "Hi team — meeting notes..."
}
]
}
Data goes to stdout, errors and progress to stderr for clean piping:
gog --json gmail search 'newer_than:7d' | jq '.threads[] | select(.snippet | contains("invoice"))'
Useful pattern:
- •
gog --json ... | jq .
Examples
Search recent emails and download attachments
# Search for emails from the last week gog gmail search 'newer_than:7d has:attachment' --max 10 # Get thread details and download attachments gog gmail thread get <threadId> --download
Modify labels on a thread
# Archive and star a thread gog gmail thread modify <threadId> --remove INBOX --add STARRED
Batch process Gmail threads
# Mark all emails from a sender as read gog --json gmail search 'from:noreply@example.com' --max 200 | \ jq -r '.threads[].id' | \ xargs -n 50 gog gmail labels modify --remove UNREAD # Archive old emails gog --json gmail search 'older_than:1y' --max 200 | \ jq -r '.threads[].id' | \ xargs -n 50 gog gmail labels modify --remove INBOX # Label important emails gog --json gmail search 'from:boss@example.com' --max 200 | \ jq -r '.threads[].id' | \ xargs -n 50 gog gmail labels modify --add IMPORTANT
Advanced Features
Verbose Mode
Enable verbose logging for troubleshooting:
gog --verbose gmail search 'newer_than:7d' # Shows API requests and responses
Global Flags
All commands support these flags:
- •
--account <email|alias|auto>- Account to use (overrides GOG_ACCOUNT) - •
--enable-commands <csv>- Allowlist top-level commands (e.g.,calendar,tasks) - •
--json- Output JSON to stdout (best for scripting) - •
--plain- Output stable, parseable text to stdout (TSV; no colors) - •
--color <mode>- Color mode:auto,always, ornever(default: auto) - •
--force- Skip confirmations for destructive commands - •
--no-input- Never prompt; fail instead (useful for CI) - •
--verbose- Enable verbose logging - •
--help- Show help for any command
Shell Completions
Generate shell completions for your preferred shell:
Bash
# macOS (with Homebrew) gog completion bash > $(brew --prefix)/etc/bash_completion.d/gog # Linux gog completion bash > /etc/bash_completion.d/gog # Or load directly in your current session source <(gog completion bash)