Exchange2010
by @pes0
Connect to Exchange 2010 to manage emails, calendar events, contacts, tasks, attachments, shared calendars, recurring events, and out-of-office settings.
clawhub install exchange2010π About This Skill
exchange2010
Exchange 2010 EWS integration for emails, calendar, contacts, and tasks.
Setup
Requires credentials in .env.credentials:
EXCHANGE_SERVER=mail.company.com
EXCHANGE_DOMAIN=company
EXCHANGE_EMAIL=user@company.com
EXCHANGE_PASSWORD=your_password
Features
subject__contains, start__gte, etc.Examples
Read Emails
from skills.exchange2010 import get_account, get_unread_emailsaccount = get_account()
emails = get_unread_emails(account, limit=10)
for email in emails:
print(f"{email['subject']} from {email['sender']}")
Today's Events
from skills.exchange2010 import get_today_eventsYour own events
today = get_today_events()Events from shared calendar
today = get_today_events('shared@company.com')
Search Events
from skills.exchange2010 import search_calendar_by_subject
from datetime import dateFast search for Ekadashi
ekadashi = search_calendar_by_subject(
email_address='shared@company.com',
search_term='Ekadashi',
start_date=date(2025, 1, 1),
end_date=date(2026, 12, 31)
)
print(f"Found: {len(ekadashi)} events")
Create Event
from skills.exchange2010 import create_calendar_event
from datetime import datetimecreate_calendar_event(
subject="Team Meeting",
start=datetime(2026, 2, 7, 14, 0),
end=datetime(2026, 2, 7, 15, 0),
body="Project discussion",
location="Conference Room A"
)
Update Event
from skills.exchange2010 import update_calendar_event
from datetime import datetimeReschedule
update_calendar_event(
event_id='AAQkAG...',
start=datetime(2026, 2, 10, 14, 0),
end=datetime(2026, 2, 10, 15, 0),
location="New Room B"
)
Browse Email Folders
from skills.exchange2010 import get_folder_emails, list_email_foldersList all folders
folders = list_email_folders(account)
for f in folders:
print(f"{f['name']}: {f['unread_count']} unread")Sent Items
sent = get_folder_emails('sent', limit=10)Drafts
drafts = get_folder_emails('drafts')Trash
trash = get_folder_emails('trash')
Search Emails
from skills.exchange2010 import search_emailsBy sender
emails = search_emails(sender='boss@company.com', limit=10)By subject
emails = search_emails(subject='Invoice', folder='inbox')Unread only
emails = search_emails(is_unread=True, limit=20)
Mark Email as Read
from skills.exchange2010 import mark_email_as_readmark_email_as_read(email_id='AAQkAG...')
Download Attachments
from skills.exchange2010 import get_email_attachmentsShow info
attachments = get_email_attachments(email_id='AAQkAG...')
for att in attachments:
print(f"{att['name']}: {att['size']} bytes")Download
attachments = get_email_attachments(
email_id='AAQkAG...',
download_path='/tmp/email_attachments'
)
Extract Text from Attachments
Prerequisite: pip install PyPDF2 for PDF text extraction
from skills.exchange2010 import process_attachment_contentresults = process_attachment_content(email_id='AAQkAG...')
for result in results:
print(f"File: {result['name']}")
if 'extracted_text' in result:
print(f"Content: {result['extracted_text'][:500]}...")
Search Contacts
from skills.exchange2010 import search_contacts, resolve_nameSearch contacts
contacts = search_contacts('John Doe')
for c in contacts:
print(f"{c['name']}: {c['email']}")Resolve name (GAL)
result = resolve_name('john.doe@company.com')
if result:
print(f"Found: {result['name']} - {result['email']}")
Manage Tasks
from skills.exchange2010 import get_tasks, create_task, complete_task, delete_task
from datetime import datetime, timedeltaShow open tasks
tasks = get_tasks()
for task in tasks:
status = 'β
' if task['is_complete'] else 'β³'
print(f"{status} {task['subject']}")Create new task
task_id = create_task(
subject="Finish report",
body="Q1 report due Friday",
due_date=datetime.now() + timedelta(days=3),
importance="High"
)Mark as complete
complete_task(task_id)Delete
delete_task(task_id)
Find Recurring Events
from skills.exchange2010 import get_recurring_eventsrecurring = get_recurring_events(
email_address='shared@company.com',
days=30
)
for r in recurring:
print(f"{r['subject']}: {r['recurrence']}")
Out-of-Office
from skills.exchange2010 import get_out_of_office, set_out_of_office
from datetime import datetime, timedeltaCheck status
oof = get_out_of_office()
print(f"Out of office active: {oof['enabled']}")Enable
set_out_of_office(
enabled=True,
internal_reply="I am on vacation until Feb 15th.",
external_reply="I am on vacation until Feb 15th.",
start=datetime.now(),
end=datetime.now() + timedelta(days=7),
external_audience='All' # 'All', 'Known', 'None'
)Disable
set_out_of_office(enabled=False, internal_reply="")
Send Email
from skills.exchange2010 import send_emailsend_email(
to=["recipient@example.com"],
subject="Test",
body="Hello!",
cc=["cc@example.com"]
)
API Reference
| Function | Description |
|----------|-------------|
| get_account() | Connect to Exchange |
| get_unread_emails(account, limit=50) | Get unread emails |
| search_emails(search_term, sender, subject, is_unread, folder, limit) | Search emails |
| send_email(to, subject, body, cc, bcc) | Send email |
| mark_email_as_read(email_id) | Mark as read |
| get_email_attachments(email_id, download_path) | Download attachments |
| process_attachment_content(email_id, attachment_name) | Extract text |
Email Folders
| Function | Description |
|----------|-------------|
| get_folder_emails(folder_name, limit, is_unread) | Emails from folder |
| list_email_folders(account) | List all folders |
Calendar
| Function | Description |
|----------|-------------|
| get_today_events(email_address) | Today's events |
| get_upcoming_events(email_address, days) | Next N days |
| get_calendar_events(account, start, end) | Events in range |
| get_shared_calendar_events(email, start, end) | Shared calendar |
| search_calendar_by_subject(email, term, start, end) | Fast search |
| create_calendar_event(subject, start, end, body, location) | Create event |
| update_calendar_event(event_id, ...) | Update event |
| get_event_details(event_id) | Show details |
| delete_calendar_event(event_id) | Delete event |
| get_recurring_events(email, start, end) | Recurring events |
| list_available_calendars(account) | List calendars |
| count_ekadashi_events(email, start_year) | Count Ekadashi |
Contacts
| Function | Description |
|----------|-------------|
| search_contacts(search_term, limit) | Search contacts |
| resolve_name(name) | Resolve name (GAL) |
Tasks
| Function | Description |
|----------|-------------|
| get_tasks(status, folder) | Get tasks |
| create_task(subject, body, due_date, importance, categories) | Create task |
| complete_task(task_id) | Mark complete |
| delete_task(task_id) | Delete task |
Out-of-Office
| Function | Description |
|----------|-------------|
| get_out_of_office(email_address) | Read status |
| set_out_of_office(enabled, internal_reply, ...) | Set OOF |
Notes
subject__contains, start__gte) are faster than iterationπ‘ Examples
Read Emails
from skills.exchange2010 import get_account, get_unread_emailsaccount = get_account()
emails = get_unread_emails(account, limit=10)
for email in emails:
print(f"{email['subject']} from {email['sender']}")
Today's Events
from skills.exchange2010 import get_today_eventsYour own events
today = get_today_events()Events from shared calendar
today = get_today_events('shared@company.com')
Search Events
from skills.exchange2010 import search_calendar_by_subject
from datetime import dateFast search for Ekadashi
ekadashi = search_calendar_by_subject(
email_address='shared@company.com',
search_term='Ekadashi',
start_date=date(2025, 1, 1),
end_date=date(2026, 12, 31)
)
print(f"Found: {len(ekadashi)} events")
Create Event
from skills.exchange2010 import create_calendar_event
from datetime import datetimecreate_calendar_event(
subject="Team Meeting",
start=datetime(2026, 2, 7, 14, 0),
end=datetime(2026, 2, 7, 15, 0),
body="Project discussion",
location="Conference Room A"
)
Update Event
from skills.exchange2010 import update_calendar_event
from datetime import datetimeReschedule
update_calendar_event(
event_id='AAQkAG...',
start=datetime(2026, 2, 10, 14, 0),
end=datetime(2026, 2, 10, 15, 0),
location="New Room B"
)
Browse Email Folders
from skills.exchange2010 import get_folder_emails, list_email_foldersList all folders
folders = list_email_folders(account)
for f in folders:
print(f"{f['name']}: {f['unread_count']} unread")Sent Items
sent = get_folder_emails('sent', limit=10)Drafts
drafts = get_folder_emails('drafts')Trash
trash = get_folder_emails('trash')
Search Emails
from skills.exchange2010 import search_emailsBy sender
emails = search_emails(sender='boss@company.com', limit=10)By subject
emails = search_emails(subject='Invoice', folder='inbox')Unread only
emails = search_emails(is_unread=True, limit=20)
Mark Email as Read
from skills.exchange2010 import mark_email_as_readmark_email_as_read(email_id='AAQkAG...')
Download Attachments
from skills.exchange2010 import get_email_attachmentsShow info
attachments = get_email_attachments(email_id='AAQkAG...')
for att in attachments:
print(f"{att['name']}: {att['size']} bytes")Download
attachments = get_email_attachments(
email_id='AAQkAG...',
download_path='/tmp/email_attachments'
)
Extract Text from Attachments
Prerequisite: pip install PyPDF2 for PDF text extraction
from skills.exchange2010 import process_attachment_contentresults = process_attachment_content(email_id='AAQkAG...')
for result in results:
print(f"File: {result['name']}")
if 'extracted_text' in result:
print(f"Content: {result['extracted_text'][:500]}...")
Search Contacts
from skills.exchange2010 import search_contacts, resolve_nameSearch contacts
contacts = search_contacts('John Doe')
for c in contacts:
print(f"{c['name']}: {c['email']}")Resolve name (GAL)
result = resolve_name('john.doe@company.com')
if result:
print(f"Found: {result['name']} - {result['email']}")
Manage Tasks
from skills.exchange2010 import get_tasks, create_task, complete_task, delete_task
from datetime import datetime, timedeltaShow open tasks
tasks = get_tasks()
for task in tasks:
status = 'β
' if task['is_complete'] else 'β³'
print(f"{status} {task['subject']}")Create new task
task_id = create_task(
subject="Finish report",
body="Q1 report due Friday",
due_date=datetime.now() + timedelta(days=3),
importance="High"
)Mark as complete
complete_task(task_id)Delete
delete_task(task_id)
Find Recurring Events
from skills.exchange2010 import get_recurring_eventsrecurring = get_recurring_events(
email_address='shared@company.com',
days=30
)
for r in recurring:
print(f"{r['subject']}: {r['recurrence']}")
Out-of-Office
from skills.exchange2010 import get_out_of_office, set_out_of_office
from datetime import datetime, timedeltaCheck status
oof = get_out_of_office()
print(f"Out of office active: {oof['enabled']}")Enable
set_out_of_office(
enabled=True,
internal_reply="I am on vacation until Feb 15th.",
external_reply="I am on vacation until Feb 15th.",
start=datetime.now(),
end=datetime.now() + timedelta(days=7),
external_audience='All' # 'All', 'Known', 'None'
)Disable
set_out_of_office(enabled=False, internal_reply="")
Send Email
from skills.exchange2010 import send_emailsend_email(
to=["recipient@example.com"],
subject="Test",
body="Hello!",
cc=["cc@example.com"]
)
βοΈ Configuration
Requires credentials in .env.credentials:
EXCHANGE_SERVER=mail.company.com
EXCHANGE_DOMAIN=company
EXCHANGE_EMAIL=user@company.com
EXCHANGE_PASSWORD=your_password
π Tips & Best Practices
subject__contains, start__gte) are faster than iteration