Skip to main content

Zero-dependency OTP receiver via IMAP. Watch your inbox for verification codes from 30+ platforms.

Project description

otp-gateway

Zero-dependency Python library for receiving OTP codes via IMAP.

Watch your inbox for verification emails from 30+ platforms — GitHub, Google, Discord, OpenAI, and more. No third-party APIs, no SMS gateways. Just IMAP.

Features

  • 🔑 13 OTP extraction patterns — digits, alphanumeric, multi-language
  • 📬 IMAP auto-polling with configurable timeout & interval
  • 🔗 Verification link extraction from email bodies
  • 📛 Alias generation for catch-all domains
  • 🔄 Smart dedup — never returns the same OTP twice
  • 🐍 Zero dependencies — only Python stdlib
  • 🖥️ CLI + Python API — use from terminal or import in code

Install

pip install otp-gateway

Or just copy otp_gateway/ into your project — zero external deps.

Quick Start

Python API

from otp_gateway import OTPGateway, OTPConfig

# Configure
config = OTPConfig(
    imap_email="you@gmail.com",
    imap_password="your-app-password",  # Gmail: use App Password
    domain="yourdomain.com",            # optional: for alias generation
)
gw = OTPGateway(config)

# Option 1: Watch a specific email address
result = gw.wait_for_otp("github-abc123@yourdomain.com")
print(result["value"])  # "847291"

# Option 2: Generate alias + wait
alias = gw.generate_alias("github")
print(alias)  # "github-a7k2m3@yourdomain.com"
# ... use this email to sign up ...
result = gw.wait_for_otp(alias, timeout=90)
print(result["value"])  # the OTP code

# Option 3: One-shot check (no waiting)
result = gw.search_otp("some@email.com")
if result:
    print(result["type"])   # "code", "link", or "raw"
    print(result["value"])  # the OTP code or link

CLI

# Interactive setup
otp-gateway init

# Or pass credentials directly
otp-gateway --email you@gmail.com --password "xxxx" --domain yourdomain.com generate github
otp-gateway --email you@gmail.com --password "xxxx" wait github-a7k2m3@yourdomain.com

# Or use a config file
otp-gateway --config ~/.otp_gateway/config.json generate openai
otp-gateway --config ~/.otp_gateway/config.json check some@email.com
otp-gateway --config ~/.otp_gateway/config.json list

Config

JSON config file (~/.otp_gateway/config.json)

{
  "imap_server": "imap.gmail.com",
  "imap_port": 993,
  "imap_email": "you@gmail.com",
  "imap_password": "your-app-password",
  "domain": "yourdomain.com"
}

Environment variables

export OTP_IMAP_SERVER=imap.gmail.com
export OTP_IMAP_EMAIL=you@gmail.com
export OTP_IMAP_PASSWORD=your-app-password
export OTP_DOMAIN=yourdomain.com

Programmatic

config = OTPConfig(
    imap_server="imap.gmail.com",
    imap_port=993,
    imap_email="you@gmail.com",
    imap_password="your-app-password",
    domain="yourdomain.com",
)

How It Works

  1. Catch-all routing: Set up your domain to forward all *@yourdomain.com to one Gmail inbox
  2. Alias generation: otp-gateway creates unique aliases like github-a7k2m3@yourdomain.com
  3. IMAP polling: When you request an OTP, it polls your inbox for emails sent to that alias
  4. Pattern matching: 13 regex patterns extract the OTP code or verification link
  5. Dedup: Tracks seen message IDs so the same OTP is never returned twice

Catch-all domain setup

Provider Setup
Cloudflare Email Routing → Catch-all → forward to Gmail
Namecheap Forwarding → Catch-all
Google Domains Email → Forwarding → Add catch-all
Any SMTP Configure your mail server's catch-all

Gmail App Password

  1. Go to Google Account → Security → App Passwords
  2. Generate a new app password for "Mail"
  3. Use that 16-char password as imap_password

Supported Platforms

The library works with any platform that sends OTP via email. Built-in alias prefixes for:

Platform Prefix Platform Prefix
GitHub gh Discord dsc
Google go Twitter/X tw
OpenAI oai Anthropic ant
HuggingFace hf DeepSeek ds
Groq grq Replicate rep
Modal mod Railway rlw
AWS aws Azure azr
Cloudflare cf Binance bnb
Supabase spb Vercel vrc
Cohere coh Mistral mst

Add custom prefixes:

gw.add_prefix("myplatform", "mp")
alias = gw.generate_alias("myplatform")  # mp-a7k2m3@yourdomain.com

Response Format

{
    "type": "code",           # "code", "link", or "raw"
    "value": "847291",        # the OTP code or link
    "from": "noreply@github.com",
    "subject": "Your GitHub verification code",
    "date": "Mon, 25 Jun 2026 12:00:00 +0000",
    "msg_id": "42"
}

Error Handling

from otp_gateway import OTPGateway, OTPConfig, OTPTimeoutError, IMAPConnectionError

try:
    code = gw.get_otp("test@example.com", timeout=60)
except OTPTimeoutError:
    print("OTP not received in time")
except IMAPConnectionError:
    print("Can't connect to IMAP server")

Tests

pip install pytest
pytest tests/ -v

All tests use mocks — no real IMAP connection needed.

Requirements

  • Python 3.10+
  • No external dependencies (stdlib only)

License

MIT

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

otp_gateway-2.0.0.tar.gz (15.2 kB view details)

Uploaded Source

Built Distribution

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

otp_gateway-2.0.0-py3-none-any.whl (13.2 kB view details)

Uploaded Python 3

File details

Details for the file otp_gateway-2.0.0.tar.gz.

File metadata

  • Download URL: otp_gateway-2.0.0.tar.gz
  • Upload date:
  • Size: 15.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for otp_gateway-2.0.0.tar.gz
Algorithm Hash digest
SHA256 b9090aaa6476059a7d13d64461244ab1d2da337f4175f0bc98c45e93d92edbf5
MD5 c0ed08cf79ba11edd904ed019aea48a6
BLAKE2b-256 773940692c65ce3e48ec166e931457d7215ff0908e68fde8046a1c9cd384966d

See more details on using hashes here.

File details

Details for the file otp_gateway-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: otp_gateway-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 13.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for otp_gateway-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 179376cd7fc22afa8456b761443ef477b6249d55b1362049aca86d8fa958fcc0
MD5 3134a083728c3bf9981612767c963c83
BLAKE2b-256 fdb524d8497b079563623d144d2b073c11b2fb894c761233dcd68a11a125f438

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