# Google Mail API Skill

Complete documentation for the Gmail API with support for both **Python** and **Node.js/TypeScript**.

## Files

- **SKILL.md** - Python implementation with `google-api-python-client`
- **SKILL-nodejs.md** - Node.js/TypeScript implementation with `googleapis`
- **README.md** - This file

## Quick Comparison

| Feature | Python | Node.js/TypeScript |
|---------|--------|-------------------|
| Installation | `pip install google-api-python-client` | `npm install googleapis google-auth-library` |
| Authentication | OAuth 2.0 with token caching | OAuth 2.0 with token caching |
| Type Safety | Dynamic typing | Full TypeScript support |
| Performance | Slower | Faster, async/await native |
| Use Cases | Scripts, automation, legacy | Modern web, backends, real-time |
| Dependencies | google-api-python-client, google-auth-oauthlib | googleapis, google-auth-library |
| Maintenance | ✅ Maintained | ✅ Actively maintained |

## Which Should I Use?

### Choose **Python** if:
- You're already in a Python environment (Jupyter, scripts)
- You're doing data analysis with pandas
- You prefer simpler blocking APIs
- You need to integrate with existing Python tools

### Choose **Node.js/TypeScript** if:
- You're building a web service or API
- You want async/await and promises
- You need type safety (TypeScript)
- You're already using Node.js
- You need better performance
- You want to build real-time features

## Core Differences

### Authentication

**Python:**
```python
service = authenticate()  # Returns service object
```

**Node.js/TypeScript:**
```typescript
const auth = await authenticate();  // Returns OAuth2Client
const gmail = google.gmail({ version: "v1", auth });
```

### Making API Calls

**Python:**
```python
results = service.users().messages().list(userId="me").execute()
```

**Node.js/TypeScript:**
```typescript
const results = await gmail.users.messages.list({ userId: "me" });
```

### Handling Responses

**Python:**
```python
messages = results.get("messages", [])
```

**Node.js/TypeScript:**
```typescript
const messages = results.data.messages || [];
```

## Common Tasks

All recipes are available in both:
- `SKILL.md` (Python versions)
- `SKILL-nodejs.md` (Node.js/TypeScript versions)

### Available Recipes

1. ✅ List Labels
2. ✅ List Messages in Inbox
3. ✅ Get Full Message
4. ✅ Send a Message
5. ✅ Send Email with Attachment
6. ✅ Create Draft
7. ✅ Apply Label to Message
8. ✅ List Threads
9. ✅ Get Thread Messages in Order
10. ✅ Search Messages
11. ✅ Create Custom Label
12. ✅ Modify Thread Labels
13. ✅ Move Message to Trash
14. ✅ Delete Message Permanently
15. ✅ Batch Modify Messages
16. ✅ Get User Profile

## Authentication Setup (Both Languages)

### 1. Create Google Cloud Project

- Go to [Google Cloud Console](https://console.cloud.google.com/)
- Create new project
- Enable Gmail API
- Create OAuth 2.0 credentials (Desktop Application)
- Download credentials file as `credentials.json`

### 2. Set Scopes

```
https://www.googleapis.com/auth/gmail.modify
https://www.googleapis.com/auth/gmail.send
https://www.googleapis.com/auth/gmail.readonly
```

### 3. First Run

Both implementations will prompt you to authorize via your browser and save a token for future use.

## Helper Classes/Utilities

### Node.js: GmailHelper Class

Already provided in `SKILL-nodejs.md`. Wraps common operations:

```typescript
const helper = new GmailHelper(auth);
await helper.sendMessage(to, subject, body);
await helper.applyLabel(messageId, labelName);
await helper.listInboxMessages(10);
```

### Python: Create Your Own

Consider wrapping the service in a class for easier reuse:

```python
class GmailHelper:
    def __init__(self, service):
        self.service = service
    
    def send_message(self, to, subject, body):
        # ... implementation
```

## Rate Limiting & Best Practices

Both implementations should respect:
- **Quota**: 250 requests per second per user
- **Batch operations**: Use `batchModify()` and `batchDelete()` for multiple messages
- **Pagination**: Use `pageToken` for large result sets
- **Caching**: Cache label IDs and user profiles

## Error Handling

### Python
```python
from googleapiclient.errors import HttpError

try:
    result = service.users().messages().get(...).execute()
except HttpError as error:
    print(f"Error: {error}")
```

### Node.js/TypeScript
```typescript
try {
  const result = await gmail.users.messages.get(...);
} catch (error: any) {
  console.error(`Error ${error.response.status}: ${error.message}`);
}
```

## Resources

- [Official Gmail API Docs](https://developers.google.com/workspace/gmail/api/guides)
- [API Reference](https://developers.google.com/workspace/gmail/api/reference/rest)
- [Python Client](https://googleapis.github.io/google-api-python-client/)
- [Node.js Client](https://github.com/googleapis/google-api-nodejs-client)
- [OAuth 2.0 Setup](https://developers.google.com/identity/protocols/oauth2)

## Tips & Tricks

1. **Caching Labels**: Call `list()` once and cache label IDs to avoid repeated API calls
2. **Batch Operations**: Group message operations into batch calls
3. **Full vs Metadata Format**: Use `format="metadata"` when you only need headers
4. **Thread vs Messages**: Use threads for conversation view, messages for individual emails
5. **Custom Queries**: Learn Gmail search syntax for powerful `q` parameter usage

## Examples

### Python: Send Email Script
```bash
python examples/send_email.py --to recipient@example.com --subject "Hello"
```

### Node.js: Create TypeScript Utility
```bash
npx ts-node src/gmail-utility.ts
```

Both implementations provide all the tools needed to build production Gmail automation!
