SaaS posílá maily „jménem zákazníka" v From — DMARC fail a Gmail je tiše quarantinuje
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”API endpoint pro odeslání dokladu vrací sent: true s messageId, SMTP server loguje úspěšné předání (status=sent, 250 2.0.0 OK), fronta je prázdná — ale příjemcům na Gmail/Google Workspace mail nikdy nedorazí (ani do spamu u Workspace, admin quarantine). Žádný bounce se nevrací.
Klíčová stopa je až v postfix logu v textu odpovědi Googlu:
status=sent (250 2.0.0 OK DMARC:Quarantine 17841... - gsmtp)DMARC:Quarantine v gsmtp odpovědi = zpráva neprošla DMARC a byla přijata jen do karantény.
Root cause
Sekce “Root cause”Aplikace chtěla „white-label” odesílání — faktura má vypadat, že ji poslala firma zákazníka. Endpoint proto stavěl hlavičku From z e-mailu organizace:
// ŠPATNĚ — From na doméně zákazníkaawait sendEmail({ to, ..., from: company?.email ? `${companyName} <${company.email}>` : undefined,});Jenže:
- SMTP envelope-from zůstal na platformní schránce (
noreply@example.com) → SPF se vyhodnocuje pro doménu platformy, ne pro doménu z From → žádný SPF alignment. - DKIM (rspamd,
use_domain = "envelope") podepisujed=platforma.example→ žádný DKIM alignment s From doménou zákazníka. - DMARC příjemce se vyhodnocuje vždy proti doméně v hlavičce From. Doména zákazníka měla
p=quarantine→ Google mail přijal (250 OK!) a tiše zahodil do karantény.
Zákeřné: druhý, interně používaný endpoint stejné aplikace posílal správně (From platformní + Reply-To zákazníka), takže „maily fungují” — rozbité byly jen cesty, které předávaly from explicitně (public API + cron s připomínkami).
Fix
Sekce “Fix”Identita zákazníka jde do display name a Reply-To, From zůstává na doméně, kterou infrastruktura podepisuje:
// SPRÁVNĚ — From platformní, zákazník v display name + Reply-Toawait sendEmail({ to, ..., fromName: companyName, // "Firma s.r.o." <noreply@example.com> replyTo: company?.email || undefined, // odpověď jde zákazníkovi});Plus regresní test, že sendEmail nikdy nedostane from s cizí doménou.
Ověření po nasazení: poslat testovací mail na Gmail a v postfix logu zkontrolovat, že odpověď je čisté 250 2.0.0 OK bez DMARC:Quarantine.
Jak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection: grep na
from:/From:skládané z uživatelských/tenant dat (company.email,user.email,org.email). V postfix logu grepDMARC— Google důvod přibaluje přímo do 250 odpovědi. - Anti-pattern: mail helper s volitelným
fromparametrem, který callerům dovolí přepsat doménu odesílatele. Helper má přijímat jenfromName+replyTo. - Lepší přístup: pokud je white-label From tvrdý požadavek, je to per-doména onboarding: zákazník musí delegovat DKIM (CNAME selektor) a povolit odesílací server v SPF své domény — jinak From na jeho doméně nejde legálně poslat.
- Pozor:
250 OKod příjemce ≠ doručeno do inboxu. Gmail/Workspace umí přijmout a tiše quarantinovat.
Sister bugs / související
Sekce “Sister bugs / související”- Email z aplikace bouncuje — SMTP relay host neodpovídá SPF vlastní domény — příbuzná past: SPF nesedí kvůli špatnému odesílacímu hostu; tady SPF/DKIM sedí, ale na jinou doménu, než je ve From.