summaryrefslogtreecommitdiff
path: root/email.php
diff options
context:
space:
mode:
Diffstat (limited to 'email.php')
-rw-r--r--email.php708
1 files changed, 708 insertions, 0 deletions
diff --git a/email.php b/email.php
new file mode 100644
index 0000000..5505957
--- /dev/null
+++ b/email.php
@@ -0,0 +1,708 @@
+<?php
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+?>
+<?
+/* vim: set ts=4 sw=4 et : */
+
+$_title = "E-Mail senden";
+
+require_once __DIR__ . "/check_auth.php";
+require_once __DIR__ . "/../includes/common.php";
+
+require_once __DIR__ . "/lookup.php";
+
+require_once __DIR__ . "/header.php";
+
+if (isset($_GET['demo'])) $_SESSION['demo'] = true;
+if (isset($_GET['demoself'])) $_SESSION['demoself'] = true;
+if (isset($_GET['nodemo'])) unset($_SESSION['demo']);
+if (isset($_GET['nodemoself'])) unset($_SESSION['demoself']);
+
+session_write_close();
+
+$num = 0;
+if ($_POST['ids'] != '')
+ $num = count(explode(',', $_POST['ids']));
+?>
+
+<div id="email_modal" style="display: none;" class="transparent_modal">
+ <button onclick="abortAll()" class="emergency_off">NOT-AUS</button>
+ <div class="sk-folding-cube hvcenter">
+ <div class="sk-cube1 sk-cube"></div>
+ <div class="sk-cube2 sk-cube"></div>
+ <div class="sk-cube4 sk-cube"></div>
+ <div class="sk-cube3 sk-cube"></div>
+ </div>
+</div>
+
+<h1>E-Mail senden
+<? if (!(isset($_POST['nocount']) && $_POST['nocount'])) { ?>
+ <? if ($num > 1) { ?>
+<span style="font-size: .5em;">f&uuml;r <?=$num?> Datens&auml;tze</span>
+ <? } else { ?>
+<span style="font-size: .5em;">f&uuml;r <?=$num?> Datensatz</span>
+ <? } ?>
+ <span style="font-size: .5em;" class="num_recps"></span>
+<? } ?>
+</h1>
+
+<? if ($_SESSION['demo']) { ?>
+<div style="border: 1px solid grey; padding: .2em; max-width: 500px; margin-bottom: .5em;">
+ <span style='color: darkred !important;'><b>Demo-Flag ist an</b> &mdash; es werden <b>keine E-Mails gesendet</b>, der Versand wird simuliert mit 3% Fehlerwahrscheinlichkeit.</span>
+ <br />
+ <button class="small" style="background: orange;" onclick="$.ajaxSetup({async:false}); $.post('/db/main/nodemo.php'); location.reload(); return false;">Demo-Flag entfernen</button>
+</div>
+<? } ?>
+
+<? if ($_SESSION['demoself']) { ?>
+<div style="border: 1px solid grey; padding: .2em; max-width: 500px; margin-bottom: .5em;">
+ <span style='color: darkred !important;'><b>Demo-Self-Flag ist an</b> &mdash; Der E-Mail-Empfänger (To) wird beim Versand durch den E-Mail-Absender (From) ersetzt. Cc und Bcc werden ignoriert.</span>
+ <br />
+ <button class="small" style="background: orange;" onclick="$.ajaxSetup({async:false}); $.post('/db/main/nodemoself.php'); location.reload(); return false;">Demo-Self-Flag entfernen</button>
+</div>
+<? } ?>
+
+<?
+ $sql = "
+SELECT Personen.Email
+FROM Personen_Organisationen
+INNER JOIN Personen ON Personen_Organisationen.Person = Personen.ID
+WHERE Personen_Organisationen.Organisation=526 AND Personen.Nachname=?
+LIMIT 1
+";
+ $stmt = $mysqli->prepare($sql);
+ $stmt->bind_param('s', $_SESSION['auth_user']);
+ $stmt->bind_result($semail);
+ $stmt->execute();
+ $stmt->fetch();
+ $stmt->reset();
+?>
+
+<table border="0" style="display: inline-block; max-width: 460px;">
+ <tr>
+ <td>Absender</td>
+ <td><input style="width: 25em;" class="mand" type="text" name="email_from" placeholder="absender@hochschule-rhein-waal.de" value="<?=$semail?>"></td>
+ <td></td>
+ </tr>
+ <tr>
+ <td>ID/To<sup><small>Preview</small></sup></td>
+ <td>
+ <input type="text" style="width: 5em;" disabled name="email_id" value="">
+ <input type="text" style="width: 19em;" disabled name="email_to" value="">
+ </td>
+ </tr>
+ <tr>
+ <td>Cc</td>
+ <td>
+ <input type="text" style="width: 25em;" name="email_cc" placeholder="erster@kontakt.cc, zweiter@kontakt.cc">
+ <i style="cursor: pointer;" onclick="$('#cc_info').toggle();" class="fas fa-info-circle"></i>
+ <p id="cc_info" style="display: none;" class="explain">Bei Cc und Bcc sind jeweils mehrere Adressaten m&ouml;glich. Durch Komma trennen.</p>
+ </td>
+ </tr>
+ <tr>
+ <td>Bcc</td>
+ <td><input type="text" style="width: 25em;" name="email_bcc" placeholder="bcc@hochschule-rhein-waal.de"></td>
+ </tr>
+ <tr>
+ <td>Betreff</td>
+ <td>
+ <input class="mand" style="width: 25em;" type="text" name="email_subject" placeholder="Betreff">
+ <i style="cursor: pointer;" onclick="$('#betreff_info').toggle();" class="fas fa-info-circle"></i>
+ <p id="betreff_info" style="display: none;" class="explain">Umlaute und Emojis k&ouml;nnen nun auch im Betreff verwendet werden.</p>
+ </td>
+ </tr>
+</table>
+
+<div style="display: inline-block; margin-left: .5em; vertical-align: top;">
+ <button onclick="return sendAll();" class="medium" style="width: 12em;"><i class="fas fa-mail-bulk"></i> an alle senden</button><br />
+<? if (!isset($_SESSION['singleemail'])) { ?>
+ <button onclick="return sendOne();" class="medium" style="width: 12em;"><i class="fas fa-envelope"></i> an diesen senden</button>
+<? } ?>
+
+ <div style="color: darkorange; margin-top: .5em;">
+<? if (!$_SESSION['demo']) { ?>
+ <button class="small" style="background: orange;" onclick="$.ajaxSetup({async:false}); $.post('/db/main/demo.php'); location.reload(); return false;">Demo-Flag setzen</button><br />
+<? } ?>
+<? if (!$_SESSION['demoself']) { ?>
+ <button class="small" style="background: orange;" onclick="$.ajaxSetup({async:false}); $.post('/db/main/demoself.php'); location.reload(); return false;">Demo-Self-Flag setzen</button><br />
+<? } ?>
+<? if (!$_SESSION['singleemail']) { ?>
+ <button class="small" style="background: lightcoral;" onclick="$.ajaxSetup({async:false}); $.post('/db/main/singleemail.php'); location.reload(); return false;">Auf Einzel-E-Mail schalten</button><br />
+<? } ?>
+
+ Letzter Status:
+ <p id="email_status"></p>
+ </div>
+</div>
+
+<div style="display: inline-block; margin-left: 1em; vertical-align: top;">
+ <b>Gespeicherte Templates <i style="cursor: pointer;" onclick="$('#templater_info').toggle();" class="fas fa-info-circle"></i></b>
+ <p id="templater_info" style="display: none;" class="explain">Nicht jedes Template funktioniert in jeder Abfrage. Manche Abfragen haben spezifische Payloads hinterlegt (z.B. Eventmanagement). Bestimmte Felder existieren z.B. auch nur in Bewerbungsdatens&auml;tzen. Daher bitte zun&auml;chst stichprobenartig durch die Vorschau-Funktion pr&uuml;fen, ob die erwarteten Ergebnisse erzeugt werden.<br />Sollte der Templater von alleine aus erkennen, dass spezifische Payloads n&ouml;tig sind, warnt er. Dies ist jedoch aus technischen Gr&uuml;nden nicht immer m&ouml;glich.<br />Anh&auml;nge werden grunds&auml;tzlich <b>nicht</b> zusammen mit dem Template gespeichert und auch nicht beim Laden eines anderen Templates zur&uuml;ckgesetzt.</p>
+
+ <div style="color: darkorange; margin-top: .1em;">
+<?
+ $sql = "
+SELECT id, name, text, subject, `from`, cc, bcc, ts, tags, tid as fav
+FROM email_templates
+LEFT JOIN email_templates_fav ON email_templates.id = email_templates_fav.tid AND email_templates_fav.userid = ?
+WHERE active = 1
+ORDER BY fav DESC, name ASC";
+ $stmt = $mysqli->prepare($sql);
+ $stmt->bind_param('i', $_SESSION['auth_userid']);
+ $stmt->bind_result($id, $name, $text, $subject, $from, $cc, $bcc, $ts, $tags, $fav);
+ $stmt->execute();
+?>
+ <select id="email_template">
+ <option data-id="" data-name="" data-text="" data-from="" data-cc="" data-bcc="" data-subject="" data-tags="" value="" selected></option>
+<?
+ $templates = [];
+ while ($stmt->fetch()) {
+ $templates[$id] = ['name' => $name, 'text' => $text, 'ts' => $ts];
+?>
+ <option data-id="<?=$id?>"
+ data-name="<?=str_replace("\"", "&qout;", $name)?>"
+ data-from="<?=str_replace("\"", "&quot;", $from)?>"
+ data-cc="<?=str_replace("\"", "&quot;", $cc)?>"
+ data-bcc="<?=str_replace("\"", "&quot;", $bcc)?>"
+ data-subject="<?=str_replace("\"", "&quot;", $subject)?>"
+ data-text="<?=str_replace("\"", "&quot;", $text)?>"
+ data-tags="<?=str_replace("\"", "&quot;", $tags)?>"
+ value="<?=$id?>"><?=$fav?'★ ':''?><?=$name?> (ID <?=$id?>; <?=$ts?>)</option>
+<?
+ }
+?>
+ </select>
+ <div style="display: block; margin-top: .2em;">
+ <button class="small" onclick="return loadEmailTemplate();"><i class="fas fa-upload"></i> Laden</button>
+ <button class="small" onclick="return saveEmailTemplate();" style="background: orange"><i class="fas fa-download"></i> &Uuml;berschreiben</button>
+ <button class="small" onclick="return newEmailTemplate();"><i class="far fa-file"></i> Neu</button>
+ <button class="small" onclick="return renameEmailTemplate();"><i class="fas fa-pencil-alt"></i> Umbenennen</button>
+ <button class="small" onclick="return delEmailTemplate();" style="background: red;"><i class="fas fa-trash"></i> L&ouml;schen</button>
+ </div>
+ <label style="font-family: monospace;" for="etfiltertags">Filter Tags</label>&nbsp;<input id="etfiltertags" name="etfiltertags" placeholder="Tags" /><br />
+ <label style="font-family: monospace;" for="etfiltername">Filter Name</label>&nbsp;<input id="etfiltername" name="etfiltername" placeholder="Name" /><br />
+ <label style="font-family: monospace;" for="etfilterid">Filter ID&nbsp;&nbsp;</label>&nbsp;<input id="etfilterid" name="etfilterid" placeholder="ID" /><br />
+ <a id="manageets" href="/db/templates/emails/">Templates verwalten</a>
+ <a id="manageet" style="display: none;" href=""></a><br />
+ <div id="email_template_warnings" style="display: block; margin-top: .2em;">
+ </div>
+<?
+ $stmt->reset();
+?>
+
+ </div>
+</div>
+
+<div id="attachments" style="display: inline-block; margin-left: 0; vertical-align: top;">
+ <b>Anh&auml;nge</b>
+ <small>(PDF, Word*, Excel*, PowerPoint*, JPG, PNG, ZIP)</small>
+ <i style="cursor: pointer;" onclick="$('#office_info').toggle();" class="fas fa-info-circle"></i>
+ <p id="office_info" style="display: none;" class="explain">
+ Office-Formate kommen ggf. nicht durch Firewalls und serverseitig installierte Spamfilter. Wenn m&ouml;glich PDF verwenden.<br />
+ Anh&auml;nge m&uuml;ssen zuvor im daf&uuml;r vorgesehenen Ordner im CMS hochgeladen werden.
+ </p>
+
+<?
+ for ($i = 1; $i < 13; $i++) {
+?>
+ <div style="clear: both;"></div>
+<?
+ $sql = "
+SELECT hash, name, mime
+FROM pages_files
+WHERE
+(
+ mime='application/pdf'
+ OR mime='image/jpeg'
+ OR mime='image/png'
+ OR mime='application/vnd.openxmlformats-officedocument.wordprocessingml.document' OR mime='application/msword'
+ OR mime='application/vnd.ms-excel' OR mime='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
+ OR mime='application/vnd.ms-powerpoint' OR mime='application/vnd.openxmlformats-officedocument.presentationml.presentation'
+ OR mime='application/zip'
+)
+ AND sid=4
+ORDER BY name
+";
+ $stmt = $mysqli->prepare($sql);
+ $stmt->bind_result($fid, $fname, $fmime);
+ $stmt->execute();
+?>
+ <select class="attachment" id="attachment<?=$i?>" <? if ($i != 1) { ?> style="display: none;" <? } ?>>
+ <option value="" selected></option>
+<?
+ while ($stmt->fetch()) {
+?>
+ <option value="<?=$fid?>" data-mime="<?=$fmime?>"><?=$fname?></option>
+<?
+ }
+ $stmt->reset();
+
+ $sql = "SELECT name, description FROM pdf_documents ORDER BY name";
+ $stmt = $mysqli->prepare($sql);
+ $stmt->bind_result($fname, $fdesc);
+ $stmt->execute();
+ while ($stmt->fetch()) {
+?>
+ <option value="~<?=$fname?>" data-mime="application/pdf">~PDF: <?=$fname?> (<?=$fdesc?>)</option>
+<?
+ }
+ $stmt->reset();
+?>
+ </select>
+<?
+ }
+?>
+</div>
+
+<script>
+<? minStart(); ?>
+
+$('#email_template').on('change', function () {
+ $('#email_template').css('background', 'white');
+});
+
+$('select.attachment').on('change', function () {
+ if ($(this).val() == '')
+ $(this).nextAll('select.attachment').val('').hide();
+ else
+ $(this).nextAll('select.attachment').first().show();
+});
+
+$(document).ready(function () {
+ quill.on('text-change', function () {
+ $('#email_template').css('background', 'lightgrey');
+ });
+
+ setTimeout(function () {
+ var tid = localStorage.getItem('email_template');
+ if (tid !== '' && tid > 0) {
+ $('select#email_template').val(tid);
+ localStorage.removeItem('email_template');
+ setTimeout(function () {
+ loadEmailTemplate();
+ }, 100);
+ }
+ }, 200);
+});
+
+function newEmailTemplate() {
+ var n = prompt('Name des neuen Templates:', '');
+ if (!n) return;
+
+ var text = $("#editor .ql-editor").html();
+ var from = $('input[name=email_from]').val();
+ var cc = $('input[name=email_cc]').val();
+ var bcc = $('input[name=email_bcc]').val();
+ var subject = $('input[name=email_subject').val();
+
+ $.ajaxSetup({async:false});
+ var tid = 0;
+ $.post('/db/main/addtemplate.php', {
+ 'name': n,
+ 'text': text,
+ 'from': from,
+ 'cc': cc,
+ 'bcc': bcc,
+ 'subject': escape(subject),
+ 'email': true
+ }, function (rv) { tid = rv; });
+
+ localStorage.setItem('email_template', tid);
+ alert(unescape('Neues Template ID ' + tid + ' mit den aktuellen Werten wurde erzeugt.\r\n\r\nDie Seite lädt nun neu.'));
+ location.reload();
+}
+
+function renameEmailTemplate() {
+ var id = $('#email_template :selected').attr('data-id');
+ var on = $('#email_template :selected').attr('data-name');
+ var n = prompt('Name des Templates:', on);
+ if (!n) return;
+
+ $.ajaxSetup({async:false});
+ $.post('/db/main/rentemplate.php', {
+ 'id': id,
+ 'name': n,
+ 'email': true
+ });
+
+ $('#email_template :selected').attr('data-name', n);
+ $('#email_template :selected').text(n + ' (ID ' + id + ')');
+}
+
+function delEmailTemplate() {
+ var id = $('#email_template').val();
+ var v = $('#email_template :selected').text();
+ if (!v) return;
+
+ if (confirm(unescape('Wirklich Template\n "' + v + '"\nunwiderruflich verwerfen?'))) {
+ $.ajaxSetup({async:false});
+ $.post('/db/main/deltemplate.php', {
+ 'id': id,
+ 'email': true
+ });
+ $('#email_template :selected').remove();
+ $('#email_template').css('background', 'red');
+ $('#manageet').hide();
+ }
+}
+
+function loadEmailTemplate() {
+ var text = $('#email_template :selected').attr('data-text');
+
+ $("#editor .ql-editor")[0].innerHTML = $('#email_template :selected').attr('data-text');
+ $("#editor .ql-editor").html($('#email_template :selected').attr('data-text').replace(/<br>/g, '<br>\n'));
+ $('input[name=email_from]').val($('#email_template :selected').attr('data-from'));
+ $('input[name=email_cc]').val($('#email_template :selected').attr('data-cc'));
+ $('input[name=email_bcc]').val($('#email_template :selected').attr('data-bcc'));
+ $('input[name=email_subject]').val(unescape($('#email_template :selected').attr('data-subject')));
+
+ setTimeout(function () {
+ $('#email_template').css('background', 'lightgreen');
+ }, 200);
+
+ var w = "";
+ if (text.match(/{{[^}]*event/)) {
+ w += "Template enthaelt Auszeichnungen fuer Events. Abfrage aus dem Eventmanagement noetig.<br />";
+ }
+ if (text.match(/{{[^}]*stiplist/)) {
+ w += "Template enthaelt Auszeichnungen fuer Stipendiatenliste. Spezieller Payload noetig.<br />";
+ }
+ if (text.match(/{{[^}]*stipvergabe/)) {
+ w += "Template enthaelt Auszeichnungen fuer Stipvergabe. Spezieller Payload noetig.<br />";
+ }
+ if (text.match(/{{[^}]*my/)) {
+ w += "Template enthaelt Auszeichnungen fuer pers. Bereich. Abfrage aus Bewerbungen oder Stipendien noetig.<br />";
+ }
+ if (text.match(/{{[^}]*mylue/)) {
+ w += "Template enthaelt Auszeichnungen fuer LUe. Abfrage aus Leistungsueberpruefung noetig. Abfrage aus Stipendien generiert falsche URL.<br />";
+ }
+ if (text.match(/{{[^}]*eventlist/)) {
+ w += "Template enthaelt Auszeichnungen fuer Ideelle Foerderung. Kombinationsabfrage aus mehreren Events noetig.<br />";
+ }
+ if (text.match(/{{[^}]*d\['s2'\]/) || text.match(/{{[^}]*d\.s2/)) {
+ w += "Template enthaelt Auszeichnungen fuer Bewerbungsdatensaetze. Abfrage aus Bewerbung noetig.<br />";
+ }
+ if (text.match(/{{[^}]*ip /)) {
+ w += "Template verweist auf einen Independent Payload. Spezielle Abfrage noetig.<br />";
+ }
+ if (text.match(/{{[^}]*filter/)) {
+ w += "Template enthaelt Filteranweisungen. Sehr wahrscheinlich spezielle Abfrage noetig.<br />";
+ }
+ if (text.match(/┌/)) {
+ w += "Template enthaelt rekursives Templating. Mit an Sicherheit grenzender Wahrscheinlichkeit spezielle Abfrage noetig.<br />";
+ }
+ $('#email_template_warnings').html(w);
+
+ $('#manageet').attr('href', '/db/templates/email/' + $('#email_template :selected').attr('data-id')).html('ID ' + $('#email_template :selected').attr('data-id') + ' verwalten').show();
+}
+
+function saveEmailTemplate() {
+ var text = $("#editor .ql-editor").html();
+ var from = $('input[name=email_from]').val();
+ var cc = $('input[name=email_cc]').val();
+ var bcc = $('input[name=email_bcc]').val();
+ var subject = $('input[name=email_subject').val();
+ var id = $('#email_template').val();
+
+ $('#email_template :selected').attr('data-text', text);
+ $('#email_template :selected').attr('data-from', from);
+ $('#email_template :selected').attr('data-cc', cc);
+ $('#email_template :selected').attr('data-bcc', bcc);
+ $('#email_template :selected').attr('data-subject', escape(subject));
+ $('#email_template :selected').text($('#email_template :selected').attr('data-name') + ' (ID ' + $('#email_template :selected').attr('data-id') + ')');
+
+ $.ajaxSetup({async:false});
+ $.post('/db/main/updtemplate.php', {
+ 'id': id,
+ 'text': text,
+ 'from': from,
+ 'cc': cc,
+ 'bcc': bcc,
+ 'subject': escape(subject),
+ 'email': true
+ });
+
+ setTimeout(function () {
+ $('#email_template').css('background', 'lightgreen');
+ $('#manageet').attr('href', '/db/templates/email/' + $('#email_template :selected').attr('data-id')).html('ID ' + $('#email_template :selected').attr('data-id') + ' verwalten').show();
+ }, 200);
+}
+
+<? minEnd(); ?>
+</script>
+
+<?
+$sql = $_POST['sql'];
+$post_sql = $_POST['postsql'];
+$payload_sql = $_POST['payload_sql'];
+$payload_sql_order = $_POST['payload_sql_order'];
+$independent_payload_sql = $_POST['independent_payload_sql'];
+$independent_payload_sql_order = $_POST['independent_payload_sql_order'];
+$isemail = true;
+require_once __DIR__ . "/templater_common.php";
+?>
+
+<script>
+<? minStart(); ?>
+
+function sendOne(skip) {
+ if (typeof skip !== 'boolean')
+ skip = false;
+
+ if (typeof pivot.__skip !== 'undefined') {
+ if (pivot.__skip) {
+ delete pivot.__done;
+ delete pivot.__failed;
+ data[pivot.index].__skip = true;
+ redoRows($("tr[data-id='" + pivot.uid + "']")[0], 0, 0, 0, pivot.index);
+ redoRows($("tr[data-id='" + pivot.ID + "']")[0], 0, 0, 0, pivot.index);
+ redoRows($("tr[data-id='" + pivot.id + "']")[0], 0, 0, 0, pivot.index);
+ return true;
+ }
+ }
+
+ if (typeof pivot.__done !== 'undefined') {
+ if (!confirm(unescape('An diese Adresse wurde schon gesendet. Nochmal senden?')))
+ return;
+ }
+
+ var from = $('input[name=email_from]').val();
+ var to = $('input[name=email_to]').val();
+ var cc = $('input[name=email_cc]').val();
+ var bcc = $('input[name=email_bcc]').val();
+ var subject = $('input[name=email_subject]').val();
+ var html = $('#preview').html();
+ if ($('textarea.htmlcontainer').val().length > 10) {
+ html = $('textarea.htmlcontainer').val();
+ }
+
+ var persid = null;
+ var stipid = null;
+ var uid = null;
+
+ if (typeof pivot.ID !== 'undefined') persid = pivot.ID;
+ if (typeof pivot.id !== 'undefined') persid = pivot.id;
+ if (typeof pivot.PersID !== 'undefined') persid = pivot.PersID;
+ if (typeof pivot.persid !== 'undefined') persid = pivot.persid;
+ if (typeof pivot.StipID !== 'undefined') stipid = pivot.StipID;
+ if (typeof pivot.stipid !== 'undefined') stipid = pivot.stipid;
+ if (typeof pivot.UID !== 'undefined') uid = pivot.UID;
+ if (typeof pivot.uid !== 'undefined') uid = pivot.uid;
+
+ var attachments = [];
+ $('#attachments select.attachment :selected').each(function () {
+ if (!$(this).val()) return;
+ if ($(this).val().charAt(0) === '~') {
+ attachments.push('~' + uid + '_/' + $(this).val().substring(1) + '.pdf');
+ } else {
+ attachments.push($(this).val());
+ }
+ });
+ var attachments_fn = [];
+ $('#attachments select.attachment :selected').each(function () { if (!$(this).text()) return; attachments_fn.push($(this).text()); });
+ var attachments_mime = [];
+ $('#attachments select.attachment :selected').each(function () { if (!$(this).attr('data-mime')) return; attachments_mime.push($(this).attr('data-mime')); });
+
+ var noerror = false;
+ var response = "";
+ $.ajaxSetup({async:false});
+ $.ajax({
+ type: 'POST',
+ url: '/db/main/sendmail.php',
+ data: {
+ 'from': from,
+ 'to': to,
+ 'cc': cc,
+ 'bcc' : bcc,
+ 'html' : html,
+ 'subject': subject,
+ 'persid': persid,
+ 'stipid': stipid,
+ 'uid': uid,
+ 'attachments': attachments,
+ 'attachments_fn': attachments_fn,
+ 'attachments_mime': attachments_mime
+ },
+ success: function (d, s, x) {
+ if (d == 1) {
+ noerror = true;
+ response = x.responseText;
+ }
+ if (d == 2) {
+ response = "Gewählter Anhang nicht auffindbar.";
+ }
+ if (d == 3) {
+ response = "Es gibt einen Personeneintrag mit der E-Mail-Adresse (alle Felder), in dem 'wünscht keine E-Mails' gesetzt ist.";
+ }
+ }
+ });
+
+ if (noerror && response == '1') {
+ pivot.__done = true;
+ delete pivot.__failed;
+
+ redoRows($("tr[data-id='" + pivot.uid + "']")[0], 0, 0, 0, pivot.index);
+ redoRows($("tr[data-id='" + pivot.ID + "']")[0], 0, 0, 0, pivot.index);
+ redoRows($("tr[data-id='" + pivot.id + "']")[0], 0, 0, 0, pivot.index);
+
+ if (!skip) alert('E-Mail an ' + to + ' erfolgreich gesendet.');
+
+ $('#email_status').html('[#' + (count_s + count_f + 1) + '] E-Mail erfolgreich: ' + to);
+ return true;
+ }
+
+ pivot.__failed = true;
+ delete pivot.__done;
+
+ redoRows($("tr[data-id='" + pivot.uid + "']")[0], 0, 0, 0, pivot.index);
+ redoRows($("tr[data-id='" + pivot.ID + "']")[0], 0, 0, 0, pivot.index);
+ redoRows($("tr[data-id='" + pivot.id + "']")[0], 0, 0, 0, pivot.index);
+
+ alert('Fehler beim Senden an ' + to + ': ' + response);
+ $('#email_status').html('Fehler: ' + to);
+ return false;
+}
+
+function waitASec(time) {
+ $.ajaxSetup({async:false});
+ $.post('/db/main/delay.php', {
+ time: time
+ });
+}
+
+function sendAllDone() {
+ $('#email_modal').hide();
+ window.scrollTo(0, 0);
+ alert(unescape('Fertig. Erfolg für ' + count_s + ' Empfänger.\nFehlgeschlagen bei ' + count_f + '.'));
+ $('#email_status').html('Erfolg: ' + count_s + ', Fehler: ' + count_f);
+}
+
+function sendAllLoop() {
+ if (typeof window.emergencyOff !== 'undefined') {
+ sendAllDone();
+ delete window.emergencyOff;
+ return;
+ }
+
+ if (typeof pivot.__done === 'undefined') {
+ $('#email_status').html('Sende an: ' + pivot['email']);
+
+ if (sendOne(true)) count_s++;
+ else count_f++;
+
+ pivot_iter++;
+ if (pivot_iter < data.length) {
+ pivot = data[pivot_iter];
+ bP();
+ setTimeout(sendAllLoop, 60);
+ return;
+ }
+
+ setTimeout(sendAllDone, 60);
+ return;
+ }
+
+ pivot_iter++;
+ if (pivot_iter < data.length) {
+ pivot = data[pivot_iter];
+ bP();
+ setTimeout(sendAllLoop, 10);
+ return;
+ }
+
+ setTimeout(sendAllDone, 80);
+ return;
+}
+
+function sendAll() {
+ if (!confirm(unescape('Wirklich E-Mail an ' + $.grep(data, function (e) { return (typeof e.__done === 'undefined'); }).length + ' Empfänger senden?')))
+ return;
+
+ count_s = 0;
+ count_f = 0;
+ pivot = data[0];
+ pivot_iter = 0;
+ bP();
+
+ window.scrollTo(0, 0);
+ $('#email_modal').show();
+ setTimeout(sendAllLoop, 100);
+}
+
+function abortAll() {
+ window.emergencyOff = true;
+}
+
+
+function etFilter() {
+ $('#email_template option').removeAttr('selected');
+ $('#email_template option').prop('selected', false);
+
+ t = $('#etfiltertags').val();
+ t = t.trim();
+ t.replace(/\s+/g, ' ');
+
+ n = $('#etfiltername').val();
+ n = n.trim();
+
+ id = $('#etfilterid').val();
+ id = id.trim();
+
+ $('#email_template option').each(function (i, o) {
+ var show = true;
+ var it = $(this);
+
+ t.split(' ').forEach(function (e) {
+ if (!it.attr('data-tags').toLowerCase().includes(e.toLowerCase())) {
+ show = false;
+ }
+ });
+
+ if (n && n.length > 0) {
+ if (!$(this).attr('data-name').toLowerCase().includes(n.toLowerCase())) {
+ show = false;
+ }
+ }
+
+ if (parseInt(id) > 0) {
+ if ($(this).attr('data-id') != id) {
+ show = false;
+ }
+ }
+
+ if (show) {
+ $(this).show();
+ } else {
+ $(this).hide();
+ }
+ });
+}
+
+$(document).ready(function () {
+ $('#etfiltertags').on('change input keyup', function (e) {
+ etFilter();
+ });
+ $('#etfiltername').on('change input keyup', function (e) {
+ etFilter();
+ });
+ $('#etfilterid').on('change input keyup', function (e) {
+ etFilter();
+ });
+});
+
+<? minEnd(); ?>
+</script>
+
+<?
+include_once __DIR__ . "/footer.php";
+?>