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

TabelleRolle
email_messageProtokollzeile der gesendeten E-Mail
mail_log_itemein Eintrag je Empfänger
mail_attachmentAnhänge der E-Mail (Verweis auf die Dokumentenzentrale)
cron_queueder eingereihte Versandauftrag
mail_template, mail_template_description, mail_channelVorlage 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ätzlich document/document::list; preview: rendert die Vorlage mit den Modulvariablen (collectVars, mailVars() des Eigentümermoduls). Eigentümermodule: nav/taxaccount, finance/settlement, nav/ifa.
  • resolveChannel ermittelt den Kanal aus dem Mandanten.

Versand (mail/send.dispatch)

  1. Betreff und Text Pflicht (übermittelte Entitäten dekodiert).
  2. 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.
  3. Art: transactional oder newsletter.
  4. Modus: standardmäßig eingereiht (stornierbar); immediate nur mit mail/send::immediate, sonst mit Protokolleintrag eingereiht.
  5. Geplanter Zeitpunkt: gültiges Datum, nicht in der Vergangenheit (1 Minute Toleranz).
  6. Erzeugte Anhänge: Pläne des Eigentümermoduls (generatePlans); war ein Plan möglich, kam aber keiner, gibt es einen Fehler.
  7. Anhänge nach Inhaltsbereich gefiltert (docIdsInScope), dann dlbtmail->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 aus payload_json der 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 verlangt canAction(send, list) und maySend(module).
  • Modulgebundene E-Mail: canAction(<modul>, sendmail); edit schließt das nicht ein.
  • immediate und upload sind eigene Schlüssel; debug steht nur im Katalog und wird vom Controller nicht geprüft.
  • Die Schlüssel sind in den Seeds nicht eingestuft; praktisch UNMAPPED.