| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /tmp/sc/ |
Upload File : |
<?php
/* Smarty version 3.1.30, created on 2026-06-27 05:56:50
from "/var/www/clients/client1/web17/web/includes/templates/templates/mailing.tpl" */
/* @var Smarty_Internal_Template $_smarty_tpl */
if ($_smarty_tpl->_decodeProperties($_smarty_tpl, array (
'version' => '3.1.30',
'unifunc' => 'content_6a3f4a0287c977_06607233',
'has_nocache_code' => false,
'file_dependency' =>
array (
'63744812b7147d97c24ea222378826dff9bb2cc7' =>
array (
0 => '/var/www/clients/client1/web17/web/includes/templates/templates/mailing.tpl',
1 => 1782413489,
2 => 'file',
),
),
'includes' =>
array (
),
),false)) {
function content_6a3f4a0287c977_06607233 (Smarty_Internal_Template $_smarty_tpl) {
?>
<link rel="stylesheet" href="<?php echo @constant('SITE_URL');?>
/assets/css/cockpit.css?v=<?php echo filemtime((@constant('PATH_SYSTEM')).('/assets/css/cockpit.css'));?>
">
<div class="page-header">
<div class="page-pretitle">System</div>
<h1 class="h3 mb-0">Mailing</h1>
<div class="text-muted small mt-1">E-Mail-Templates verwalten, Vorschau und Testversand. SMTP & Header/Footer unter Einstellungen → E-Mail.</div>
</div>
<ul class="nav nav-tabs mb-3" role="tablist">
<li class="nav-item"><button class="nav-link active" data-bs-toggle="tab" data-bs-target="#ml-templates" type="button" role="tab">Templates</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#ml-rules" type="button" role="tab">Regeln</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#ml-queue" type="button" role="tab">Versand</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#ml-newsletter" type="button" role="tab">Newsletter</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#ml-lists" type="button" role="tab">Listen</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#ml-accounts" type="button" role="tab">E-Mail-Konten</button></li>
<li class="nav-item"><button class="nav-link" data-bs-toggle="tab" data-bs-target="#ml-settings" type="button" role="tab">Einstellungen</button></li>
</ul>
<div class="tab-content">
<div class="tab-pane fade show active" id="ml-templates" role="tabpanel">
<div class="d-flex justify-content-end mb-3">
<button class="btn btn-primary" id="mlAddBtn"><i class="material-icons sm">add</i> Template anlegen</button>
</div>
<div class="card"><div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead><tr><th>Name</th><th>Schlüssel</th><th>Betreff</th><th>Typ</th><th>Status</th><th></th></tr></thead>
<tbody id="mlBody"><tr><td colspan="6" class="text-center text-muted py-4">Wird geladen …</td></tr></tbody>
</table>
</div></div>
</div>
<div class="tab-pane fade" id="ml-rules" role="tabpanel">
<div class="d-flex justify-content-between align-items-center mb-3">
<div class="text-muted small">Regeln entscheiden, welches Template bei welchem Auslöser gesendet wird – mit mehreren Filtern (UND/ODER).</div>
<button class="btn btn-primary" id="rlAddBtn"><i class="material-icons sm">add</i> Regel anlegen</button>
</div>
<div class="card"><div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead><tr><th>Name</th><th>Auslöser</th><th>Template</th><th>Filter</th><th>Status</th><th></th></tr></thead>
<tbody id="rlBody"><tr><td colspan="6" class="text-center text-muted py-4">Wird geladen …</td></tr></tbody>
</table>
</div></div>
</div>
<div class="tab-pane fade" id="ml-queue" role="tabpanel">
<div class="row g-3 mb-3">
<div class="col-6 col-md-3"><div class="card h-100"><div class="stat"><div class="stat-icon yellow"><i class="material-icons">schedule</i></div><div class="stat-content"><div class="stat-label">In Queue</div><div class="stat-value-row"><span class="stat-value" id="qStatQueued">–</span></div></div></div></div></div>
<div class="col-6 col-md-3"><div class="card h-100"><div class="stat"><div class="stat-icon green"><i class="material-icons">check_circle</i></div><div class="stat-content"><div class="stat-label">Gesendet (System + Newsletter)</div><div class="stat-value-row"><span class="stat-value" id="qStatSent">–</span></div></div></div></div></div>
<div class="col-6 col-md-3"><div class="card h-100"><div class="stat"><div class="stat-icon red"><i class="material-icons">error</i></div><div class="stat-content"><div class="stat-label">Fehlgeschlagen</div><div class="stat-value-row"><span class="stat-value" id="qStatFailed">–</span></div></div></div></div></div>
<div class="col-6 col-md-3 d-flex align-items-center"><button class="btn btn-primary w-100" id="qProcess"><i class="material-icons sm">send</i> Queue verarbeiten</button></div>
</div>
<div class="alert alert-info small" id="qTransportNote"></div>
<div class="card"><div class="card-header d-flex justify-content-between align-items-center">
<span class="fw-bold">Warteschlange & Fehlversuche</span>
<span class="d-flex gap-2">
<button class="btn btn-sm btn-outline-secondary" id="qClearFailed"><i class="material-icons sm">delete_sweep</i> Fehlgeschlagene löschen</button>
<button class="btn btn-sm btn-outline-danger" id="qClearAll"><i class="material-icons sm">delete_forever</i> Alle löschen</button>
</span>
</div><div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead><tr><th>Zeit</th><th>Empfänger</th><th>Betreff</th><th>Status</th><th>Fehler</th><th class="text-end">Aktion</th></tr></thead>
<tbody id="qBody"><tr><td colspan="6" class="text-center text-muted py-4">Wird geladen …</td></tr></tbody>
</table>
</div></div>
<div class="card mt-3"><div class="card-header d-flex justify-content-between align-items-center">
<span class="fw-bold">Zuletzt versendet</span>
<span class="d-flex align-items-center gap-2">
<span class="text-muted small">letzte 50</span>
<button class="btn btn-sm btn-outline-secondary" id="sentReload"><i class="material-icons sm">refresh</i></button>
</span>
</div><div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead><tr><th>Zeit</th><th>Empfänger</th><th>Betreff</th><th class="text-center">Geöffnet</th><th class="text-end">Aktion</th></tr></thead>
<tbody id="sentBody"><tr><td colspan="5" class="text-center text-muted py-4">Wird geladen …</td></tr></tbody>
</table>
</div></div>
</div>
<div class="tab-pane fade" id="ml-newsletter" role="tabpanel">
<div class="d-flex justify-content-between align-items-center mb-3">
<div class="text-muted small">Newsletter nur an Kunden mit Einwilligung – Abmeldungen werden automatisch berücksichtigt.</div>
<button class="btn btn-primary" id="cpAddBtn"><i class="material-icons sm">add</i> Kampagne anlegen</button>
</div>
<div class="card"><div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead><tr><th>Name</th><th>Betreff</th><th>Status</th><th class="text-end">Empfänger</th><th class="text-end">Gesendet</th><th class="text-end">Fehler</th><th></th></tr></thead>
<tbody id="cpBody"><tr><td colspan="7" class="text-center text-muted py-4">Wird geladen …</td></tr></tbody>
</table>
</div></div>
</div>
<div class="tab-pane fade" id="ml-lists" role="tabpanel">
<div class="d-flex justify-content-between align-items-center mb-3">
<div class="text-muted small">Eigene Empfänger-Listen (z. B. Reisebüros, Ausschreibungen). Als Zielgruppe in Newsletter-Kampagnen wählbar.</div>
<button class="btn btn-primary" id="lsAddBtn"><i class="material-icons sm">add</i> Liste anlegen</button>
</div>
<div class="card"><div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead><tr><th>Name</th><th class="text-end">Einträge</th><th></th></tr></thead>
<tbody id="lsBody"><tr><td colspan="3" class="text-center text-muted py-4">Wird geladen …</td></tr></tbody>
</table>
</div></div>
</div>
<div class="tab-pane fade" id="ml-settings" role="tabpanel">
<form id="mlSettingsForm" autocomplete="off">
<input type="hidden" name="mailingform" value="1">
<div class="card mb-3">
<div class="card-header d-flex justify-content-between align-items-center">
<span class="fw-bold">Universeller Header & Footer (HTML)</span>
<button type="submit" class="btn btn-sm btn-primary"><i class="material-icons sm">save</i> Speichern</button>
</div>
<div class="card-body">
<div class="text-muted small mb-2">Wird um den Template-Inhalt gelegt (sofern Template „Layout verwenden" aktiv hat). Platzhalter wie <code>[link_unsubscribe]</code> sind erlaubt. Leer = Standard.</div>
<div class="mb-3"><label class="form-label">Header</label><textarea class="form-control" name="header" id="mls-header" rows="5" style="font-family:monospace;font-size:12px;"></textarea></div>
<div class="mb-3"><label class="form-label">Footer</label><textarea class="form-control" name="footer" id="mls-footer" rows="5" style="font-family:monospace;font-size:12px;"></textarea></div>
<div class="row g-3">
<div class="col-12 col-md-6"><label class="form-label">Navigations-Link <code>[navigation_link]</code> – ohne Valet</label><input class="form-control" name="nav_map" id="mls-nav-map" placeholder="https://map.pacim.de"></div>
<div class="col-12 col-md-6"><label class="form-label">Navigations-Link – mit Valet</label><input class="form-control" name="nav_valet" id="mls-nav-valet" placeholder="https://valet.pacim.de"></div>
<div class="col-12 col-md-6"><label class="form-label">Anreiseanschrift <code>[navigation_address]</code> – ohne Valet</label><input class="form-control" name="nav_addr_map" id="mls-nav-addr-map" placeholder="An der Werft 3, 18119 Warnemünde"></div>
<div class="col-12 col-md-6"><label class="form-label">Anreiseanschrift – mit Valet</label><input class="form-control" name="nav_addr_valet" id="mls-nav-addr-valet" placeholder="Am Passagierkai 3, 18119 Warnemünde"></div>
</div>
<div class="js-status small mt-2" id="mls-status"></div>
</div>
</div>
</form>
</div>
<div class="tab-pane fade" id="ml-accounts" role="tabpanel">
<div class="d-flex justify-content-between align-items-center mb-3">
<div class="text-muted small">Eigene Absender-Konten (SMTP). Je Regel und Newsletter wählbar; „Standard" nutzt die globale SMTP-Konfiguration (Einstellungen → E-Mail).</div>
<button type="button" class="btn btn-primary" id="acAddBtn"><i class="material-icons sm">add</i> Konto anlegen</button>
</div>
<div class="card"><div class="table-responsive">
<table class="table table-hover align-middle mb-0">
<thead><tr><th>Name</th><th>Absender</th><th>Host</th><th>Status</th><th></th></tr></thead>
<tbody id="acBody"><tr><td colspan="5" class="text-center text-muted py-3">Wird geladen …</td></tr></tbody>
</table>
</div></div>
</div>
</div>
<div class="modal fade" id="cpModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-centered">
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title" id="cpTitle">Kampagne</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
<form id="cpForm" autocomplete="off">
<div class="modal-body">
<input type="hidden" name="id" id="cpId">
<div class="row g-3">
<div class="col-12 col-md-4"><label class="form-label">Name *</label><input class="form-control" name="name" id="cpName" required></div>
<div class="col-12 col-md-4"><label class="form-label">Betreff</label><input class="form-control" name="subject" id="cpSubject"></div>
<div class="col-12 col-md-4"><label class="form-label">Empfänger</label><select class="form-select" name="audience" id="cpAudience"></select></div>
<div class="col-12 col-md-4"><label class="form-label">Absender-Konto</label><select class="form-select" name="account" id="cpAccount"></select></div>
<div class="col-12"><label class="form-label">Inhalt (HTML)</label><textarea class="form-control" name="content" id="cpContent" rows="9" style="font-family:monospace;font-size:12px;"></textarea>
<div class="text-muted small mt-1">Platzhalter: <code>[salutation]</code> <code>[name]</code> <code>[customer_firstname]</code> <code>[link_unsubscribe]</code>. Header/Footer-Layout wird automatisch angewendet.</div>
</div>
<div class="col-12 col-md-6"><label class="form-label">Versand planen (optional)</label><input class="form-control" type="datetime-local" name="scheduled" id="cpScheduled"><div class="form-text">leer = sofort nach „Senden". Vor diesem Zeitpunkt wird nicht versendet.</div></div>
<div class="col-12 col-md-6"><label class="form-label">Dateianhänge</label>
<ul class="list-group list-group-flush mb-2" id="cpAttList"></ul>
<div class="d-flex flex-wrap align-items-center gap-2">
<input type="file" class="form-control form-control-sm" id="cpAttFile" style="max-width:260px;">
<button type="button" class="btn btn-sm btn-primary" id="cpAttUpload"><i class="material-icons sm">upload</i> Hochladen</button>
<span class="small" id="cpAttMsg"></span>
</div>
</div>
</div>
<hr>
<div class="d-flex align-items-center gap-3 mb-2">
<span class="fw-semibold" id="cpFilterLabel">Empfänger-Filter</span>
<div class="d-flex align-items-center gap-3" id="cpFilterControls">
<div class="btn-group btn-group-sm" role="group">
<input type="radio" class="btn-check" name="cplogic" id="cpLogicAnd" value="and" checked><label class="btn btn-outline-secondary" for="cpLogicAnd">alle (UND)</label>
<input type="radio" class="btn-check" name="cplogic" id="cpLogicOr" value="or"><label class="btn btn-outline-secondary" for="cpLogicOr">eine (ODER)</label>
</div>
<button type="button" class="btn btn-sm btn-light border" id="cpAddFilter"><i class="material-icons sm">add</i> Filter</button>
</div>
<span class="ms-auto badge bg-primary" id="cpCount" title="passende Empfänger">– Empfänger</span>
</div>
<div id="cpFilters"></div>
<div class="text-muted small mt-1" id="cpFilterNote">Keine Filter = alle Kunden mit Newsletter-Einwilligung.</div>
<div class="js-status small mt-2" id="cpFormMsg"></div>
</div>
<div class="modal-footer flex-wrap">
<button type="button" class="btn btn-light text-danger me-auto d-none" id="cpDeleteBtn"><i class="material-icons sm">delete</i> Löschen</button>
<div class="d-flex align-items-center gap-2 flex-wrap">
<input class="form-control form-control-sm" id="cpTestTo" type="email" style="width:190px;" placeholder="Testmail an …">
<button type="button" class="btn btn-light border btn-sm" id="cpTestBtn">Test</button>
<button type="button" class="btn btn-outline-primary btn-sm" id="cpFreezeBtn"><i class="material-icons sm">groups</i> Empfänger einfrieren</button>
<button type="button" class="btn btn-success btn-sm" id="cpSendBtn"><i class="material-icons sm">send</i> Senden</button>
<button class="btn btn-primary btn-sm" type="submit"><i class="material-icons sm">save</i> Speichern</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="mlEditModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-centered">
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title" id="mlEditTitle">Template</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
<form id="mlForm" autocomplete="off">
<div class="modal-body">
<input type="hidden" name="id" id="mlId">
<div class="row g-3">
<div class="col-12 col-md-5"><label class="form-label">Name *</label><input class="form-control" name="name" id="mlName" required></div>
<div class="col-12 col-md-4"><label class="form-label">Schlüssel (key)</label><input class="form-control" name="key" id="mlKey" placeholder="z. B. booking_confirmation"></div>
<div class="col-6 col-md-3"><label class="form-label">Typ</label>
<select class="form-select" name="type" id="mlType"><option value="system">System</option><option value="newsletter">Newsletter</option><option value="both">Beides</option></select>
</div>
<div class="col-12"><label class="form-label">Betreff</label><input class="form-control" name="subject" id="mlSubject"></div>
<div class="col-12 col-lg-8">
<div class="d-flex justify-content-between align-items-center mb-1">
<label class="form-label mb-0">Inhalt</label>
<button type="button" class="btn btn-sm btn-light border" id="mlToggleSrc"><i class="material-icons sm">code</i> <span>HTML-Quelltext</span></button>
</div>
<textarea class="form-control" name="content" id="mlContent" rows="14" style="font-family:monospace;font-size:12px;"></textarea>
</div>
<div class="col-12 col-lg-4">
<label class="form-label d-flex align-items-center justify-content-between">Platzhalter
<span class="text-muted small fw-normal">klicken = einfügen</span></label>
<select class="form-select form-select-sm mb-2" id="mlPhCat" aria-label="Platzhalter-Kategorie"></select>
<div id="mlPlaceholders" class="ml-ph-wrap"></div>
<div class="small mt-1" id="mlPhCopied" style="height:16px;color:#2e9e4f;"></div>
</div>
<div class="col-12">
<hr class="my-1">
<div class="d-flex flex-wrap align-items-center gap-2 mb-1">
<label class="form-label mb-0">Text-Version (Plain-Text)</label>
<select class="form-select form-select-sm" id="mlPlainMode" style="width:auto;">
<option value="auto">Automatisch aus HTML erzeugen</option>
<option value="custom">Eigener Text</option>
</select>
<button type="button" class="btn btn-sm btn-light border d-none" id="mlPlainFromHtml" title="Aktuellen HTML-Inhalt als Text übernehmen"><i class="material-icons sm">sync</i> Aus HTML erzeugen</button>
<span class="text-muted small">Wird für Empfänger ohne HTML-Darstellung verwendet (multipart).</span>
</div>
<textarea class="form-control d-none" name="plain" id="mlPlain" rows="8" style="font-family:monospace;font-size:12px;" placeholder="Reiner Text der E-Mail …"></textarea>
<div class="form-text d-none" id="mlPlainAutoHint">Der Text wird beim Versand automatisch aus dem HTML-Inhalt generiert.</div>
</div>
<div class="col-12 d-flex gap-4 flex-wrap">
<label class="form-check d-flex align-items-center gap-2"><input class="form-check-input" type="checkbox" name="layout" id="mlLayout" value="1" checked> <span>Header/Footer-Layout verwenden</span></label>
<label class="form-check d-flex align-items-center gap-2"><input class="form-check-input" type="checkbox" name="active" id="mlActive" value="1" checked> <span>aktiv</span></label>
<label class="form-check d-flex align-items-center gap-2" title="Erscheint in der Buchungsansicht unter „E-Mail erstellen“"><input class="form-check-input" type="checkbox" name="booking" id="mlBooking" value="1"> <span>In Buchungsansicht anzeigen</span></label>
</div>
<div class="col-12">
<hr class="my-1">
<label class="form-label mb-1">Dateianhänge <span class="text-muted small">(Dokumente je Empfänger, z. B. Buchungsbestätigung/Rechnung)</span></label>
<div id="mlAttHint" class="text-muted small">Bitte das Template zuerst speichern, um Anhänge zu verwalten.</div>
<div id="mlAttBox" class="d-none">
<ul class="list-group list-group-flush mb-2" id="mlAttList"></ul>
<div class="d-flex flex-wrap align-items-end gap-2">
<div><label class="form-label small mb-0">Dokument</label>
<select class="form-select form-select-sm" id="mlAttPreset" style="min-width:220px;"></select>
</div>
<div id="mlAttCustom" class="d-none d-flex gap-2">
<div><label class="form-label small mb-0">Pfad (rel. zu datas/)</label><input class="form-control form-control-sm" id="mlAttPath" placeholder="z. B. booking/[booking_no].pdf"></div>
<div><label class="form-label small mb-0">Dateiname</label><input class="form-control form-control-sm" id="mlAttName" placeholder="[booking_no]-Dokument.pdf"></div>
</div>
<button type="button" class="btn btn-sm btn-light border" id="mlAttAdd"><i class="material-icons sm">attach_file</i> Hinzufügen</button>
<span class="small" id="mlAttMsg"></span>
</div>
<div class="d-flex flex-wrap align-items-center gap-2 mt-2 pt-2 border-top">
<label class="form-label small mb-0">Datei hochladen</label>
<input type="file" class="form-control form-control-sm" id="mlAttFile" style="max-width:320px;">
<button type="button" class="btn btn-sm btn-primary" id="mlAttUpload"><i class="material-icons sm">upload</i> Hochladen & anhängen</button>
<span class="small" id="mlAttUpMsg"></span>
</div>
</div>
</div>
</div>
<div class="js-status small mt-2" id="mlFormMsg"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-light text-danger me-auto d-none" id="mlDeleteBtn"><i class="material-icons sm">delete</i> Löschen</button>
<button type="button" class="btn btn-light" id="mlPreviewBtn"><i class="material-icons sm">visibility</i> Vorschau</button>
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Abbrechen</button>
<button class="btn btn-primary" type="submit"><i class="material-icons sm">save</i> Speichern</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="mlPreviewModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-centered">
<div class="modal-content" style="height:88vh;">
<div class="modal-header">
<h5 class="modal-title">Vorschau: <span id="mlPvSubject" class="fw-normal"></span></h5>
<div class="ms-auto d-flex align-items-center gap-2">
<input class="form-control form-control-sm" id="mlPvInvoice" style="width:150px;" placeholder="Rechnungs-ID (Daten)">
<button type="button" class="btn btn-sm btn-light border" id="mlPvReload">Aktualisieren</button>
<input class="form-control form-control-sm" id="mlPvTo" type="email" style="width:200px;" placeholder="Testmail an …">
<button type="button" class="btn btn-sm btn-primary" id="mlPvSend"><i class="material-icons sm">send</i> Test</button>
<button type="button" class="btn-close ms-1" data-bs-dismiss="modal"></button>
</div>
</div>
<ul class="nav nav-tabs px-3 pt-2" role="tablist" style="flex:0 0 auto;">
<li class="nav-item"><button class="nav-link active" id="mlPvTabHtml" data-bs-toggle="tab" data-bs-target="#mlPvPaneHtml" type="button" role="tab"><i class="material-icons sm" style="vertical-align:-3px;">html</i> HTML</button></li>
<li class="nav-item"><button class="nav-link" id="mlPvTabText" data-bs-toggle="tab" data-bs-target="#mlPvPaneText" type="button" role="tab"><i class="material-icons sm" style="vertical-align:-3px;">notes</i> Text-Version</button></li>
</ul>
<div class="modal-body p-0 tab-content" style="overflow:hidden;flex:1 1 auto;">
<div class="tab-pane fade show active h-100" id="mlPvPaneHtml" role="tabpanel"><iframe id="mlPvFrame" style="width:100%;height:100%;border:0;background:#fff;"></iframe></div>
<div class="tab-pane fade h-100" id="mlPvPaneText" role="tabpanel" style="overflow:auto;"><pre id="mlPvPlain" style="margin:0;padding:16px;white-space:pre-wrap;word-break:break-word;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;line-height:1.5;background:#fff;color:#1e2633;min-height:100%;"></pre></div>
</div>
<div class="px-3 py-1 small" id="mlPvStatus"></div>
</div>
</div>
</div>
<div class="modal fade" id="mlSentModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-centered">
<div class="modal-content" style="height:88vh;">
<div class="modal-header">
<h5 class="modal-title">Versendet: <span id="sentVwSubject" class="fw-normal"></span></h5>
<div class="ms-auto d-flex align-items-center gap-2">
<span class="text-muted small" id="sentVwMeta"></span>
<button type="button" class="btn-close ms-1" data-bs-dismiss="modal"></button>
</div>
</div>
<div class="modal-body p-0" style="overflow:hidden;"><iframe id="sentVwFrame" style="width:100%;height:100%;border:0;background:#fff;"></iframe></div>
</div>
</div>
</div>
<div class="modal fade" id="rlModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title" id="rlTitle">Regel</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
<form id="rlForm" autocomplete="off">
<div class="modal-body">
<input type="hidden" name="id" id="rlId">
<div class="row g-3">
<div class="col-12 col-md-6"><label class="form-label">Name *</label><input class="form-control" name="name" id="rlName" required></div>
<div class="col-12 col-md-6"><label class="form-label">Template *</label><select class="form-select" name="template" id="rlTemplate"></select></div>
<div class="col-12 col-md-6"><label class="form-label">Auslöser *</label><select class="form-select" name="trigger" id="rlTrigger"></select></div>
<div class="col-12 col-md-6"><label class="form-label">Absender-Konto</label><select class="form-select" name="account" id="rlAccount"></select></div>
<div class="col-12 col-md-6" id="rlOffsetWrap" style="display:none;"><label class="form-label">Tage (Versatz)</label><input class="form-control" type="number" min="0" name="offset" id="rlOffset" value="0"><div class="form-text">z. B. „3 Tage vor Anreise" → 3</div></div>
<div class="col-12 col-md-6"><label class="form-label">Empfänger</label>
<select class="form-select" id="rlRecipientMode">
<option value="customer">Eigentlicher Empfänger (Kunde/Partner)</option>
<option value="custom">Eigene E-Mail-Adresse …</option>
</select>
</div>
<div class="col-12 col-md-6 d-none" id="rlRecipientWrap"><label class="form-label">E-Mail-Adresse *</label><input class="form-control" type="email" id="rlRecipient" placeholder="empfaenger@firma.de"><div class="form-text">Mails dieser Regel gehen an diese feste Adresse.</div></div>
<div class="col-12"><label class="form-label">BCC – Blindkopie</label><input class="form-control" id="rlBcc" placeholder="z. B. buchhaltung@firma.de, archiv@firma.de"><div class="form-text">Mehrere Adressen mit Komma trennen. Empfänger sehen die Blindkopien nicht.</div></div>
</div>
<div class="row g-3 mt-0">
<div class="col-12"><label class="form-label mb-1">Versand-Zeitpunkt</label></div>
<div class="col-12 col-md-6" id="rlSendOffsetWrap"><label class="form-label">Versand</label>
<select class="form-select" id="rlSendOffset" name="send_offset">
<option value="0">am Tag des Ereignisses</option>
<option value="1">1 Tag später</option>
<option value="2">2 Tage später</option>
<option value="3">3 Tage später</option>
<option value="5">5 Tage später</option>
<option value="7">7 Tage später</option>
</select>
</div>
<div class="col-12 col-md-6"><label class="form-label">Uhrzeit (vorher nicht senden)</label><input class="form-control" type="time" name="send_time" id="rlSendTime"><div class="form-text">leer = sofort, sobald die Queue läuft</div></div>
</div>
<hr>
<div class="d-flex align-items-center gap-3 mb-2">
<span class="fw-semibold">Filter</span>
<div class="btn-group btn-group-sm" role="group">
<input type="radio" class="btn-check" name="logic" id="rlLogicAnd" value="and" checked><label class="btn btn-outline-secondary" for="rlLogicAnd">alle (UND)</label>
<input type="radio" class="btn-check" name="logic" id="rlLogicOr" value="or"><label class="btn btn-outline-secondary" for="rlLogicOr">eine (ODER)</label>
</div>
<button type="button" class="btn btn-sm btn-light border ms-auto" id="rlAddFilter"><i class="material-icons sm">add</i> Filter</button>
</div>
<div id="rlFilters"></div>
<div class="text-muted small mt-1">Keine Filter = Regel trifft immer zu.</div>
<div class="col-12 mt-3"><label class="form-check d-flex align-items-center gap-2"><input class="form-check-input" type="checkbox" name="active" id="rlActive" value="1" checked> <span>aktiv</span></label></div>
<div class="js-status small mt-2" id="rlFormMsg"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-light text-danger me-auto d-none" id="rlDeleteBtn"><i class="material-icons sm">delete</i> Löschen</button>
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Abbrechen</button>
<button class="btn btn-primary" type="submit"><i class="material-icons sm">save</i> Speichern</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal fade" id="rcModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><i class="material-icons sm align-middle me-1">fact_check</i> Regel-Check <span class="text-muted">·</span> <span id="rcRuleName" class="fw-normal"></span></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<input type="hidden" id="rcRuleId">
<input type="hidden" id="rcTrigger">
<div class="text-muted small mb-2" id="rcHint">Datensätze per Live-Suche hinzufügen – die Beispiel-Mail wird sofort geprüft (greift die Regel? wird eine Mail erzeugt?).</div>
<label class="form-label small fw-semibold mb-1" id="rcSearchLabel">Datensatz suchen & hinzufügen</label>
<div class="rc-search position-relative mb-2">
<div class="input-group">
<span class="input-group-text"><i class="material-icons sm">search</i></span>
<input class="form-control" id="rcSearch" autocomplete="off" placeholder="Name, Buchungs-/Rechnungsnr., Kennzeichen oder Quelle (z. B. AIDA) …">
</div>
<div id="rcSearchResults" class="rc-results d-none"></div>
</div>
<div class="d-flex gap-2 mb-3">
<input class="form-control form-control-sm" id="rcManual" autocomplete="off" placeholder="oder Rechnungs-IDs direkt: 12345, 12346">
<button class="btn btn-sm btn-light border text-nowrap" id="rcManualAdd" type="button"><i class="material-icons sm">add</i> ID(s)</button>
</div>
<div id="rcChips" class="rc-chips d-flex flex-wrap gap-2 mb-3"></div>
<div id="rcResults"></div>
</div>
<div class="modal-footer flex-wrap">
<div class="me-auto small">
<span class="text-muted">Vorschau (Dry-Run) – es wird nichts versendet.</span>
<span id="rcCommitMsg" class="ms-2"></span>
</div>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Schließen</button>
<button type="button" class="btn btn-success d-none" id="rcCommitBtn"><i class="material-icons sm">send</i> <span id="rcCommitLabel">Mails jetzt erzeugen</span></button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="lsModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title" id="lsTitle">Liste</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
<div class="modal-body">
<input type="hidden" id="lsId">
<div class="mb-3">
<label class="form-label">Listenname *</label>
<input class="form-control" id="lsName" required>
</div>
<div id="lsEntryBox" class="d-none">
<hr>
<h6 class="mb-1">Empfänger hinzufügen</h6>
<div class="form-text mb-2"><i class="material-icons" style="font-size:13px;vertical-align:-2px;">info</i> Hinzugefügte/entfernte Empfänger werden sofort gespeichert. Den <strong>Listennamen</strong> mit „Speichern" sichern.</div>
<div class="mb-2">
<label class="form-label small mb-0">E-Mails (mehrere – komma-, semikolon- oder zeilengetrennt)</label>
<textarea class="form-control" id="lsBatch" rows="2" placeholder="a@firma.de, b@firma.de, …"></textarea>
<div class="form-text">Beim Batch werden nur E-Mails übernommen (ohne Namen).</div>
</div>
<div class="row g-2 align-items-end mb-2">
<div class="col-12 col-md-3"><label class="form-label small mb-0">Einzeln: E-Mail</label><input class="form-control form-control-sm" id="lsEmail" placeholder="kontakt@reise.de"></div>
<div class="col-6 col-md-2"><label class="form-label small mb-0">Vorname</label><input class="form-control form-control-sm" id="lsFn"></div>
<div class="col-6 col-md-2"><label class="form-label small mb-0">Nachname</label><input class="form-control form-control-sm" id="lsLn"></div>
<div class="col-12 col-md-3"><label class="form-label small mb-0">Firma (statt Name)</label><input class="form-control form-control-sm" id="lsCo"></div>
<div class="col-12 col-md-2"><button type="button" class="btn btn-sm btn-primary w-100" id="lsEntryAdd"><i class="material-icons sm">person_add</i> Hinzufügen</button></div>
</div>
<div class="small mb-2" id="lsEntryMsg"></div>
<div class="table-responsive" style="max-height:300px;overflow:auto;">
<table class="table table-sm table-hover align-middle mb-0">
<thead><tr><th>E-Mail</th><th>Name / Firma</th><th></th></tr></thead>
<tbody id="lsEntries"></tbody>
</table>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-light text-danger me-auto d-none" id="lsDeleteBtn"><i class="material-icons sm">delete</i> Liste löschen</button>
<span id="lsSaveMsg" class="small me-2"></span>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Schließen</button>
<button type="button" class="btn btn-primary" id="lsSave"><i class="material-icons sm">save</i> Speichern</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="acModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<div class="modal-header"><h5 class="modal-title" id="acTitle">E-Mail-Konto</h5><button type="button" class="btn-close" data-bs-dismiss="modal"></button></div>
<form id="acForm" autocomplete="off">
<div class="modal-body">
<input type="hidden" id="acId">
<div class="row g-3">
<div class="col-12 col-md-6"><label class="form-label">Konto-Name *</label><input class="form-control" id="acName" required placeholder="z. B. Buchhaltung"></div>
<div class="col-6 col-md-3 d-flex align-items-end"><label class="form-check d-flex align-items-center gap-2"><input class="form-check-input" type="checkbox" id="acActive" checked> <span>aktiv</span></label></div>
<div class="col-12 col-md-7"><label class="form-label">SMTP-Host</label><input class="form-control" id="acHost"></div>
<div class="col-6 col-md-2"><label class="form-label">Port</label><input class="form-control" type="number" id="acPort" value="587"></div>
<div class="col-6 col-md-3"><label class="form-label">Verschlüsselung</label><select class="form-select" id="acSecure"><option value="">keine</option><option value="tls">TLS</option><option value="ssl">SSL</option></select></div>
<div class="col-6 col-md-3 d-flex align-items-end"><label class="form-check d-flex align-items-center gap-2"><input class="form-check-input" type="checkbox" id="acAuth" checked> <span>Authentifizierung</span></label></div>
<div class="col-12 col-md-4"><label class="form-label">Benutzer</label><input class="form-control" id="acUser" autocomplete="off"></div>
<div class="col-12 col-md-5"><label class="form-label">Passwort</label><input class="form-control" type="password" id="acPass" autocomplete="new-password" placeholder="•••••• (leer = unverändert)"></div>
<div class="col-12 col-md-6"><label class="form-label">Absender-Adresse</label><input class="form-control" type="email" id="acFromEmail"></div>
<div class="col-12 col-md-6"><label class="form-label">Absender-Name</label><input class="form-control" id="acFromName"></div>
</div>
<hr>
<div class="d-flex flex-wrap align-items-center gap-2">
<button type="button" class="btn btn-light border btn-sm" id="acTestConn"><i class="material-icons sm">wifi_tethering</i> Verbindung testen</button>
<input class="form-control form-control-sm" style="max-width:240px;" type="email" id="acTestTo" placeholder="Testmail an …">
<button type="button" class="btn btn-light border btn-sm" id="acTestMail"><i class="material-icons sm">send</i> Testmail</button>
<span class="small ms-1" id="acTestMsg"></span>
</div>
<div class="js-status small mt-2" id="acFormMsg"></div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-light text-danger me-auto d-none" id="acDeleteBtn"><i class="material-icons sm">delete</i> Löschen</button>
<button class="btn btn-primary" type="submit"><i class="material-icons sm">save</i> Speichern</button>
</div>
</form>
</div>
</div>
</div>
<style>
#mlForm .form-check-input{ -webkit-appearance:auto; appearance:auto; width:1.1em; height:1.1em; min-height:auto; margin:0; }
#rlForm .form-check-input{ -webkit-appearance:auto; appearance:auto; width:1.1em; height:1.1em; min-height:auto; margin:0; }
#mlForm .form-check{ display:flex; align-items:center; gap:8px; margin:0; }
.ml-ph-wrap{ border:1px solid var(--border-color,#e6e7eb); border-radius:6px; padding:8px; max-height:340px; overflow:auto; background:var(--bg-surface,#fff); }
.ml-ph-group{ font-size:10.5px; text-transform:uppercase; letter-spacing:.4px; color:#7e8896; margin:8px 0 3px; }
.ml-ph-group:first-child{ margin-top:0; }
.ml-ph{ display:inline-block; margin:2px 3px 2px 0; padding:2px 8px; font-size:12px; border:1px solid var(--border-color,#e6e7eb); border-radius:12px; background:#f5f7fb; color:#1e2633; cursor:pointer; }
.ml-ph:hover{ background:#0b4677; color:#fff; border-color:#0b4677; }
.tox-tinymce-aux, .tox-dialog-wrap{ z-index:1090 !important; } /* TinyMCE-Dialoge über dem Modal */
/* ---- Regel-Check ---- */
.rc-results{ position:absolute; top:100%; left:0; right:0; z-index:30; margin-top:4px; max-height:340px; overflow:auto; background:#fff; border:1px solid var(--border-color,#e6e7eb); border-radius:8px; box-shadow:0 10px 30px rgba(16,32,56,.14); }
.rc-result{ display:flex; align-items:center; gap:10px; padding:9px 12px; cursor:pointer; border-bottom:1px solid #f0f2f5; }
.rc-result:last-child{ border-bottom:0; }
.rc-result:hover{ background:#f2f7fc; }
.rc-result .rc-r-main{ flex:1 1 auto; min-width:0; }
.rc-result .rc-r-name{ font-weight:600; font-size:13.5px; color:#1e2633; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rc-result .rc-r-sub{ font-size:12px; color:#7e8896; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.rc-result.is-added{ opacity:.5; pointer-events:none; }
.rc-src{ display:inline-flex; align-items:center; padding:2px 9px; font-size:11px; font-weight:600; border-radius:999px; background:#eef3f9; color:#0b4677; border:1px solid #d9e4f0; white-space:nowrap; }
.rc-src.src-aida{ background:#fdeef0; color:#b5294a; border-color:#f3cdd6; }
.rc-src.src-partner{ background:#eaf6ee; color:#1d7a3e; border-color:#cfe9d7; }
.rc-src.src-parkinglist{ background:#fff4e5; color:#9a5b00; border-color:#f3ddb8; }
.rc-chip{ display:inline-flex; align-items:center; gap:7px; padding:5px 8px 5px 12px; background:#f5f7fb; border:1px solid var(--border-color,#e6e7eb); border-radius:999px; font-size:13px; }
.rc-chip .rc-chip-x{ display:inline-flex; cursor:pointer; color:#9aa4b2; }
.rc-chip .rc-chip-x:hover{ color:#d23; }
.rc-card{ border:1px solid var(--border-color,#e6e7eb); border-left-width:4px; border-radius:10px; padding:14px 16px; margin-bottom:12px; }
.rc-card.ok{ border-left-color:#1d9a4f; }
.rc-card.skip{ border-left-color:#e0a300; }
.rc-card.no{ border-left-color:#d23; }
.rc-card.missing{ border-left-color:#9aa4b2; }
.rc-card-head{ display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
.rc-verdict{ display:inline-flex; align-items:center; gap:5px; padding:3px 10px; border-radius:999px; font-size:12px; font-weight:600; }
.rc-verdict.ok{ background:#e7f6ec; color:#1d7a3e; }
.rc-verdict.skip{ background:#fcf3da; color:#8a6400; }
.rc-verdict.no{ background:#fdecee; color:#b5294a; }
.rc-verdict.missing{ background:#eef0f3; color:#5b6573; }
.rc-filters{ margin:10px 0 0; padding:0; list-style:none; font-size:13px; }
.rc-filters li{ display:flex; align-items:center; gap:8px; padding:3px 0; }
.rc-filters .rc-f-ico{ font-size:16px; }
.rc-filters .ok .rc-f-ico{ color:#1d9a4f; }
.rc-filters .no .rc-f-ico{ color:#d23; }
.rc-filters .rc-f-actual{ color:#7e8896; }
.rc-preview{ margin-top:12px; border:1px solid var(--border-color,#e6e7eb); border-radius:8px; overflow:hidden; }
.rc-preview-meta{ background:#f7f9fc; border-bottom:1px solid var(--border-color,#e6e7eb); padding:8px 12px; font-size:12.5px; }
.rc-preview iframe{ display:block; width:100%; height:320px; border:0; background:#fff; }
.rc-check-btn{ margin-left:4px; }
</style>
<?php echo '<script'; ?>
src="https://cdn.jsdelivr.net/npm/tinymce@7/tinymce.min.js" referrerpolicy="origin"><?php echo '</script'; ?>
>
<?php echo '<script'; ?>
src="<?php echo @constant('SITE_URL');?>
/assets/js/mailing.js?v=<?php echo filemtime((@constant('PATH_SYSTEM')).('/assets/js/mailing.js'));?>
"><?php echo '</script'; ?>
>
<?php }
}