From 6343e06db522f5b636c0bb4634103bc640a78f92 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Wed, 28 Oct 2026 07:54:42 +0000 Subject: [PATCH] Upload via GUI (346 Dateien) --- DeskHub-Webseite/staff/email_addresses.php | 8 +- DeskHub-Webseite/staff/languages.php | 30 ++++++ DeskHub-Webseite/staff/mail_queue.php | 101 +++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 DeskHub-Webseite/staff/mail_queue.php diff --git a/DeskHub-Webseite/staff/email_addresses.php b/DeskHub-Webseite/staff/email_addresses.php index c0a3d45f..deb0952a 100644 --- a/DeskHub-Webseite/staff/email_addresses.php +++ b/DeskHub-Webseite/staff/email_addresses.php @@ -312,7 +312,13 @@ require __DIR__ . '/_header.php'; function sync() { box.style.opacity = on.checked ? '1' : '.5'; box.querySelectorAll('input,select').forEach(function (i) { i.disabled = !on.checked; }); } on.addEventListener('change', sync); sync(); } - toggler('imap_enabled', 'imap-fields'); toggler('smtp_enabled', 'smtp-fields'); + toggler('imap_enabled', 'imap-fields'); toggler('smtp_enabled', 'smtp-fields'); + // Verschlüsselung gewählt: Port passend setzen (nur wenn dort noch ein Standardport steht, eigene Ports bleiben) + var enc = document.getElementById('smtp_encryption'), prt = document.getElementById('smtp_port'); + if (enc && prt) enc.addEventListener('change', function () { + var std = { tls: '587', ssl: '465', none: '25' }; + if (['25', '465', '587', ''].indexOf(String(prt.value).trim()) !== -1) prt.value = std[enc.value] || prt.value; + }); var af = document.getElementById('after_fetch'), ar = document.getElementById('archive-row'); function syncAf() { ar.style.display = af.value === 'archive' ? '' : 'none'; } diff --git a/DeskHub-Webseite/staff/languages.php b/DeskHub-Webseite/staff/languages.php index aa8a2777..46d65cd0 100644 --- a/DeskHub-Webseite/staff/languages.php +++ b/DeskHub-Webseite/staff/languages.php @@ -57,6 +57,36 @@ require __DIR__ . '/_header.php';

Noch kein Sprachpaket aktiv. Installieren Sie zum Beispiel „English“ unter Plugins; dann erscheinen die Flaggen.

+ $c !== 'de')); +$activePlugins = []; +try { $activePlugins = $pdo->query("SELECT slug FROM plugins WHERE is_active = 1 ORDER BY slug")->fetchAll(PDO::FETCH_COLUMN); } catch (Throwable $e) { } +$activePlugins = array_values(array_filter($activePlugins, fn($sl) => !isset($langs) || !in_array($sl, array_column($langs, 'slug'), true))); +?> +
+

Übersetzungen in den Plugins

+

Jedes Plugin kann seine Texte selbst übersetzen: Es legt dazu im Plugin-Ordner lang/<Sprachcode>.json ab (zum Beispiel lang/en.json). Wird eine Sprache gewählt, nutzt DeskHub diese Dateien aller aktiven Plugins zusätzlich zum Sprachpaket; steht ein Text in beiden, gilt der aus dem Sprachpaket. Eine neue Sprache braucht deshalb nur ein Sprachpaket und je Plugin eine Datei.

+ +

Noch kein Sprachpaket aktiv. Installieren Sie zum Beispiel „English“ unter Plugins.

+ +

Es ist kein Plugin aktiv.

+ +
+ + + + + + + + + + +
Plugin ()
keine Datei (Texte aus dem Sprachpaket oder deutsch)✓ Texte
+ +
+

Einstellungen

diff --git a/DeskHub-Webseite/staff/mail_queue.php b/DeskHub-Webseite/staff/mail_queue.php new file mode 100644 index 00000000..1deddbb4 --- /dev/null +++ b/DeskHub-Webseite/staff/mail_queue.php @@ -0,0 +1,101 @@ + 0) $pdo->prepare("UPDATE mail_queue SET status = 'pending', next_attempt_at = ? WHERE id = ? AND status IN ('pending','failed')")->execute([$now, $id]); + else $pdo->prepare("UPDATE mail_queue SET next_attempt_at = ? WHERE status = 'pending'")->execute([$now]); + $r = mail_queue_run($pdo, $id > 0 ? 1 : 50); + flash($r['sent'] > 0 || $r['failed'] === 0 ? 'success' : 'error', $r['sent'] . ' Mail(s) gesendet' . ($r['failed'] > 0 ? ', ' . $r['failed'] . ' weiterhin fehlgeschlagen (Fehler steht in der Liste).' : '.')); + } elseif ($action === 'requeue_failed') { + $pdo->prepare("UPDATE mail_queue SET status = 'pending', attempts = 0, next_attempt_at = ? WHERE status = 'failed'")->execute([db_now()]); + flash('success', 'Aufgegebene Mails werden erneut versucht.'); + } elseif ($action === 'delete' && $id > 0) { + $pdo->prepare('DELETE FROM mail_queue WHERE id = ?')->execute([$id]); + audit_log($admin['id'], "Mail #{$id} aus der Warteschlange gelöscht"); + flash('success', 'Mail gelöscht.'); + } elseif ($action === 'purge') { + $n = $pdo->exec("DELETE FROM mail_queue WHERE status IN ('sent','failed')"); + audit_log($admin['id'], 'Erledigte und aufgegebene Mails aus der Warteschlange gelöscht'); + flash('success', (int) $n . ' Eintrag/Einträge gelöscht.'); + } + } catch (Throwable $e) { + flash('error', 'Aktion nicht möglich: ' . $e->getMessage()); + } + redirect('/staff/mail_queue.php'); +} + +$counts = mail_queue_counts($pdo); +$rows = []; +try { + $rows = $pdo->query("SELECT id, to_email, subject, status, attempts, next_attempt_at, last_error, created_at, sent_at FROM mail_queue ORDER BY (CASE status WHEN 'pending' THEN 0 WHEN 'failed' THEN 1 ELSE 2 END), id DESC LIMIT 200")->fetchAll(); +} catch (Throwable $e) { + $rows = []; +} +$statusLabels = ['pending' => ['Wartet auf nächsten Versuch', 'warning'], 'failed' => ['Aufgegeben', 'danger'], 'sent' => ['Nachträglich gesendet', 'success']]; +$pageTitle = 'Mail-Warteschlange'; +$activePage = 'mail_queue'; +require __DIR__ . '/_header.php'; +?> +

Mail-Warteschlange

+

Scheitert der Mailversand (zum Beispiel weil der SMTP-Server nicht erreichbar ist), merkt sich DeskHub die Mail und versucht es alle paar Minuten erneut: nach 5, 10, 20, 40 Minuten und dann in größeren Abständen, höchstens 10-mal und höchstens 48 Stunden lang. Danach gilt sie als aufgegeben und bleibt hier zum manuellen Nachsenden. Test-Mails kommen nicht in die Warteschlange.

+ +
+
Wartend
+
Aufgegeben
+
Nachträglich gesendet
+
+ + + +
+
+ +
+
+

Mails in der Warteschlange

+
+
+
+
+ +

Die Warteschlange ist leer. Alle Mails sind rausgegangen.

+ +
+ + + + + + + + + + + + + + +
StatusEmpfängerBetreffVersucheNächster VersuchLetzter Fehler
seit
+ +
+ +
+
+ = 200): ?>

Es werden die ersten 200 Einträge angezeigt.

+ +
+