email-forwarder/README.md
Jeena 686c4877d3 Implement email forwarder
Add core IMAP forwarding logic with time-based searches and Message-ID
deduplication to prevent duplicates in destination mailbox.

Changes:
- Implement SINCE-based email search using last_run.txt for incremental forwarding
- Add Message-ID extraction and IMAP checks for deduplication
- Configure systemd user services with drop-in overrides for portability
- Integrate Uptime Kuma pings for monitoring
- Set up virtual environment for dependency isolation
- Update documentation and configuration templates
2026-01-04 15:34:31 +09:00

2.2 KiB

Email Forwarder

This script forwards new emails from a source IMAP account (e.g., GMX) to a destination IMAP account (e.g., MXRoute), avoiding duplicates by tracking Message-IDs and using time-based searches.

Setup

  1. Copy .env.example to .env and fill in your IMAP credentials, Uptime URLs, and settings.

  2. Create virtual environment: python -m venv venv

  3. Activate and install: source venv/bin/activate && pip install -e .

  4. For user services (recommended):

    • Copy services: cp *.service *.timer ~/.config/systemd/user/
    • Copy drop-in: cp -r email_forwarder.service.d ~/.config/systemd/user/
    • Edit ~/.config/systemd/user/email_forwarder.service.d/override.conf to set PROJECT_DIR to your project path.
  5. Reload and enable: systemctl --user daemon-reload && systemctl --user enable email_forwarder.timer && systemctl --user start email_forwarder.timer

  6. Check status: systemctl --user status email_forwarder.timer

Configuration (.env)

  • SOURCE_HOST: Source IMAP server (e.g., imap.gmx.com)
  • SOURCE_PORT: Port (default 993)
  • SOURCE_USER: Source email/username
  • SOURCE_PASS: Source password
  • DEST_HOST: Destination IMAP server (e.g., yourserver.mxrouting.net)
  • DEST_PORT: Port (default 993)
  • DEST_USER: Destination email/username
  • DEST_PASS: Destination password
  • FOLDER: Mailbox folder (default INBOX)
  • DRY_RUN: Set to true for testing without forwarding (default false)
  • UPTIME_SUCCESS_URL: URL for success ping
  • UPTIME_FAIL_URL: URL for failure ping

How It Works

  • Uses time-based search (SINCE) with last_run.txt to find emails since last run.
  • Extracts Message-ID, checks against local file and destination IMAP for duplicates.
  • Forwards via IMAP APPEND; updates last_run.txt on success.
  • Logs activity; systemd handles Uptime Kuma pings.

Monitoring with Uptime Kuma

  • Success: Pings ${UPTIME_SUCCESS_URL} after forwarding.
  • Failure: OnFailure pings ${UPTIME_FAIL_URL}.

Dependencies

  • imaplib, email (built-in)
  • python-dotenv, imap-tools
  • systemd (for user services)

Troubleshooting

  • Logs: journalctl --user -u email_forwarder.service
  • Test: source venv/bin/activate && python main.py
  • Timezone issues: Adjust UTC offset in script if needed.