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
59 lines
No EOL
2.2 KiB
Markdown
59 lines
No EOL
2.2 KiB
Markdown
# 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. |