Mail Delivery Loop

How email reaches Envoy and how outbound mail is routed.

Inbound: External Email to Envoy

1. Sender addresses email to envoy@critchley.biz.2. zoneedit MX (mx-caprica.zoneedit.com) accepts the message.3. Mail is delivered to the Outlook/Microsoft 365 mailbox for critchley.biz.4. popit3 runs every 20 minutes (cron: :00/:20/:40 and :10/:30/:50, 06:00–22:00) and fetches new messages from Outlook via POP3.5. process_emails.py routes by To: address: • envoy@critchley.biz → stored in ~/py/envoy/requests/ (local maildir) AND uploaded via WebDAV to noodle:/mail/envoy (Dovecot maildir). • envoy_test@critchley.biz → stored in ~/py/envoy/responses/ (local only).6. Immediately after popit3, orchestrator.py runs and checks IMAP INBOX on noodle.

Inbound: Continuation Emails

Continuation emails are self-addressed (From: envoy@, To: envoy@critchley.biz).They follow the same full loop as external mail: sendmail (pomelo) → zoneedit MX → Outlook → popit3 → WebDAV → noodle IMAPThis means a ~20-minute delay minimum before the continuation email is processed.In the cron setup this is fine: popit3 will pick it up on the next run.For manual testing, use IMAP APPEND to inject the continuation email directly.

Outbound: Envoy Replies

Replies are sent via sendmail on pomelo (local postfix): sendmail → postfix → zoneedit MX → recipient's mailboxA copy is stored in the IMAP Sent folder via IMAP APPEND for the record.Address rewriting maps some addresses (e.g. bluewin.ch variants → critchley.biz).

Infrastructure

• pomelo — local machine, runs postfix, popit3, orchestrator• noodle — AWS Singapore instance, runs Dovecot IMAP, WebDAV server (noodle starts at 05:58, stops at 22:59 via awsctl cron)• zoneedit — external MX for critchley.biz• Outlook/Microsoft 365 — receives inbound mail for critchley.biz addresses

Cron Schedule (pomelo)

Every 20 minutes, 06:00–22:00: :00/:20/:40 — popit3 --reprocess (fetch + reprocess all unprocessed), then orchestrator :10/:30/:50 — popit3 (normal fetch only), then orchestratorOther jobs: 05:58 — start noodle (AWS) 22:50 — unmount WebDAV 22:59 — stop noodle (AWS) Job analysis report runs every 5 min 06:00–21:00 (separate pipeline)

Key Paths

• ~/py/envoy/requests/ — local maildir copy of inbound envoy mail• ~/py/envoy/responses/ — local maildir copy of envoy_test replies• ~/py/envoy/cron.log — orchestrator cron output• ~/py/popit3/out.log — popit3 cron output

version1
updated2026-02-22