Files
wild-pc/protonmail

protonmail

CLI tool for syncing and managing ProtonMail emails via ProtonMail Bridge. Downloads emails as .eml files for fast, offline access. All read/list/search commands work against the local cache.

Prerequisites

ProtonMail Bridge must be running locally with IMAP enabled (default port 1143).

Usage

# Sync all emails from Bridge to local .eml files
protonmail sync

# Sync to a custom directory
protonmail sync -o ~/emails

# List recent emails (from local cache)
protonmail list
protonmail list Sent
protonmail list -n 50

# Read a specific email
protonmail read "2024-07-17_01-14-40_from_alice_example_com_to_bob_example_com.eml"

# Search by subject or sender
protonmail search "invoice"
protonmail search "alice" -f Sent

# Send an email (interactive, requires Bridge)
protonmail send

Configuration

Set via environment variables (castle manages these automatically):

Variable Description Default
PROTONMAIL_USERNAME Bridge username (required) -
PROTONMAIL_API_KEY Bridge API key (required) -
PROTONMAIL_DATA_DIR Where to store synced .eml files /data/messages/email/protonmail

In castle, the API key is stored as a secret:

env:
  PROTONMAIL_API_KEY: ${secret:PROTONMAIL_API_KEY}

How sync works

  1. Connects to Bridge via IMAP on 127.0.0.1:1143
  2. Lists all folders (INBOX, Sent, Drafts, etc.)
  3. For each folder, downloads new messages as .eml files
  4. Skips emails already in the local cache (matched by Message-ID)
  5. Filenames follow the pattern: YYYY-MM-DD_HH-MM-SS_from_SENDER_to_RECIPIENT_SUBJECT.eml

Castle integration

Registered as both a tool (installed to PATH) and a job (syncs every 5 minutes via systemd timer).

Development

uv sync                         # Install dependencies
uv run protonmail --version     # Verify
uv run pytest tests/ -v         # Run tests
uv run ruff check .             # Lint

No third-party dependencies -- stdlib only.