Claude-skill-registry google-gmail-integration
Manages Gmail through the Gmail API. Search and read emails, send messages, manage labels and filters, handle attachments, and automate email workflows. Use when working with Gmail, reading/sending emails, searching inbox, managing email organization, or processing email data.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/google-gmail-integration" ~/.claude/skills/majiayu000-claude-skill-registry-google-gmail-integration && rm -rf "$T"
skills/data/google-gmail-integration/SKILL.mdGmail Integration
Comprehensive Gmail integration enabling email search, message management, sending, label organization, attachment handling, and workflow automation through the Gmail API v1.
Quick Start
When asked to work with Gmail:
- Authenticate: Set up OAuth2 credentials (one-time setup)
- Search emails: Find messages by sender, subject, date, or content
- Read messages: Get email content and attachments
- Send emails: Compose and send messages
- Organize: Create labels, apply filters, archive messages
- Automate: Process emails based on rules
Prerequisites
One-Time Setup
1. Enable Gmail API:
# Visit Google Cloud Console # https://console.cloud.google.com/ # Enable Gmail API for your project # APIs & Services > Enable APIs and Services > Gmail API
2. Create OAuth2 Credentials:
# In Google Cloud Console: # APIs & Services > Credentials > Create Credentials > OAuth client ID # Application type: Desktop app # Download credentials as credentials.json
3. Install Dependencies:
pip install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client --break-system-packages
4. Initial Authentication:
python scripts/authenticate.py # Opens browser for Google sign-in # Saves token.json for future use
See reference/setup-guide.md for detailed setup instructions.
Core Operations
Search Emails
Basic search:
# Search by keyword python scripts/search_emails.py --query "project update" # Search by sender python scripts/search_emails.py --from "boss@company.com" # Search by subject python scripts/search_emails.py --subject "Weekly Report" # Search unread python scripts/search_emails.py --unread # Search with label python scripts/search_emails.py --label "Important"
Advanced search queries:
# Combination search query = "from:boss@company.com subject:urgent is:unread" # Date ranges query = "after:2025/01/01 before:2025/01/31" # Has attachment query = "has:attachment filename:pdf" # Size filters query = "larger:10M" # Categories query = "category:primary" query = "category:social" query = "category:promotions" # Boolean operators query = "(from:alice@company.com OR from:bob@company.com) subject:meeting"
See reference/search-syntax.md for complete search reference.
Read Messages
Get message content:
# Read email python scripts/read_email.py --message-id MESSAGE_ID # Get specific format python scripts/read_email.py --message-id MESSAGE_ID --format full python scripts/read_email.py --message-id MESSAGE_ID --format minimal python scripts/read_email.py --message-id MESSAGE_ID --format raw
Extract information:
# Get headers python scripts/get_headers.py --message-id MESSAGE_ID # Get body text python scripts/get_body.py --message-id MESSAGE_ID --format text python scripts/get_body.py --message-id MESSAGE_ID --format html # List attachments python scripts/list_attachments.py --message-id MESSAGE_ID
Download attachments:
# Download all attachments python scripts/download_attachments.py --message-id MESSAGE_ID --output ./downloads/ # Download specific attachment python scripts/download_attachments.py --message-id MESSAGE_ID --filename "report.pdf"
Send Emails
Simple send:
# Send plain text python scripts/send_email.py \ --to "recipient@example.com" \ --subject "Hello" \ --body "Email content here" # Send to multiple recipients python scripts/send_email.py \ --to "user1@example.com,user2@example.com" \ --cc "manager@example.com" \ --subject "Team Update" \ --body "Content here"
Send with attachments:
python scripts/send_email.py \ --to "recipient@example.com" \ --subject "Report" \ --body "Please see attached" \ --attachments "./report.pdf,./data.xlsx"
Send HTML email:
python scripts/send_email.py \ --to "recipient@example.com" \ --subject "Newsletter" \ --html-body "./newsletter.html"
Reply to message:
python scripts/reply_email.py \ --message-id MESSAGE_ID \ --body "Thanks for your email..."
Forward message:
python scripts/forward_email.py \ --message-id MESSAGE_ID \ --to "colleague@example.com" \ --body "FYI"
Label Management
Create labels:
# Create label python scripts/create_label.py --name "Project Alpha" # Create nested label python scripts/create_label.py --name "Projects/Alpha" # Create with settings python scripts/create_label.py \ --name "Important" \ --label-list-visibility show \ --message-list-visibility show
Apply labels:
# Add label to message python scripts/add_label.py --message-id MESSAGE_ID --label "Important" # Add multiple labels python scripts/add_label.py --message-id MESSAGE_ID --labels "Work,Urgent" # Remove label python scripts/remove_label.py --message-id MESSAGE_ID --label "Inbox"
List labels:
# Get all labels python scripts/list_labels.py # Get label ID python scripts/get_label_id.py --name "Project Alpha"
Message Management
Mark as read/unread:
# Mark as read python scripts/mark_read.py --message-id MESSAGE_ID # Mark as unread python scripts/mark_unread.py --message-id MESSAGE_ID
Archive/Trash:
# Archive message (remove from Inbox) python scripts/archive_email.py --message-id MESSAGE_ID # Move to trash python scripts/trash_email.py --message-id MESSAGE_ID # Delete permanently python scripts/delete_email.py --message-id MESSAGE_ID
Batch operations:
# Archive all read emails older than 30 days python scripts/batch_archive.py --days 30 --read-only # Delete all emails from sender python scripts/batch_delete.py --from "spam@example.com" # Mark all as read python scripts/batch_mark_read.py --label "Inbox"
Common Workflows
Workflow 1: Process Unread Emails
Scenario: Read unread emails and categorize
# Get unread emails python scripts/process_unread.py \ --label-rules rules.json \ --mark-read # rules.json example: { "rules": [ { "condition": "from:boss@company.com", "action": "add_label", "label": "Important" }, { "condition": "subject:invoice", "action": "add_label", "label": "Finance" } ] }
Workflow 2: Email to Task Conversion
Scenario: Convert emails into task format
# Extract tasks from emails python scripts/email_to_tasks.py \ --query "label:To-Do" \ --output tasks.json \ --mark-done
Workflow 3: Automated Responses
Scenario: Send auto-replies based on conditions
# Auto-respond to specific emails python scripts/auto_respond.py \ --query "from:client@company.com subject:urgent" \ --template response_template.txt \ --label "Auto-Responded"
Workflow 4: Email Backup
Scenario: Download emails for backup
# Backup all emails python scripts/backup_emails.py \ --output ./email_backup/ \ --format mbox # Backup specific label python scripts/backup_emails.py \ --label "Important" \ --output ./important_backup/ \ --include-attachments
Workflow 5: Email Analytics
Scenario: Analyze email patterns
# Generate email statistics python scripts/email_stats.py \ --start-date 2025-01-01 \ --end-date 2025-01-31 \ --output stats.json # Top senders python scripts/top_senders.py --limit 10 # Email volume by day python scripts/email_volume.py --days 30
Search Query Syntax
Operators
# Sender/Recipient "from:sender@example.com" "to:recipient@example.com" "cc:person@example.com" "bcc:person@example.com" # Subject "subject:meeting" "subject:(status report)" # Date "after:2025/01/01" "before:2025/12/31" "older_than:2d" # days "newer_than:7d" # Status "is:unread" "is:read" "is:starred" "is:important" # Has "has:attachment" "has:drive" "has:document" "has:spreadsheet" "has:presentation" "has:youtube" # Size "larger:10M" "smaller:1M" "size:5M" # Category "category:primary" "category:social" "category:promotions" "category:updates" "category:forums" # Label "label:important" "label:work" "-label:inbox" # exclude inbox # Filename "filename:pdf" "filename:report.xlsx" # In "in:inbox" "in:trash" "in:spam" "in:anywhere" # includes spam and trash # Boolean "OR" # Must be uppercase "AND" # Implied, can be explicit "-" # NOT operator "()" # Grouping
Example Queries
# Unread emails from boss "from:boss@company.com is:unread" # Large emails with attachments "has:attachment larger:5M" # Recent important unread "is:important is:unread newer_than:7d" # Specific sender, subject, with PDF "from:client@company.com subject:invoice has:attachment filename:pdf" # Multiple senders "(from:alice@company.com OR from:bob@company.com) subject:meeting" # Date range with keyword "after:2025/01/01 before:2025/01/31 project update" # Exclude categories "-category:promotions -category:social is:unread"
Message Format Options
Format Types
# Minimal - IDs and labels only format = 'minimal' # Full - Complete message with body and headers format = 'full' # Raw - Raw MIME message (for forwarding) format = 'raw' # Metadata - Headers and labels without body format = 'metadata'
Accessing Message Parts
# Get headers headers = message['payload']['headers'] for header in headers: if header['name'] == 'Subject': subject = header['value'] elif header['name'] == 'From': sender = header['value'] # Get body (plain text) parts = message['payload'].get('parts', []) for part in parts: if part['mimeType'] == 'text/plain': body = base64.urlsafe_b64decode(part['body']['data']).decode() # Get attachments for part in parts: if part.get('filename'): attachment_id = part['body']['attachmentId']
Sending Email Formats
Plain Text
from email.mime.text import MIMEText import base64 message = MIMEText('Email body') message['to'] = 'recipient@example.com' message['subject'] = 'Test Email' raw = base64.urlsafe_b64encode(message.as_bytes()).decode()
HTML Email
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText message = MIMEMultipart('alternative') message['to'] = 'recipient@example.com' message['subject'] = 'HTML Email' text = "Plain text version" html = "<html><body><h1>HTML Version</h1></body></html>" part1 = MIMEText(text, 'plain') part2 = MIMEText(html, 'html') message.attach(part1) message.attach(part2)
With Attachments
from email.mime.base import MIMEBase from email import encoders import os message = MIMEMultipart() message['to'] = 'recipient@example.com' message['subject'] = 'With Attachment' # Add body body = MIMEText('Please see attached') message.attach(body) # Add attachment with open('file.pdf', 'rb') as f: part = MIMEBase('application', 'octet-stream') part.set_payload(f.read()) encoders.encode_base64(part) part.add_header( 'Content-Disposition', f'attachment; filename={os.path.basename("file.pdf")}' ) message.attach(part)
Label Visibility
Label list visibility:
- Show in label listlabelShow
- Hide from label listlabelHide
Message list visibility:
- Show label in message listshow
- Hide label in message listhide
API Rate Limits
Gmail API quotas:
- Queries per day: 1,000,000,000
- Queries per 100 seconds per user: 250
- Send message: 100 per day per user (can request increase)
Best practices:
- Batch requests when possible
- Use partial responses to reduce data
- Implement exponential backoff
- Cache message IDs and metadata
OAuth Scopes
# Full access (read, send, delete) 'https://www.googleapis.com/auth/gmail.modify' # Read-only 'https://www.googleapis.com/auth/gmail.readonly' # Send only 'https://www.googleapis.com/auth/gmail.send' # Labels only 'https://www.googleapis.com/auth/gmail.labels' # Compose (draft and send) 'https://www.googleapis.com/auth/gmail.compose' # Insert (add messages) 'https://www.googleapis.com/auth/gmail.insert' # Metadata only 'https://www.googleapis.com/auth/gmail.metadata'
Choose the minimal scope needed for your use case.
Scripts Reference
Authentication:
- Initial OAuth setupauthenticate.py
- Refresh tokenrefresh_token.py
Search:
- Search with queriessearch_emails.py
- Quick sender searchfind_by_sender.py
- Get unread messagesfind_unread.py
Read:
- Read message contentread_email.py
- Extract headersget_headers.py
- Get message bodyget_body.py
- List attachmentslist_attachments.py
- Download filesdownload_attachments.py
Send:
- Send new emailsend_email.py
- Reply to messagereply_email.py
- Forward messageforward_email.py
- Send to multiple recipientssend_bulk.py
Labels:
- Create new labelcreate_label.py
- Get all labelslist_labels.py
- Apply label to messageadd_label.py
- Remove labelremove_label.py
Manage:
- Mark as readmark_read.py
- Mark as unreadmark_unread.py
- Archive messagearchive_email.py
- Move to trashtrash_email.py
- Permanent deletedelete_email.py
Batch:
- Archive multiplebatch_archive.py
- Delete multiplebatch_delete.py
- Mark multiple readbatch_mark_read.py
Automation:
- Process unread emailsprocess_unread.py
- Automated responsesauto_respond.py
- Extract tasksemail_to_tasks.py
- Apply rule-based filtersapply_filters.py
Analytics:
- Usage statisticsemail_stats.py
- Most frequent senderstop_senders.py
- Volume over timeemail_volume.py
Best Practices
- Use specific queries: Narrow searches reduce processing time
- Batch operations: Process multiple messages in single API call
- Cache data: Store message IDs and metadata locally
- Handle pagination: Use pageToken for large result sets
- Respect quotas: Monitor API usage
- Error handling: Implement retry logic with backoff
- Secure tokens: Never commit token.json to version control
- Minimal scopes: Request only needed permissions
Integration Examples
See examples/ for complete workflows:
- examples/email-automation.md - Automated email processing
- examples/task-integration.md - Email to task conversion
- examples/reporting.md - Email analytics and reporting
- examples/backup-strategy.md - Email backup approaches
Troubleshooting
"Token expired"
rm token.json python scripts/authenticate.py
"Insufficient permissions"
- Check SCOPES in authenticate.py
- Delete token.json and re-auth with new scopes
"Message not found"
- Message may have been deleted
- Check if in trash or spam
"Rate limit exceeded"
- Implement delays between requests
- Use batch operations
- Request quota increase if needed
Reference Documentation
- reference/setup-guide.md - Setup instructions
- reference/search-syntax.md - Complete search reference
- reference/api-reference.md - API documentation
- reference/email-formats.md - MIME and format reference