(* _belegversand_setup.scpt – Version 1.4 Rolle dieses Scripts -------------------- Dieses Script hat eine Doppelfunktion: 1. Es prüft, ob relativ zur aktuellen DEVONthink-Datenbank bereits eine gültige Konfiguration für den Belegversand existiert. Falls ja, startet es direkt das Hauptscript _belegversand.scpt. 2. Falls noch keine gültige Konfiguration existiert, führt es die Ersteinrichtung durch: - Belege-Hauptgruppe bestimmen - _config-Struktur anlegen - Konfigurationsdatei schreiben - README-Datei anlegen/aktualisieren - Mailbody-Datei anlegen/aktualisieren - globale /Versendet_Outsider-Gruppe anlegen Zielstruktur in DEVONthink -------------------------- DB-Wurzel ├── Versendet_Outsider │ ├── !Ergebnis │ ├── sentlog_outsiders │ └── sentlog_outsiders.ndjson └── _config ├── belegversand.conf ├── README-Belegversand └── mail_vorlagen └── belegversand Wichtig: -------- Dieses Script ist der eigentliche "Dispatcher" zwischen - Einrichtung - und normalem Versand. Version 1.4: ----------- - MAIL_CC_TO_DEFAULT in Config hinzugefügt - Globale Versendet_Outsider-Gruppe wird automatisch angelegt *) -- Name der DEVONthink-Konfigurationsgruppe. property configGroupName : "_config" -- Name der Konfigurationsdatei. property configRecordName : "belegversand.conf" -- Name des Hilfetext-Records in DEVONthink. property readmeRecordName : "README-Belegversand" -- Name des Unterordners innerhalb von _config, in dem Mail-Vorlagen liegen. property defaultMailBodyFolderName : "mail_vorlagen" -- Name des Standard-Mailbody-Records. property defaultMailBodyRecordName : "belegversand" -- Schlüsselfeld, an dem eine Konfiguration als "gültig" erkannt wird. -- Wenn BELEGE_ROOT_UUID fehlt, gilt die Config als unvollständig. property requiredConfigKey : "BELEGE_ROOT_UUID=" -- Name des eigentlichen Hauptscripts. property mainScriptName : "_belegversand.scpt" -- Versionsinformation für README und Hinweise. property appVersion : "1.4" -- Default-Werte für die Erstkonfiguration. property defaultMailTo : "steuer@name.de" property defaultSubjectPrefix : "Unterlagen" property defaultZipPassword : "" property defaultLogSentGroupName : "Versendet" property defaultSentTagForDocs : "gesendet" property defaultWriteDebugLog : "false" property defaultShowReadme : "true" property defaultDryRunPreviewPath : "/tmp/DT-Belegversand-preview.txt" (* runSiblingScript(scriptFileName) -------------------------------- Lädt und startet ein weiteres Script aus Helpers/scripts/. Parameter: - scriptFileName : Name der Scriptdatei, die gestartet werden soll Verwendung: - bei vorhandener Konfiguration wird das Hauptscript _belegversand.scpt gestartet *) on runSiblingScript(scriptFileName) -- Absolute Basis-Path (Home + fest Installation) set basePath to (do shell script "echo ~") & "/Library/Application Scripts/com.devon-technologies.think/Menu/Belegversand_1-4" set targetPath to basePath & "/Helpers/scripts/" & scriptFileName try set targetAlias to POSIX file targetPath as alias on error display dialog "Hinweis: Scriptdatei nicht gefunden:" & return & targetPath buttons {"OK"} default button "OK" return end try try set loadedScript to load script targetAlias run loadedScript on error errMsg number errNum display dialog "Hinweis: Konnte Script nicht starten:" & return & scriptFileName & return & return & errMsg buttons {"OK"} default button "OK" end try end runSiblingScript (* recordText(theRecord) --------------------- Liest den Textinhalt eines DEVONthink-Records. Versucht zuerst: - plain text und fällt bei Bedarf zurück auf: - content Dieser Handler wird genutzt, um den Inhalt bestehender Config-Dateien zu prüfen bzw. zu lesen. *) on recordText(theRecord) tell application id "DNtp" try set t to plain text of theRecord if t is missing value then set t to "" return t as rich text on error try set t to content of theRecord if t is missing value then set t to "" return t as rich text on error return "" end try end try end tell end recordText (* isGroupByRecord(theRecord) -------------------------- Prüft, ob ein DEVONthink-Record eine Gruppe ist. Wird in der Einrichtung verwendet, um sicherzustellen, dass die Belege-Hauptgruppe wirklich eine Gruppe/Ordnerstruktur ist und nicht versehentlich ein Einzelobjekt wie ein Bild oder PDF. *) on isGroupByRecord(theRecord) tell application id "DNtp" try return ((type of theRecord) is group) on error return false end try end tell end isGroupByRecord (* findChildByName(parentRecord, childName) ---------------------------------------- Sucht innerhalb einer DEVONthink-Gruppe ein direktes Kind mit einem bestimmten Namen. Rückgabe: - den gefundenen Record - oder missing value Verwendung: - _config finden - belegversand.conf finden - README finden - mail_vorlagen finden - Mailbody-Textrecord finden *) on findChildByName(parentRecord, childName) tell application id "DNtp" try set kids to children of parentRecord repeat with i from 1 to count of kids set c to item i of kids if (name of c as rich text) is childName then return c end repeat end try end tell return missing value end findChildByName (* getOrCreateChildGroup(parentRecord, groupName) ---------------------------------------------- Sucht unter parentRecord eine Gruppe groupName. Falls sie nicht existiert, wird sie angelegt. Beispiele: - _config - mail_vorlagen - Versendet_Outsider *) on getOrCreateChildGroup(parentRecord, groupName) set existingGroup to my findChildByName(parentRecord, groupName) if existingGroup is not missing value then return existingGroup tell application id "DNtp" return create record with {name:groupName, type:group} in parentRecord end tell end getOrCreateChildGroup (* getOrCreateTextRecord(parentRecord, recordName, initialText) ------------------------------------------------------------ Sucht unter parentRecord einen Textrecord mit gegebenem Namen. Falls er nicht existiert, wird er mit initialText angelegt. Verwendung: - belegversand.conf - Mailbody-Datei *) on getOrCreateTextRecord(parentRecord, recordName, initialText) set existingRecord to my findChildByName(parentRecord, recordName) if existingRecord is not missing value then return existingRecord tell application id "DNtp" return create record with {name:recordName, type:txt, content:initialText} in parentRecord end tell end getOrCreateTextRecord (* getOrCreateMarkdownRecord(parentRecord, recordName, initialText) ---------------------------------------------------------------- Wie getOrCreateTextRecord, aber für Markdown-Records. Verwendung: - README-Belegversand *) on getOrCreateMarkdownRecord(parentRecord, recordName, initialText) set existingRecord to my findChildByName(parentRecord, recordName) if existingRecord is not missing value then return existingRecord tell application id "DNtp" return create record with {name:recordName, type:markdown, content:initialText} in parentRecord end tell end getOrCreateMarkdownRecord (* buildConfigText(...) -------------------- Baut den vollständigen Inhalt der Konfigurationsdatei belegversand.conf. Aufbau: - zuerst die für User relativ ungefährlichen / vorgesehenen Einstellungen - dann ein erklärender Hinweisblock - darunter die technischen Werte, die vom Script geschrieben werden und möglichst nicht manuell verändert werden sollten Wichtig: -------- Die Konfigurationsdatei ist bewusst als einfacher key=value-Text aufgebaut. Die Parser im Hauptscript lesen nur Zeilen, die wirklich mit KEY= beginnen. Freie Kommentar- oder Trennerzeilen sind daher unproblematisch. *) on buildConfigText(mailToDefault, mailCcToDefault, subjectPrefix, zipPasswordDefault, logSentGroupName, belegeRootUUID, writeDebugLogValue, showReadmeValue, readmeUUID, mailBodyFolderName, mailBodyRecordName, sentTagForDocs, dryRunPreviewPath) return "## Benutzer-Einstellungen - bitte individuell anpassen." & return & ¬ "## Eine Kurz-Doku findest du in der Datei README-Belegversand.md" & return & return & ¬ "MAIL_TO_DEFAULT=" & mailToDefault & return & ¬ "MAIL_CC_TO_DEFAULT=" & mailCcToDefault & return & ¬ "MAIL_SUBJECT_PREFIX=" & subjectPrefix & return & ¬ "ZIP_PASSWORD_DEFAULT=" & zipPasswordDefault & return & ¬ "LOG_SENT_GROUP_NAME=" & logSentGroupName & return & ¬ "WRITE_DEBUG_LOG=" & writeDebugLogValue & return & ¬ "SHOW_README=" & showReadmeValue & return & ¬ "MAILBODY_FOLDER_NAME=" & mailBodyFolderName & return & ¬ "MAILBODY_RECORD_NAME=" & mailBodyRecordName & return & ¬ "SENT_TAG_FOR_DOCS=" & sentTagForDocs & return & ¬ "PATH_TO_DRYRUN_PREVIEW=" & dryRunPreviewPath & return & return & ¬ "## Die folgenden Werte werden von der Software geschrieben." & return & ¬ "## Bitte nur manuell editieren, wenn du weisst, was du tust!" & return & return & ¬ "BELEGE_ROOT_UUID=" & belegeRootUUID & return & ¬ "README_UUID=" & readmeUUID & return end buildConfigText (* buildReadmeText() ----------------- Erzeugt den Inhalt der internen README-Datei in DEVONthink. *) on buildReadmeText() return "# README – Belegversand" & return & return & ¬ "## Version" & return & return & ¬ "Diese Installation verwendet Belegversand Version " & appVersion & "." & return & return & ¬ "## Beteiligte Dateien" & return & return & ¬ "- START.scpt – Einstiegspunkt" & return & ¬ "- Helpers/scripts/_belegversand_setup.scpt – Einrichtung und Weiterleitung" & return & ¬ "- Helpers/scripts/_belegversand.scpt – eigentlicher Versand" & return & ¬ "- Helpers/show_mail_templates.scpt – Mail-Vorlagen-Auswahl" & return & ¬ "- _config/belegversand.conf – Konfigurationsdatei" & return & ¬ "- _config/README-Belegversand – diese Hilfe" & return & ¬ "- _config/mail_vorlagen/belegversand – Standardtext für den Mail-Inhalt" & return & return & ¬ "## Zweck" & return & return & ¬ "Der Belegversand automatisiert den Versand ausgewählter Dokumente aus DEVONthink." & return & return & ¬ "## Ablauf" & return & return & ¬ "1. Dokumente in DEVONthink auswählen" & return & ¬ "2. ZIP-Archiv erstellen" & return & ¬ "3. Mail-Entwurf mit ZIP-Anhang erzeugen" & return & ¬ "4. Dokumente optional mit dem Tag gesendet markieren" & return & ¬ "5. Versand in Logdateien protokollieren" & return & return & ¬ "## Voraussetzungen" & return & return & ¬ "- DEVONthink" & return & ¬ "- Apple Mail" & return & ¬ "- korrekt eingerichtete Konfiguration in _config/belegversand.conf" & return & return & ¬ "## Konfigurationsdatei" & return & return & ¬ "Ort: _config/belegversand.conf" & return & return & ¬ "Wichtige Werte:" & return & ¬ "- MAIL_TO_DEFAULT" & return & ¬ "- MAIL_CC_TO_DEFAULT" & return & ¬ "- MAIL_SUBJECT_PREFIX" & return & ¬ "- ZIP_PASSWORD_DEFAULT" & return & ¬ "- LOG_SENT_GROUP_NAME" & return & ¬ "- BELEGE_ROOT_UUID" & return & ¬ "- WRITE_DEBUG_LOG" & return & ¬ "- SHOW_README" & return & ¬ "- README_UUID" & return & ¬ "- MAILBODY_FOLDER_NAME" & return & ¬ "- MAILBODY_RECORD_NAME" & return & ¬ "- SENT_TAG_FOR_DOCS: Tag für bereits verarbeitete Dokumente" & return & ¬ "- PATH_TO_DRYRUN_PREVIEW: Speicherort für die vollständige Dry-Run-Vorschau" & return & return & ¬ "Wenn LOG_SENT_GROUP_NAME geändert wird, legt das Script die Protokollgruppe künftig mit genau diesem Namen an." & return & ¬ "Ein anderer Wert führt also zu einem anderen Zielordner für die Versandprotokolle." & return & return & ¬ "## Mail-Text" & return & return & ¬ "Alle Werte können später in _config/belegversand.conf angepasst oder überschrieben werden." & return & return & ¬ "## Hinweise zur Benutzung" & return & return & ¬ "- Vor dem Versand die gewünschten Belege in DEVONthink auswählen" & return & ¬ "- Gruppen in der Auswahl werden nicht versendet" & return & ¬ "- Bereits mit gesendet markierte Belege werden übersprungen" & return & ¬ "- Nach Erstellung des Mail-Entwurfs kann entschieden werden, ob die Belege als gesendet markiert werden sollen" & return & return & ¬ "## Logs" & return & return & ¬ "Der Versand wird in DEVONthink in zwei Formaten protokolliert:" & return & ¬ "- NDJSON für technische bzw. maschinelle Weiterverarbeitung" & return & ¬ "- Markdown für eine gut lesbare Übersicht für Menschen" & return & return & ¬ "Für Belege aus Buchungsjahren wird die Gruppe Versendet im jeweiligen Jahresordner angelegt." & return & ¬ "Für Außenseiter-Belege wird die Gruppe Versendet_Outsider direkt unter der DB-Wurzel angelegt." & return & return & ¬ "## Debugging" & return & return & ¬ "Wenn WRITE_DEBUG_LOG=true gesetzt ist, schreibt das Script ein Debug-Log nach:" & return & return & ¬ "/tmp/DT-Belegversand-debug.log" & return end buildReadmeText (* buildDefaultMailBodyText() -------------------------- Erzeugt den Standardtext für die Mailbody-Datei. *) on buildDefaultMailBodyText() return "Sehr geehrte/r Frau/Herr ," & return & return & ¬ "beiliegend erhalten Sie die aktuellen Belege und Quittungen." & return & return & ¬ "Mit freundlichen Grüßen" & return & return & ¬ "Unterschrift" & return end buildDefaultMailBodyText (* getTopParentGroup(theRecord) ---------------------------- Ermittelt die oberste Gruppe der Datenbankstruktur relativ zu einem Record. *) on getTopParentGroup(theRecord) tell application id "DNtp" set currentRecord to theRecord repeat try set p to parents of currentRecord if p is {} then return currentRecord set currentRecord to item 1 of p on error return currentRecord end try end repeat end tell end getTopParentGroup (* findConfigRecordInDBRoot(dbRootRecord) -------------------------------------- Prüft, ob in der gegebenen DB-Wurzel bereits eine gültige Konfiguration existiert. *) on findConfigRecordInDBRoot(dbRootRecord) set configGroupRecord to my findChildByName(dbRootRecord, configGroupName) if configGroupRecord is missing value then return missing value set configRecord to my findChildByName(configGroupRecord, configRecordName) if configRecord is missing value then return missing value set cfgText to my recordText(configRecord) if cfgText does not contain requiredConfigKey then return missing value return configRecord end findConfigRecordInDBRoot (* getCurrentYear() ---------------- Ermittelt das aktuelle Jahr als 4-stelligen String (z.B. "2026"). *) on getCurrentYear() return do shell script "date '+%Y'" end getCurrentYear (* getCurrentMonth() ----------------- Ermittelt den aktuellen Monat als Zahl (1-12). *) on getCurrentMonth() set monthStr to do shell script "date '+%m'" return (monthStr as integer) end getCurrentMonth (* isNovemberOrDecember() ---------------------- Prüft, ob der aktuelle Monat November (11) oder Dezember (12) ist. *) on isNovemberOrDecember() set currentMonth to my getCurrentMonth() return (currentMonth = 11 or currentMonth = 12) end isNovemberOrDecember (* createYearCycleInGroup(parentGroup, yearString) ----------------------------------------------- Erstellt einen Jahresordner (z.B. "2026") unter parentGroup und erzeugt die Monatsordner (01_Januar bis 12_Dezember) darin. *) on createYearCycleInGroup(parentGroup, yearString) set monthNames to {"01_Januar", "02_Februar", "03_März", "04_April", "05_Mai", "06_Juni", "07_Juli", "08_August", "09_September", "10_Oktober", "11_November", "12_Dezember"} tell application id "DNtp" set yearGroupRecord to create record with {name:yearString, type:group} in parentGroup -- Monatsordner erstellen repeat with monthName in monthNames try create record with {name:monthName, type:group} in yearGroupRecord on error -- Falls Ordner bereits existiert, einfach weitermachen end try end repeat -- Versendet-Ordner am Ende hinzufügen try create record with {name:"Versendet", type:group} in yearGroupRecord on error -- Falls Ordner bereits existiert, einfach weitermachen end try -- Provisionsabrechnungen-Ordner hinzufügen try create record with {name:"Provisionsabrechnungen", type:group} in yearGroupRecord on error -- Falls Ordner bereits existiert, einfach weitermachen end try end tell end createYearCycleInGroup (* run --- Haupteinstiegspunkt des Setup-Scripts. *) on run with timeout of 3600 seconds tell application id "DNtp" set sel to selection if sel is {} then display dialog "Bitte zuerst ein Objekt in der gewuenschten DEVONthink-Datenbank auswählen." buttons {"OK"} default button "OK" return end if set selectedRecord to item 1 of sel end tell set dbRootRecord to my getTopParentGroup(selectedRecord) set existingConfigRecord to my findConfigRecordInDBRoot(dbRootRecord) if existingConfigRecord is not missing value then my runSiblingScript(mainScriptName) return end if tell application id "DNtp" set sel to selection if sel is not {} then set selectedRecord to item 1 of sel try set selectedName to name of selectedRecord as rich text on error set selectedName to "" end try try set selectedIsGroup to ((type of selectedRecord) is group) on error set selectedIsGroup to false end try else set selectedName to "" set selectedIsGroup to false end if end tell if selectedIsGroup and selectedName is "Belege" then display dialog "Es wurde noch keine gültige Konfiguration für den Belegversand gefunden." & return & return & "Die Einrichtung wird jetzt mit der bereits ausgewählten Belege-Hauptgruppe gestartet." buttons {"OK"} default button "OK" else display dialog "Es wurde noch keine gültige Konfiguration für den Belegversand gefunden." & return & return & "Bitte jetzt die Belege-Hauptgruppe auswählen und anschließend mit OK fortfahren." buttons {"OK"} default button "OK" end if tell application id "DNtp" set sel to selection if sel is {} then display dialog "Bitte zuerst die Belege-Hauptgruppe in DEVONthink auswählen." buttons {"OK"} default button "OK" return end if if (count of sel) is not 1 then display dialog "Bitte genau eine Gruppe auswählen: die Belege-Hauptgruppe." buttons {"OK"} default button "OK" return end if set belegeRootRecord to item 1 of sel set belegeRootName to name of belegeRootRecord as rich text set belegeRootUUID to uuid of belegeRootRecord as rich text try set belegeRootType to type of belegeRootRecord as rich text on error set belegeRootType to "unbekannt" end try set isRootGroup to my isGroupByRecord(belegeRootRecord) end tell if isRootGroup is false then display dialog "Das ausgewählte Objekt ist keine Gruppe." & return & return & ¬ "Name: " & belegeRootName & return & ¬ "Typ: " & belegeRootType & return & return & ¬ "Bitte den Ordner Belege auswählen, bzw. den Ordner, in dem alle Belege und Quittungen liegen." buttons {"OK"} default button "OK" return end if if belegeRootName is not "Belege" then set confirmChoice to button returned of (display dialog "Die ausgewählte Gruppe heißt nicht Belege, sondern " & belegeRootName & "." & return & return & "Soll diese Gruppe wirklich als Belege-Hauptgruppe in die Config-Datei eingetragen werden?" buttons {"Abbrechen", "Trotzdem verwenden"} default button "Abbrechen") if confirmChoice is "Abbrechen" then return end if set yearCycleChoice to button returned of (display dialog "Soll ein Ordner Belege mit Jahresordner und Monatszyklen angelegt werden?" buttons {"Nein", "Ja"} default button "Ja") set dbRootRecord to my getTopParentGroup(belegeRootRecord) if yearCycleChoice is "Ja" then set existingBelegeGroup to my findChildByName(belegeRootRecord, "Belege") if existingBelegeGroup is missing value then tell application id "DNtp" set belageGroup to create record with {name:"Belege", type:group} in belegeRootRecord set belegeRootUUID to uuid of belageGroup as rich text end tell else tell application id "DNtp" set belegeRootUUID to uuid of existingBelegeGroup as rich text end tell end if set currentYear to my getCurrentYear() tell application id "DNtp" set belageGroup to my findChildByName(belegeRootRecord, "Belege") end tell my createYearCycleInGroup(belageGroup, currentYear) if my isNovemberOrDecember() then set nextYear to (currentYear as integer) + 1 my createYearCycleInGroup(belageGroup, (nextYear as text)) end if end if tell application id "DNtp" set dbRootName to name of dbRootRecord as rich text end tell set mailToDefault to text returned of (display dialog "Standard-Empfängeradresse:" default answer defaultMailTo) set mailCcToDefault to text returned of (display dialog "Standard-CC-Adresse (optional):" default answer "") set subjectPrefix to text returned of (display dialog "Standard-Betreff-Präfix:" default answer defaultSubjectPrefix) set zipPasswordDefault to text returned of (display dialog "Standard-ZIP-Passwort (optional):" default answer defaultZipPassword with hidden answer) set logSentGroupName to text returned of (display dialog "Name der Versand-Loggruppe:" default answer defaultLogSentGroupName) set dbgChoice to button returned of (display dialog "Debug-Logging standardmäßig aktivieren?" buttons {"Nein", "Ja"} default button "Nein") if dbgChoice is "Ja" then set writeDebugLogValue to "true" else set writeDebugLogValue to "false" end if set showReadmeValue to defaultShowReadme set mailBodyFolderName to defaultMailBodyFolderName set mailBodyRecordName to defaultMailBodyRecordName set sentTagForDocs to defaultSentTagForDocs set dryRunPreviewPath to defaultDryRunPreviewPath set configGroupRecord to my getOrCreateChildGroup(dbRootRecord, configGroupName) set readmeRecord to my getOrCreateMarkdownRecord(configGroupRecord, readmeRecordName, my buildReadmeText()) set mailBodyFolderRecord to my getOrCreateChildGroup(configGroupRecord, mailBodyFolderName) set mailBodyRecord to my getOrCreateTextRecord(mailBodyFolderRecord, mailBodyRecordName, my buildDefaultMailBodyText()) set outsiderLogGroupRecord to my getOrCreateChildGroup(dbRootRecord, "Versendet_Outsider") tell application id "DNtp" set readmeUUID to uuid of readmeRecord as rich text set outsiderLogGroupUUID to uuid of outsiderLogGroupRecord as rich text end tell set configRecord to my getOrCreateTextRecord(configGroupRecord, configRecordName, "") set configText to my buildConfigText(mailToDefault, mailCcToDefault, subjectPrefix, zipPasswordDefault, logSentGroupName, belegeRootUUID, writeDebugLogValue, showReadmeValue, readmeUUID, mailBodyFolderName, mailBodyRecordName, sentTagForDocs, dryRunPreviewPath) tell application id "DNtp" try set content of configRecord to configText on error set plain text of configRecord to configText end try try set content of readmeRecord to my buildReadmeText() on error set plain text of readmeRecord to my buildReadmeText() end try try set content of mailBodyRecord to my buildDefaultMailBodyText() on error set plain text of mailBodyRecord to my buildDefaultMailBodyText() end try set configUUID to uuid of configRecord as rich text set configGroupUUID to uuid of configGroupRecord as rich text set mailBodyFolderUUID to uuid of mailBodyFolderRecord as rich text set mailBodyUUID to uuid of mailBodyRecord as rich text end tell if writeDebugLogValue is "true" then set debugInfoText to return & return & "Debug-Log: /tmp/DT-Belegversand-debug.log" else set debugInfoText to "" end if display dialog "Belegversand wurde eingerichtet." & return & return & ¬ "Datenbank-Wurzel: " & dbRootName & return & ¬ "Belege-Gruppe: " & belegeRootName & return & ¬ "BELEGE_ROOT_UUID: " & belegeRootUUID & return & return & ¬ "Config-Gruppe: " & configGroupName & return & ¬ "CONFIG_GROUP_UUID: " & configGroupUUID & return & ¬ "Config-Datei: " & configRecordName & return & ¬ "CONFIG_RECORD_UUID: " & configUUID & return & return & ¬ "README-Datei: " & readmeRecordName & return & ¬ "README_UUID: " & readmeUUID & return & return & ¬ "Mailbody-Ordner: " & mailBodyFolderName & return & ¬ "MAILBODY_FOLDER_UUID: " & mailBodyFolderUUID & return & return & ¬ "Mailbody-Datei: " & mailBodyRecordName & return & ¬ "MAILBODY_UUID: " & mailBodyUUID & return & return & ¬ "Globale Log-Gruppe (Outsider): Versendet_Outsider" & return & ¬ "OUTSIDER_LOG_UUID: " & outsiderLogGroupUUID & debugInfoText buttons {"OK"} default button "OK" end timeout end run