Skip to content

Archive email runbook

🤖 OpenCode for Michael Conrad edited this page Nov 12, 2026 · 1 revision

Archive email runbook

This runbook sets up the archive email account ia@cherokeedictionary.net, forwarding every message to m.conrad.202+ia@gmail.com and standtrooper+ia@gmail.com, using Cloudflare Email Routing on the cherokeedictionary.net zone with the built-in automatic DNS configuration. Manual DNS setup is not used.

Prerequisites

  • The zone serves from Cloudflare DNS. This is satisfied: the DNS record of record names louis.ns.cloudflare.com and serena.ns.cloudflare.com as the serving NS set.
  • The Cloudflare dashboard path is Compute > Email Service > Email Routing.
  • The zone's record set of record (Cloudflare export 2026-11-02T18:58:37Z) carries no MX and no SPF records, so onboarding takes the clean path: no external-MX error, no SPF merge.

Domain onboarding

  1. In the dashboard, go to Compute > Email Service > Email Routing.
  2. Click Onboard Domain and select cherokeedictionary.net.
  3. Review the DNS records Cloudflare adds automatically to the root domain:
    • MX — routing incoming email to Cloudflare;
    • SPF — a TXT record authorizing routing;
    • DKIM — a TXT record at cf2024-1._domainkey.
  4. Click Done.

The records arrive Locked (Email-Service-managed); nothing is entered into DNS manually. DNS propagation runs up to 24 hours globally, usually 5–15 minutes on Cloudflare DNS.

Destinations

Before creating the routing rule, add and verify both destination addresses:

  1. Under Destination Addresses, add m.conrad.202+ia@gmail.com and standtrooper+ia@gmail.com (the +ia-tagged Gmail forms deliver to the same inboxes and are filterable by tag).
  2. Destination addresses are managed at the account level and are reusable across domains.
  3. Verify each address with the Verify email address click that Cloudflare mails to it.

Destinations must be added and verified before the routing rule: a routing rule pointing at an unverified destination stays disabled.

Forwarding path (Worker)

The dashboard routing rule carries a single destination, so the two-recipient fan-out is the Worker route — one forward() call per destination:

  1. Deploy a minimal email-handler Worker to the account whose handler forwards each message to both verified destinations — one forward() per destination:

    from workers import WorkerEntrypoint, EmailEvent
    import asyncio
    
    class EmailForward(WorkerEntrypoint):
        async def fetch(self, request, env, ctx):
            ...
    
        async def email(self, message, env, ctx):
            destinations = ["m.conrad.202+ia@gmail.com", "standtrooper+ia@gmail.com"]
            await asyncio.gather(*(message.forward(dest) for dest in destinations))
  2. Under Routing Rules, create a rule with:

    • Email pattern: ia on cherokeedictionary.net;
    • Action: Send to a Worker → the forwarding Worker.

Keep only one rule for this pattern: when duplicate patterns exist, only the first-listed rule processes.

Verification

Check each of the following after the rule is enabled:

  • DNS records are Locked: Email Routing > Settings > DNS records shows the three auto-added records (MX, SPF, DKIM at cf2024-1._domainkey) with Locked status.

  • DNS resolution matches the domain-configuration doc's own checks:

    dig MX cherokeedictionary.net
    dig TXT cherokeedictionary.net | grep spf
    dig TXT cf2024-1._domainkey.cherokeedictionary.net
  • End-to-end delivery: send a test message from an external account (different from the destinations) to ia@cherokeedictionary.net and confirm it arrives at both destinations (check the spam folder if delayed).

  • Routing activity is observable in the dashboard.

Boundaries

  • No manual DNS setup. The automatic configuration of record applies; the records are unlockable only for a provider migration, which is out of scope.
  • No catch-all rule. This runbook creates the address-specific rule only.
  • Unmatched addresses are rejected. Once the MX records point to Cloudflare, mail to unmatched addresses is rejected ("Address does not exist" behavior). The zone carries no prior email addresses — no MX in the pre-state export — so no existing mail flow is at risk.
  • Email Sending (outbound) is not touched. The separate cf-bounce surface stays out of this runbook's scope.

Runbook authoring verified against the Cloudflare Email Service docs (route emails; email routing rules and addresses; domain configuration — last updated Jun 9, 2026 / Oct 15, 2026 / Oct 30, 2026). Executing the setup is separate, authorized work.

Clone this wiki locally