ZKRINET Docs
Byggblock

Nyhetsbrev

På Zkrinet: lägg till blocket under Byggblock i panelen — ett klick, din egen kod rörs inte och en ögonblicksbild tas först. Installationsstegen nedan gäller om du kör PocketBase själv, till exempel efter en export.

Prenumerationslista med dubbel opt-in, avregistrering med ett klick i varje utskick, och utskick i omgångar från adminpanelen. Inga externa tjänster — mejlen går via din egen SMTP.

Kräver Mejl-pluginet. Testat mot PocketBase 0.40.4.

Installation

  1. Installera Mejl först (och ställ in SMTP), kopiera sedan pb_hooks/ och pb_migrations/ till din PocketBase och starta om.
  2. Kontrollera Settings → Application URL — länkarna i mejlen byggs på den (https://din-pb.se/api/zk/nyhetsbrev/...).
  3. zk_nyhetsbrev_installningar har redan en rad: per_timme (anmälningar per IP och timme, standard 5), omgang (mejl per omgång, standard 50) och hemlighet (skapas automatiskt, dold). Hemligheten kan i stället sättas med miljövariabeln ZK_NYHETSBREV_HEMLIGHET.
  4. Bakom en proxy (Cloudflare, nginx)? Ställ in Settings → Trusted proxy, annars delar alla besökare samma gräns.
  5. Mejlmallarna nyhetsbrev_bekrafta och nyhetsbrev_redan finns i zk_mejlmallar och kan redigeras där.

Anmälan från din sajt

await fetch("https://din-pb.se/api/zk/nyhetsbrev/prenumerera", {
  method: "POST", headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ epost: "anna@exempel.se" }),
})
// 200 { ok: true, meddelande: "Om adressen är giltig får du strax ett mejl…" } · 400 ogiltig adress · 429 för många försök

Eller utan JavaScript:

<form method="post" action="https://din-pb.se/api/zk/nyhetsbrev/prenumerera">
  <input name="epost" type="email" required placeholder="din@adress.se">
  <button>Prenumerera</button>
</form>

Så går det till:

  1. Anmälan → raden skapas med status = vantar och ett bekräftelsemejl skickas.
  2. Länken i mejlet öppnar en sida med en knapp. Ingenting bekräftas förrän man trycker — mejlskannrar (Outlook, Gmail, företagsfilter) öppnar länkar men trycker inte på knappar. Länken gäller i 7 dagar och fungerar en gång.
  3. Knappen → status = bekraftad. Först nu får adressen utskick.

Skicka ett utskick

  1. Skapa en rad i zk_nyhetsbrev_utskick: amne, innehall (HTML, redigeraren i adminpanelen), valfritt text (ren textversion — annars görs en av HTML:en), status = utkast.
  2. Starta (superuser, t.ex. från adminverktyg eller curl):
POST /api/zk/nyhetsbrev/skicka/{id}
→ { status: "skickas", skickade_nu: 50, antal: 50, fel: 0 }

Första anropet skickar en omgång. Resten skickas automatiskt, en omgång i minuten (cron). Anropa igen om du vill köra nästa omgång direkt. När alla är klara blir status = skickat; ett skickat utskick kan inte skickas igen (409).

Varje mottagare får en rad i zk_nyhetsbrev_leveranser (skickat / fel). En unik nyckel på (utskick, prenumerant) gör att samma brev aldrig går två gånger till samma adress, även om cron och ett manuellt anrop kör samtidigt. Misslyckas ett mejl (t.ex. SMTP nere) avbryts omgången och mottagaren tas igen nästa omgång, högst 3 försök.

Varje utskick får automatiskt en sidfot med avregistreringslänk — den går inte att glömma. I innehållet kan du använda {{app}} (appnamnet) och {{avregistrera}} (länken) om du vill ha den på fler ställen. Innehållet låses när utskicket startar: ändrar du det under tiden får alla ändå samma brev.

Avregistrering

Länken i varje utskick avregistrerar direkt med ett klick och fungerar hur många gånger som helst (idempotent). Den är signerad med serverns hemlighet (HMAC), så ingen kan avregistrera någon annan genom att gissa id:n. POST mot samma adress fungerar också, enligt RFC 8058 (one-click).

Den som anmäler sig igen efter att ha avregistrerat sig måste bekräfta på nytt.

Säkerhet och integritet

Begränsningar

Testa

./bank.py nyhetsbrev

18 tester mot bänkens SMTP-fälla (inget når internet): dubbel opt-in med knapp, token hash-lagrad/engångs/utgången, ingen uppräkning, paus mot mejlbombning, skiftlägesokänslig unik adress, utskick bara till bekräftade, omgångar utan dubbletter, avregistrering (ett klick, idempotent, RFC 8058-POST, förfalskad länk nekas), ny anmälan kräver ny bekräftelse, behörighet, rate limit och SMTP-avbrott mitt i ett utskick. Säkerhetstesterna är mutantverifierade.