# SMTP delivery fallback patterns When a script or cron job needs to send an email but SMTP is unreachable, use these fallback strategies. ## Current SMTP configuration | Setting | Value | |---|---| | Host | `mail.germainebrown.com` | | Port | **2525** (NOT 587 — netcup blocks 25, 465, 587) | | TLS | STARTTLS | | From (outbound) | `g@germainebrown.com` | | Password file | `/root/.config/himalaya/g-germainebrown.pass` | **Why 2525:** Netcup VPS blocks outbound ports 25, 465, and 587. The MXroute mail server (mail.germainebrown.com) accepts SMTP on port 2525. This was tested and confirmed working for both `g@germainebrown.com` and `shonuff@germainebrown.com`. ## Detect SMTP reachability first ```python import socket for port in [2525, 587, 465]: s = socket.socket() s.settimeout(5) try: s.connect(('mail.germainebrown.com', port)) print(f'Port {port}: available') s.close() except (socket.timeout, ConnectionRefusedError, OSError): print(f'Port {port}: blocked') ``` ## Fallback: Wasabi S3 upload If SMTP is completely unreachable: ```bash source /opt/awscli-venv/bin/activate aws s3 cp s3://hermes-vps-backups/ \ --endpoint-url https://s3.us-east-1.wasabisys.com/ ``` Then notify the user via Telegram/DM: "File uploaded to Wasabi — grab it at `s3://bucket/key`" ## All scripts updated to use port 2525 The following files were patched from 587 → 2525 (confirmed working): - `/root/.hermes/scripts/send-recovery.py` - `/root/.hermes/scripts/send-backup-email.py` - `/root/.hermes/scripts/send-backup-readme.py` - `/root/.hermes/scripts/daily-feed-summary.py` - `/root/.config/himalaya/shonuff.toml` ## Future services (Mautic, etc.) Any new service that sends email from this box must use port **2525**, not 587. Netcup's outbound port blocking applies to all servers in their network.