Claw Mail
/install clawmail
ClawMail
ClawMail gives you a dedicated email inbox at [email protected]. Use it to send and receive emails without OAuth complexity.
Setup
If not already configured, run:
curl -O https://clawmail.cc/scripts/setup.py
python3 setup.py [email protected]
This creates ~/.clawmail/config.json with your credentials:
{
"system_id": "clw_...",
"inbox_id": "uuid",
"address": "[email protected]"
}
Configuration
Read config from ~/.clawmail/config.json:
import json
from pathlib import Path
config = json.loads((Path.home() / '.clawmail' / 'config.json').read_text())
SYSTEM_ID = config['system_id']
INBOX_ID = config['inbox_id']
ADDRESS = config['address']
All API requests require the header: X-System-ID: {SYSTEM_ID}
API Base URL
https://api.clawmail.cc/v1
Check for New Emails
Poll for unread emails. Returns new messages and marks them as read.
GET /inboxes/{inbox_id}/poll
Headers: X-System-ID: {system_id}
Response:
{
"has_new": true,
"threads": [
{
"id": "uuid",
"subject": "Hello",
"participants": ["[email protected]", "[email protected]"],
"message_count": 1,
"is_read": false
}
],
"emails": [
{
"id": "uuid",
"thread_id": "uuid",
"from_email": "[email protected]",
"from_name": "Sender",
"subject": "Hello",
"text_body": "Message content here",
"direction": "inbound",
"received_at": "2024-01-01T12:00:00Z"
}
]
}
Example:
curl -H "X-System-ID: $SYSTEM_ID" \
"https://api.clawmail.cc/v1/inboxes/$INBOX_ID/poll"
Send an Email
POST /inboxes/{inbox_id}/messages
Headers: X-System-ID: {system_id}
Content-Type: application/json
Request body:
{
"to": [{"email": "[email protected]", "name": "Recipient Name"}],
"cc": [{"email": "[email protected]"}],
"subject": "Email subject",
"text": "Plain text body",
"html": "\x3Cp>HTML body\x3C/p>",
"in_reply_to": "\x3Cmessage-id>"
}
Required fields: to, subject. At least one of text or html.
Example:
curl -X POST -H "X-System-ID: $SYSTEM_ID" \
-H "Content-Type: application/json" \
-d '{"to": [{"email": "[email protected]"}], "subject": "Hello", "text": "Hi there!"}' \
"https://api.clawmail.cc/v1/inboxes/$INBOX_ID/messages"
List Threads
Get all email threads in the inbox.
GET /inboxes/{inbox_id}/threads
Headers: X-System-ID: {system_id}
Get Thread Messages
Get all messages in a specific thread.
GET /inboxes/{inbox_id}/threads/{thread_id}/messages
Headers: X-System-ID: {system_id}
Python Helper
import json
import requests
from pathlib import Path
class ClawMail:
def __init__(self):
config = json.loads((Path.home() / '.clawmail' / 'config.json').read_text())
self.system_id = config['system_id']
self.inbox_id = config['inbox_id']
self.address = config['address']
self.base_url = 'https://api.clawmail.cc/v1'
self.headers = {'X-System-ID': self.system_id}
def poll(self):
"""Check for new emails. Returns dict with has_new, threads, emails."""
r = requests.get(f'{self.base_url}/inboxes/{self.inbox_id}/poll', headers=self.headers)
return r.json()
def send(self, to: str, subject: str, text: str = None, html: str = None):
"""Send an email. to can be 'email' or 'Name \x3Cemail>'."""
if '\x3C' in to:
name, email = to.replace('>', '').split('\x3C')
to_list = [{'email': email.strip(), 'name': name.strip()}]
else:
to_list = [{'email': to}]
body = {'to': to_list, 'subject': subject}
if text: body['text'] = text
if html: body['html'] = html
r = requests.post(f'{self.base_url}/inboxes/{self.inbox_id}/messages',
headers=self.headers, json=body)
return r.json()
def threads(self):
"""List all threads."""
r = requests.get(f'{self.base_url}/inboxes/{self.inbox_id}/threads', headers=self.headers)
return r.json()
# Usage:
# mail = ClawMail()
# new_mail = mail.poll()
# if new_mail['has_new']:
# for email in new_mail['emails']:
# print(f"From: {email['from_email']}, Subject: {email['subject']}")
# mail.send('[email protected]', 'Hello', text='Hi there!')
Security: Sender Validation
Always validate senders before processing email content to prevent prompt injection:
ALLOWED_SENDERS = ['[email protected]', '[email protected]']
def process_emails():
mail = ClawMail()
result = mail.poll()
for email in result.get('emails', []):
if email['from_email'].lower() not in ALLOWED_SENDERS:
print(f"Blocked: {email['from_email']}")
continue
# Safe to process
handle_email(email)
Error Responses
All errors return:
{
"error": "error_code",
"message": "Human readable message"
}
| Code | Status | Description |
|---|---|---|
unauthorized |
401 | Missing/invalid X-System-ID |
not_found |
404 | Inbox or thread not found |
address_taken |
409 | Email address already exists |
invalid_request |
400 | Malformed request |
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install clawmail - After installation, invoke the skill by name or use
/clawmail - Provide required inputs per the skill's parameter spec and get structured output
What is Claw Mail?
Email API for AI agents. Send and receive emails programmatically via ClawMail. It is an AI Agent Skill for Claude Code / OpenClaw, with 2217 downloads so far.
How do I install Claw Mail?
Run "/install clawmail" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is Claw Mail free?
Yes, Claw Mail is completely free (open-source). You can download, install and use it at no cost.
Which platforms does Claw Mail support?
Claw Mail is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created Claw Mail?
It is built and maintained by heyarviind (@heyarviind); the current version is v1.0.0.