Overview

All commands follow this pattern:

bash
uv run python -m outlookctl.cli <command> [options]

Global Options

Option Description
--output Output format: json or text (default: json)
--version Show version number and exit
--help Show help message and exit
outlookctl doctor diagnostic

Validates environment and prerequisites. Run this first to ensure everything is set up correctly.

bash
uv run python -m outlookctl.cli doctor

Checks Performed

  • ✓ Windows OS detection
  • ✓ pywin32 installation
  • ✓ Outlook COM availability
  • ✓ Outlook executable location
outlookctl list email

List messages from a folder. Returns message summaries including subject, sender, date, and read status.

bash
uv run python -m outlookctl.cli list --count 10 --unread-only

Options

OptionDefaultDescription
--folderinboxFolder to list from
--count10Number of messages to return
--unread-onlyfalseOnly return unread messages
--since-ISO date filter (messages after)
--until-ISO date filter (messages before)
--include-body-snippetfalseInclude body preview
--body-snippet-chars200Max characters for snippet

Folder Specifications

inbox Default inbox
sent Sent items
drafts Drafts folder
deleted Deleted items
outbox Outbox
junk Junk/spam

Custom folders: by-name:FolderName or by-path:Inbox/Subfolder

outlookctl get email

Get a single message by ID. Returns full message details including body content when requested.

bash
uv run python -m outlookctl.cli get \ --id "00000..." \ --store "00000..." \ --include-body

Options

OptionRequiredDescription
--idRequiredMessage entry ID
--storeRequiredMessage store ID
--include-bodyOptionalInclude full message body
--include-headersOptionalInclude message headers
--max-body-charsOptionalLimit body length
outlookctl draft email

Create a draft message. The draft is saved to the Drafts folder and can be reviewed before sending.

bash
uv run python -m outlookctl.cli draft \ --to "recipient@example.com" \ --subject "Meeting Follow-up" \ --body-text "Thank you for the meeting."

Options

OptionDescription
--toTo recipients (comma-separated)
--ccCC recipients (comma-separated)
--bccBCC recipients (comma-separated)
--subjectEmail subject
--body-textPlain text body
--body-htmlHTML body
--attachFile path to attach (repeatable)
--reply-to-idEntry ID of message to reply to
--reply-to-storeStore ID of message to reply to
--reply-allReply-all instead of reply new
outlookctl send email

Send a draft or new message. Requires explicit confirmation.

Safety: Sending requires --confirm-send YES. The recommended workflow is to create a draft first, review it, then send.
bash
# Send existing draft (recommended) uv run python -m outlookctl.cli send \ --draft-id "00000..." \ --draft-store "00000..." \ --confirm-send YES

Safety Options

OptionDescription
--confirm-sendMust be exactly "YES" to proceed
--confirm-send-filePath to file containing "YES"
--unsafe-send-newRequired for sending new message directly
--log-bodyInclude body in audit log
outlookctl move
email new

Move a message to another folder. Returns the new message ID after moving.

bash
uv run python -m outlookctl.cli move \ --id "00000..." \ --store "00000..." \ --dest "by-name:Archive"

Options

OptionRequiredDescription
--idRequiredMessage entry ID
--storeRequiredMessage store ID
--destRequiredDestination folder (same specs as list)
outlookctl delete
email new

Delete a message. By default moves to Deleted Items; use --permanent to skip the trash.

bash
uv run python -m outlookctl.cli delete \ --id "00000..." \ --store "00000..."

Options

OptionRequiredDescription
--idRequiredMessage entry ID
--storeRequiredMessage store ID
--permanentOptionalPermanently delete (skip Deleted Items)
outlookctl mark-read
email new

Mark a message as read or unread.

bash
# Mark as read uv run python -m outlookctl.cli mark-read --id "..." --store "..." # Mark as unread uv run python -m outlookctl.cli mark-read --id "..." --store "..." --unread

Options

OptionRequiredDescription
--idRequiredMessage entry ID
--storeRequiredMessage store ID
--unreadOptionalMark as unread instead of read
outlookctl forward
email new

Create a forward draft for a message. The forward is saved as a draft for review before sending.

bash
uv run python -m outlookctl.cli forward \ --id "00000..." \ --store "00000..." \ --to "colleague@example.com" \ --message "FYI - see below"

Options

OptionRequiredDescription
--idRequiredOriginal message entry ID
--storeRequiredOriginal message store ID
--toRequiredTo recipients (comma-separated)
--ccOptionalCC recipients
--bccOptionalBCC recipients
--messageOptionalAdditional text to prepend
outlookctl attachments save email

Save attachments from a message to disk. Creates the destination directory if needed.

bash
uv run python -m outlookctl.cli attachments save \ --id "00000..." \ --store "00000..." \ --dest "./downloads"

Options

OptionRequiredDescription
--idRequiredMessage entry ID
--storeRequiredMessage store ID
--destRequiredDestination directory
outlookctl calendar calendars calendar new

List all available calendars across all accounts, including subscribed ICS calendars, shared calendars, and internet calendars.

bash
uv run python -m outlookctl.cli calendar calendars

Output Fields

FieldDescription
nameCalendar display name
pathFull path in folder hierarchy
storeAccount/store containing the calendar

Usage

Use this to discover calendar names, then access them with --calendar "Name" in other commands.

outlookctl calendar list calendar

List calendar events within a date range. Defaults to the next 7 days from today.

bash
uv run python -m outlookctl.cli calendar list \ --start "2025-01-20" \ --days 14
bash
# Access a specific calendar by name uv run python -m outlookctl.cli calendar list \ --calendar "Family" --days 7

Options

OptionDefaultDescription
--starttodayStart date
--end-End date (overrides --days)
--days7Number of days from start
--calendar-Calendar name or email for shared calendar
--count100Maximum events
outlookctl calendar get calendar

Get detailed information about a calendar event including attendees and recurrence.

bash
uv run python -m outlookctl.cli calendar get \ --id "00000..." \ --store "00000..." \ --include-body
outlookctl calendar create calendar

Create a calendar event or meeting. Meetings with attendees are saved as drafts.

bash
uv run python -m outlookctl.cli calendar create \ --subject "Team Sync" \ --start "2025-01-20 10:00" \ --duration 60 \ --attendees "alice@example.com,bob@example.com"

Options

OptionDefaultDescription
--subjectRequiredEvent title
--startRequiredStart time
--duration60Duration in minutes
--end-End time
--location-Location
--attendees-Required attendees
--optional-attendees-Optional attendees
--all-dayfalseAll-day event
--busy-statusbusyfree, tentative, busy, etc.
--recurrence-Recurrence pattern
outlookctl calendar send calendar

Send meeting invitations. Requires explicit confirmation.

Safety: Sending invitations requires --confirm-send YES.
bash
uv run python -m outlookctl.cli calendar send \ --id "00000..." \ --store "00000..." \ --confirm-send YES
outlookctl calendar respond calendar

Respond to a meeting invitation.

bash
uv run python -m outlookctl.cli calendar respond \ --id "00000..." \ --store "00000..." \ --response accept

Options

OptionDescription
--responseaccept, decline, or tentative
--no-responseDon't send response to organizer
outlookctl calendar update
calendar new

Update an existing calendar event. Only specified fields are modified.

bash
uv run python -m outlookctl.cli calendar update \ --id "00000..." \ --store "00000..." \ --location "Room B" \ --start "2025-01-20 11:00"

Options

OptionRequiredDescription
--idRequiredEvent entry ID
--storeRequiredEvent store ID
--subjectOptionalNew subject
--startOptionalNew start time
--endOptionalNew end time
--durationOptionalNew duration (minutes)
--locationOptionalNew location
--bodyOptionalNew description
--reminderOptionalNew reminder (minutes)
--busy-statusOptionalNew show-as status
outlookctl calendar delete
calendar new

Delete a calendar event. For meetings you organized, sends cancellation to attendees by default.

bash
uv run python -m outlookctl.cli calendar delete \ --id "00000..." \ --store "00000..."

Options

OptionRequiredDescription
--idRequiredEvent entry ID
--storeRequiredEvent store ID
--no-cancelOptionalDon't send cancellation to attendees