docs(mail): record that the email.bitborg.se move is blocked at the provider #380
Inga granskare
Etiketter
Inga etiketter
area/backups
area/ci
area/control-panel
area/identity
area/infra
area/observability
area/payments
area/security
area/storage
area/web
blocked
needs-info
needs-triage
ready-for-implementation
type
bug
type
chore
type
docs
type
epic
type
feature
type
task
wontfix
Ingen milstolpe
Inget projekt
Inga tilldelade
1 deltagare
Notiser
Förfallodatum
Inget förfallodatum satt.
Beroenden
Inga beroenden satta
Referens
bitborg/bitborg-infra!380
Läser in…
Hänvisa till i nytt ärende
Ingen beskrivning angiven.
Ta bort grenen "docs/mail-domain-step-zero"
Borttagning av en gren är permanent. Även om den borttagna grenen kan fortsätta existera en kort tid innan den faktiskt tas bort, kan det INTE ångras i de flesta fall. Vill du fortsätta?
What happened
The
email.bitborg.semove was planned on "DKIM and DMARC are already published and the Sweego credentials are unchanged, so there is no dashboard work." DNS was indeed published — the DKIM CNAME resolves, with the same key as the old domain — and the move still failed.Sweego does not authorise
email.bitborg.se, so every portal email was rejected from the moment step 2 deployed. Step 2 has been reverted (bitborg-web #197); step 3 was never applied.Measured from inside the running container with the portal's own
SWEEGO_API_KEY— same request shape, only the From domain differing:no-reply@mail.gitborg.seno-reply@email.bitborg.se{"detail":"Unauthorized"}Published DNS is not provider authorisation
That is the whole lesson. The pre-flight that passed had checked the DKIM CNAME and the DMARC record — which was never the question. A verified sending identity on the account is, and it has no representation in DNS or in this repo.
Two things made it hide:
401, not422, for an unauthorised sender, so it reads as a credential fault rather than a domain one. The first single-domain probe returned a bare401, equally consistent with a wrong key or a malformed request.The "credentials are unchanged" assumption may itself be the error: the key can be bound to a sending identity, so a new domain may need it re-scoped rather than reused.
So the procedure gains a step 0
Prove the provider accepts a send as the new domain — with that two-domain differential — before anything else moves. The runnable check is recorded beside
mail_allowed_sender_domains.What the guard cannot do
senderAllowed()compares the sender against what this repo declares, and this repo had declared the new domain allowed. So the guard passed and the provider refused. The runbook already described that mechanism, but attached it only to a permanently widened allowlist — it applies equally to a correctly widened one whose new domain the provider does not accept.State left behind
Unblocking
Verify
email.bitborg.sein the Sweego dashboard, re-run the two-domain send, require 2xx on the new domain, then re-land step 2.