e10da76259
Administrator -> Willkommensmail: Betreff, Ueberschrift, Einleitung, Abschluss je
Mandant (Tabelle WelcomeMailTemplate, RLS je Mandant, Migration 20260930150000);
Platzhalter {{name}} {{vorname}} {{benutzername}} {{email}} {{adresse}} {{firma}},
unbekannte -> 400 bzw. Hinweis beim Tippen; Werte escaped, Vorlage reiner Text.
Live-Vorschau per API gerendert, Testmail an die eigene Adresse ohne Token,
Zuruecksetzen auf Standard. Feste Bausteine (Kopf, Zugangsdaten, Anmeldehinweis,
Knoepfe, Fusszeile) bleiben immer drin.
Kopf: Wellenzelle dunkel statt weiss, Streifen 600x40, Inhalt 24 px naeher –
keine weisse Luecke, wenn OWA das CID-Bild nicht zeigt.
Lokal nachgewiesen: Hinweis/Sperre bei {{xyz}}, Speichern, Testmail (Link nur
/login), echte Mail mit eigener Vorlage und 7-Tage-Link.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
41 lines
1.8 KiB
JavaScript
41 lines
1.8 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* render-mail-header.mjs — erzeugt das Kopfbild der Willkommensmail
|
|
* (apps/api/assets/mail/welcome-header.png, 1200x80 fuer hochaufloesende
|
|
* Bildschirme, in der Mail 600x40 angezeigt) aus der daneben liegenden
|
|
* Quelle welcome-header.svg.
|
|
*
|
|
* Warum ein PNG statt Inline-SVG oder CSS-Hintergrund: Outlook (Word-
|
|
* Darstellung) und viele Webmailer zeigen weder SVG noch Hintergrundbilder
|
|
* zuverlaessig an. Das PNG wird als CID-Anhang eingebettet (MailService),
|
|
* die Mail laedt also nichts von aussen nach.
|
|
*
|
|
* Das PNG liegt fertig im Repo; dieses Skript ist nur noetig, wenn die SVG
|
|
* geaendert wird. Kein neues Paket: `sharp` ist ueber Next.js (apps/web)
|
|
* bereits installiert und wird von dort aufgeloest. Der Schriftzug wird
|
|
* mit den Systemschriften des erzeugenden Rechners gesetzt (fontconfig:
|
|
* Segoe UI, Inter, Noto Sans, DejaVu Sans — die erste vorhandene gewinnt).
|
|
*
|
|
* Aufruf (Repo-Wurzel): node apps/api/scripts/render-mail-header.mjs
|
|
*/
|
|
import { readFileSync, writeFileSync } from 'node:fs';
|
|
import { createRequire } from 'node:module';
|
|
import { dirname, join } from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
|
|
const here = dirname(fileURLToPath(import.meta.url));
|
|
const assetDir = join(here, '..', 'assets', 'mail');
|
|
const webDir = join(here, '..', '..', 'web');
|
|
|
|
const require = createRequire(import.meta.url);
|
|
const nextPkg = require.resolve('next/package.json', { paths: [webDir] });
|
|
const sharp = createRequire(nextPkg)('sharp');
|
|
|
|
const svg = readFileSync(join(assetDir, 'welcome-header.svg'));
|
|
const png = await sharp(svg, { density: 72 })
|
|
.resize(1200, 80)
|
|
.png({ compressionLevel: 9, palette: false })
|
|
.toBuffer();
|
|
writeFileSync(join(assetDir, 'welcome-header.png'), png);
|
|
console.log(`welcome-header.png geschrieben (${png.length} Bytes)`);
|