outlook-cli
A command-line tool for Microsoft Outlook (Work/School accounts). Search, read, send, and reply to emails. List, read, and create calendar events. Built with the O365 library and Typer.
Prerequisites
- Python 3.11+
- uv package manager
- An Azure App Registration (free) with Microsoft Graph delegated permissions:
Mail.ReadWriteMail.SendCalendars.ReadWrite
Azure App Setup
- Go to Azure Portal > App registrations
- Click New registration
- Name it anything (e.g. "Outlook CLI"), set Supported account types to your preference
- Under Authentication > Advanced settings, set Allow public client flows to Yes and save
- Under API permissions, add the three Delegated permissions listed above
- If your tenant requires admin consent, have an admin grant consent for the app
- Copy the Application (client) ID — you'll need it for
outlook auth login
Installation
git clone https://github.com/mhattingpete/outlook-cli.git
cd outlook-cli
uv sync
Getting Started
# Authenticate with your Azure app
outlook auth login --client-id YOUR_CLIENT_ID
# Follow the device code flow — open the URL and enter the code
# Check status
outlook auth status
Commands
Authentication
outlook auth login [--client-id ID] [--tenant-id ID] # Authenticate via device code flow
outlook auth logout # Remove stored token
outlook auth status # Show auth status and config
# Search / list messages
outlook mail search # List recent inbox messages
outlook mail search "quarterly report" # Full-text search
outlook mail search --unread # Unread messages only
outlook mail search --from alice@company.com # Filter by sender
outlook mail search --start-date 2025-01-01 --end-date 2025-02-01
outlook mail search --important --has-attachments # Combine filters
outlook mail search --folder "Sent Items" --limit 10 # Different folder
# Read a message
outlook mail read MESSAGE_ID
# Send a message
outlook mail send --to bob@company.com --subject "Hello" --body "Hi Bob!"
outlook mail send --to bob@company.com --cc carol@company.com --subject "Update" --body "FYI"
# Reply to a message
outlook mail reply MESSAGE_ID --body "Thanks for the update!"
outlook mail reply MESSAGE_ID --body "Noted, thanks." --reply-all
# Mark as read/unread
outlook mail mark MESSAGE_ID # Mark as read (default)
outlook mail mark MESSAGE_ID --unread # Mark as unread
Calendar
# List events (default: next 7 days)
outlook cal list
outlook cal list --start 2025-03-01 --end 2025-03-31 # Custom date range
outlook cal list --subject "standup" # Filter by subject
outlook cal list --location "Room A" # Filter by location
outlook cal list --all-day # All-day events only
outlook cal list --recurring # Recurring events only
outlook cal list --organizer boss@company.com # Filter by organizer
# Read event details (shows attendees, recurrence, etc.)
outlook cal read EVENT_ID
# Create an event
outlook cal create --subject "Lunch" --start "2025-02-08 12:00" --end "2025-02-08 13:00"
outlook cal create --subject "Workshop" \
--start "2025-02-10 09:00" --end "2025-02-10 17:00" \
--body "Full day workshop" --location "Conference Room B"
Configuration
Config and tokens are stored in ~/.outlook-cli/:
~/.outlook-cli/
├── config.toml # client_id, tenant_id
└── o365_token.token # OAuth token (auto-managed)
Development
# Install dev dependencies
uv sync
# Run tests
uv run pytest tests/ -v
# Run the CLI
uv run outlook --help
License
MIT
Metadata
Release files for outlook-cli 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| outlook_cli-0.2.0.tar.gz | 9.1 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| outlook_cli-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 21.9 kB
Release files / outlook_cli-0.2.0.tar.gz
| Download URL | outlook_cli-0.2.0.tar.gz |
|---|---|
| Size | 9.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7a2fb40823c94885000e6bfb13d88a16e28735384df521cbd2e6a36eedb8b7cb
|
|
BLAKE2b-256 checksum How to use checksums |
46c72424ec407f92851dc96ecc645e2709d42bb4f178ccc056953972fe981ca3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 10, 2026.
Transparency logRelease files / outlook_cli-0.2.0-py3-none-any.whl
| Download URL | outlook_cli-0.2.0-py3-none-any.whl |
|---|---|
| Size | 12.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b6836a5faf81b23fe61e516bc24c1f96ad472b68487903737b1d9cef9bae30af
|
|
BLAKE2b-256 checksum How to use checksums |
d8280265587ed26a9dd3d6f7643e0508d48eba85753de2515efbf8dbf1ee925e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 10, 2026.
Transparency logSecurity for outlook-cli 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for outlook_cli-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 10, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.