E-Mail-Versand – Systembeschreibung
Die zwei Modi des zentralen Versandformulars, Prüfreihenfolge, eingereihter, sofortiger und geplanter Versand, Anhang-Upload, Hintergrundaufgaben und Berechtigungsschlüssel.
Überblick
Das Versandformular arbeitet in zwei Modi: modulgebunden (aus einer Zeilenaktion mit Modul- und Objekt-ID) und frei (E-Mail → E-Mail senden). Jeder Versand läuft über den zentralen Weg Dlbtmail::dispatch(); einen modulspezifischen Versand gibt es nicht. Die Tabellennamen tragen in der Datenbank das eigene Präfix der Installation.
Datenmodell
| Tabelle | Rolle |
|---|---|
email_message | Protokollzeile der gesendeten E-Mail |
mail_log_item | ein Eintrag je Empfänger |
mail_attachment | Anhänge der E-Mail (Verweis auf die Dokumentenzentrale) |
cron_queue | der eingereihte Versandauftrag |
mail_template, mail_template_description, mail_channel | Vorlage und Kanal (lesend) |
Formular und Suchhilfen
- Die Vorlagenliste liefert
templatesFor: im Modulmodus nur die Vorlagen des Moduls, im freien Modus nur freie Vorlagen. Der Mandantenbereich der Vorlage wird geprüft (error_template_scope). search: Empfängersuche (Benutzer, Personen, Firmen);docsearch: Suche in der Dokumentenzentrale mit Inhaltsfilter, verlangt zusätzlichdocument/document::list;preview: rendert die Vorlage mit den Modulvariablen (collectVars,mailVars()des Eigentümermoduls). Eigentümermodule:nav/taxaccount,finance/settlement,nav/ifa.resolveChannelermittelt den Kanal aus dem Mandanten.
Versand (mail/send.dispatch)
- Betreff und Text Pflicht (übermittelte Entitäten dekodiert).
- Empfänger normalisiert (
normalizeAddress); eine ungültige Adresse wird namentlich gemeldet. Gruppenempfänger mit Inhaltsfilter aufgelöst (resolveGroup). Im Papiermodus ist kein Empfänger nötig. - Art:
transactionalodernewsletter. - Modus: standardmäßig eingereiht (stornierbar);
immediatenur mitmail/send::immediate, sonst mit Protokolleintrag eingereiht. - Geplanter Zeitpunkt: gültiges Datum, nicht in der Vergangenheit (1 Minute Toleranz).
- Erzeugte Anhänge: Pläne des Eigentümermoduls (
generatePlans); war ein Plan möglich, kam aber keiner, gibt es einen Fehler. - Anhänge nach Inhaltsbereich gefiltert (
docIdsInScope), danndlbtmail->dispatch(). Die Bibliothek bedient die Anbieter gmail, ms365, smtp und mail, die Sperrliste und den Abmeldelink.
Anhang-Upload
mail/send.upload legt die Datei über den gemeinsamen Weg Dlbtdocstore::addDocument() mit Objekttyp in der Dokumentenzentrale des Mandanten ab. Ein leerer POST führt zum Fehler post_max_size; eine fehlende Speicherregel wird gemeldet. Berechtigung: canAction(upload); der Mandant muss im Inhaltsbereich liegen (error_upload_client).
Hintergrundaufgaben
mail_message: einmaliger Job, beim Einreihen erzeugt; sendet auspayload_jsonder Protokollzeile (Dlbtmail::runQueued). Eine stornierte Zeile wird nicht gesendet; Wiederholungen nach Versuchszahl und Wartezeit des Kanals.mail_sweep: global, alle fünf Minuten, selbsterhaltend (catalog/controller/mail/batch::processSweepForCronqueue); startet E-Mails mit verlorenem Warteschlangeneintrag oder hängende (releaseStuck) anhand des Protokolls neu (dueQueuedIds).
Berechtigungen
- Freie E-Mail:
maySend('')=canAction(mail/send, send); das Formular verlangtcanAction(send, list)undmaySend(module). - Modulgebundene E-Mail:
canAction(<modul>, sendmail);editschließt das nicht ein. immediateunduploadsind eigene Schlüssel;debugsteht nur im Katalog und wird vom Controller nicht geprüft.- Die Schlüssel sind in den Seeds nicht eingestuft; praktisch
UNMAPPED.