Skip to main content

Email-to-EML Secure Archiver

Project description

Email-to-EML Secure Archiver (EESA)

A Python-based command-line utility to programmatically retrieve emails from Gmail and Microsoft 365 and save them as RFC822-compliant .eml files.

โœจ Features

  • ๐Ÿ” Secure OAuth2 Authentication - Browser-based authentication with 2FA support
  • ๐Ÿ“ง Multi-Provider Support - Gmail and Microsoft 365 (Outlook)
  • ๐Ÿ” Advanced Filtering - Date-based, incremental sync, custom queries
  • ๐Ÿช Webhook Integration - Automatically send downloaded emails to webhook endpoints
  • ๐Ÿ’พ Incremental Checkpointing - Resume interrupted downloads
  • ๐Ÿ“ฆ Modern Package Management - UV/UVX support for easy installation and execution

๐Ÿš€ Quick Start

Installation

cd email-archiver
uv sync

Basic Usage

# Download emails from Gmail since a specific date
uv run main.py --provider gmail --since 2024-12-01

# Incremental sync (resume from last checkpoint)
uv run main.py --provider gmail --incremental

# With webhook integration
uv run main.py --provider gmail --since 2024-12-23 \
  --webhook-url https://your-webhook.com/endpoint \
  --webhook-secret "Bearer your-token"

๐Ÿ“– Documentation

๐ŸŽฏ Common Use Cases

Daily Email Backup

uv run main.py --provider gmail --incremental

Archive Specific Emails

# Emails with attachments
uv run main.py --provider gmail --query "has:attachment" --since 2024-01-01

# From specific sender
uv run main.py --provider gmail --query "from:important@example.com"

Webhook Integration

# Send emails to processing endpoint
uv run main.py --provider gmail --incremental \
  --webhook-url https://api.example.com/emails \
  --webhook-secret "Bearer sk_live_abc123"

โš™๏ธ Configuration

Gmail Setup

  1. Create a project in Google Cloud Console
  2. Enable Gmail API
  3. Create OAuth 2.0 credentials (Desktop App)
  4. Save credentials as config/client_secret.json

Microsoft 365 Setup

  1. Register app in Azure Portal
  2. Add Mail.Read permission
  3. Update config/settings.yaml with your Client ID

See Quick Start Guide for detailed instructions.

๐Ÿช Webhook Integration

EESA can automatically POST downloaded .eml files to a webhook endpoint:

Via CLI:

uv run main.py --provider gmail --since 2024-12-01 \
  --webhook-url https://webhook.site/your-id \
  --webhook-secret "Bearer token"

Via Configuration:

# config/settings.yaml
webhook:
  url: "https://your-webhook.com/endpoint"
  enabled: true
  headers:
    Authorization: "Bearer your-token"

๐Ÿ“‹ Command-Line Arguments

Argument Description
--provider {gmail,m365} Email provider (required)
--since YYYY-MM-DD Download emails since date
--incremental Resume from last checkpoint
--query STRING Custom search query
--webhook-url URL Webhook endpoint URL
--webhook-secret SECRET Authorization header for webhook

See API Reference for complete documentation.

๐Ÿ”ง Requirements

  • Python 3.9+
  • UV package manager (recommended) or pip
  • Gmail API credentials (for Gmail)
  • Azure AD app registration (for M365)

๐Ÿ“ Project Structure

email-archiver/
โ”œโ”€โ”€ main.py                 # CLI entry point
โ”œโ”€โ”€ core/                   # Core modules
โ”‚   โ”œโ”€โ”€ gmail_handler.py    # Gmail API integration
โ”‚   โ”œโ”€โ”€ graph_handler.py    # Microsoft Graph API integration
โ”‚   โ””โ”€โ”€ utils.py            # Utility functions
โ”œโ”€โ”€ config/
โ”‚   โ”œโ”€โ”€ settings.yaml       # Configuration file
โ”‚   โ”œโ”€โ”€ checkpoint.json     # Incremental sync state
โ”‚   โ””โ”€โ”€ client_secret.json  # OAuth credentials (git-ignored)
โ”œโ”€โ”€ auth/                   # OAuth tokens (git-ignored)
โ”œโ”€โ”€ downloads/              # Downloaded .eml files
โ”œโ”€โ”€ docs/                   # Documentation
โ””โ”€โ”€ pyproject.toml          # UV/Python project config

๐Ÿ”’ Security

  • OAuth2 Only - No password storage
  • Read-Only Scopes - gmail.readonly and Mail.Read
  • Token Protection - Tokens stored with restricted permissions (chmod 600)
  • HTTPS Webhooks - Always use HTTPS for webhook endpoints

๐Ÿค Contributing

This project follows the specification in docs/SPECIFICATION.md.

๐Ÿ“„ License

See LICENSE file for details.

๐Ÿ†˜ Support

For issues or questions:

  1. Check the documentation
  2. Review examples
  3. Check logs in sync.log

๐ŸŽ“ Examples

Automation with Cron

# Daily backup at 2 AM
0 2 * * * cd /path/to/email-archiver && uv run main.py --provider gmail --incremental

Python Integration

import subprocess

subprocess.run([
    "uv", "run", "main.py",
    "--provider", "gmail",
    "--since", "2024-12-01"
], cwd="/path/to/email-archiver")

See EXAMPLES.md for 21 more examples!


Built with โค๏ธ for secure email archiving

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

email_archiver-0.1.0.tar.gz (59.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

email_archiver-0.1.0-py3-none-any.whl (9.4 kB view details)

Uploaded Python 3

File details

Details for the file email_archiver-0.1.0.tar.gz.

File metadata

  • Download URL: email_archiver-0.1.0.tar.gz
  • Upload date:
  • Size: 59.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for email_archiver-0.1.0.tar.gz
Algorithm Hash digest
SHA256 c74b94131a4eb78c0809fd76548c8d2e03d45295f88270dbee9fe530a01cd244
MD5 46ac75e0e48a702e3f11a38243aa2f15
BLAKE2b-256 d4cac8c4ecca3f784444786c5428d1013982c5aa3cab28cbec220913a0268187

See more details on using hashes here.

File details

Details for the file email_archiver-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: email_archiver-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for email_archiver-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3758bdfb18496aa5a5605c6cf9bff34870d7a7a0cf08bc99e96626ecac351ee6
MD5 4f9d056d675d50e86ce16252fa1dc978
BLAKE2b-256 a6c76469d94977e60bffdd5b6315632c515f69a27984edd6bfbc1cd994359bf5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page