Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.replied.dk/llms.txt

Use this file to discover all available pages before exploring further.

Kort fortalt

Email-systemet i Replied består af to lag:

Forbundne konti

Afsendere I kobler på — Google, Microsoft eller egen mailserver. Definerer hvordan der sendes og modtages.

Email-beskeder

Alle indgående og udgående emails, automatisk knyttet til den rigtige henvendelse. Definerer hvad der faktisk er sendt.

Understøttede udbydere

Google

OAuth 2.0 med Gmail API. Ét klik for at forbinde.

Microsoft

OAuth 2.0 med Microsoft Graph. Understøtter Outlook og M365.

Egen mailserver

SMTP til afsendelse + IMAP til modtagelse. Fuld kontrol.
Hvis I vælger egen mailserver uden IMAP, kan I stadig sende mails — men systemet kan ikke hente svar automatisk.

Forbind en konto

1

Klik 'Forbind Google'

I omdirigeres til Google login.
2

Godkend adgang

Giv Replied tilladelse til gmail.send (og gmail.readonly for inbound).
3

Færdig

Tokens krypteres og gemmes. Token refresh håndteres automatisk.

Sådan sender vi mails

Når en bruger svarer på en tråd:
1

Frontend kalder /api/email/send

Backend validerer organisation, konto, modtager og rettigheder.
2

Threading-headere bygges

Nyt RFC Message-ID, In-Reply-To fra tidligere besked, og References ud fra kæden.
3

Besked oprettes med status 'sending'

En række i email_messages gemmes før afsendelse, så I altid har sporbarhed.
4

Mail sendes

Via Gmail API, Microsoft Graph eller SMTP — afhængigt af kontotypen.
5

Status opdateres

Til sent eller failed. Aktivitet logges inklusive fejlstatus.

Sådan henter vi svar

pollInboxForAccount(...) kører disse trin:
  1. Dekrypterer IMAP-adgangskode
  2. Opretter IMAP-forbindelse og låser mailboxen
  3. Henter kun nye mails via UID-state (imap_last_uid, imap_uid_validity)
  4. Parser mails med mailparser
  5. Matcher mail til henvendelse
  6. Gemmer i email_messages og opdaterer sync-state
Poll-state felter blev tilføjet i migration 00062.
pollGraphInboxForAccount(...) kører disse trin:
  1. Sikrer at kontoen har Mail.Read og gyldigt access token
  2. Henter /me/messages siden sidste poll
  3. Undgår dubletter via internetMessageId
  4. Matcher mail til henvendelse
  5. Gemmer indgående mail + aktivitet
  6. Opdaterer high-water mark (imap_last_polled_at)
Google inbound polling er markeret som ikke implementeret endnu i det nuværende cron-flow. Afsendelse via Gmail API virker fuldt ud.

Hvornår polling kører

TriggerFrekvensBeskrivelse
CronHvert 5. minutPOST /api/cron/email-poll beskyttet med CRON_SECRET
ManuelOn-demand”Tjek nu”-knap via /api/company/email-accounts/poll
Auto-refreshHvert 60. sekundStille baggrunds-poll når trådvisning er åben

Matching af svar til henvendelser

Systemet forsøger i denne rækkefølge — stopper ved første match:
1

Header: X-Replied-Inquiry-ID

Vores egen header. Mest pålidelig.
2

In-Reply-To opslag

Slår op på message_id i email_messages.
3

References-kæde

Følger hele tråd-kæden bagud.
4

Afsender + normaliseret emne

Samme email + samme emne (ignorerer Re:, Fw:, osv.)
5

Afsender-only fallback

Én nylig henvendelse fra samme email inden for 30 dage.
6

Legacy emne-tag

[Replied-xxxxxxxx] tag i emnet (bagudkompatibilitet).
Denne kaskade giver robust matching — også når udbydere ændrer headers.

Sikkerhed

AES-256-GCM kryptering

SMTP/IMAP adgangskoder og alle OAuth tokens krypteres før de gemmes i databasen.

Row Level Security

Alle medlemmer kan læse konti. Kun org_admin / superadmin kan oprette, rette og slette.

Krypterings-nøgle

Hentes fra EMAIL_ENCRYPTION_KEY. Skal dekode til 32 bytes. Format: iv || ciphertext || authTag (base64).

Graceful fejl-håndtering

Dekrypteringsfejl vises som driftsfejl i fejlstatus — aldrig som lækket data.

Den enkle huskeregel

1

Forbind konto

OAuth eller SMTP/IMAP.
2

Send svar

Gemmes som sending, derefter sent eller failed.
3

Poll indbakke

Cron, manuelt eller auto-refresh.
4

Match til henvendelse

Via headers med robust fallback-kaskade.
5

Gem i email_messages

Komplet, søgbar og sammenhængende historik direkte i Replied.
Tænk på det sådan her: konti fortæller systemet hvordan det skal sende og modtage. Beskeder fortæller hvad der faktisk er sendt og modtaget.