Browse code

Erstelle Mailinglisten-Domains transparent wenn der User diese auswählt

Bernd Wurst authored on04/12/2019 15:53:53
Showing3 changed files
... ...
@@ -91,9 +91,41 @@ function create_list($listname, $maildomain, $admin)
91 91
     DEBUG('Neue ID: '.db_insert_id());
92 92
 }
93 93
 
94
+function get_possible_mailmandomains()
95
+{
96
+    DEBUG('get_possible_mailmandomains()');
97
+    $uid = (int) $_SESSION['userinfo']['uid'];
98
+    $result = db_query("SELECT d.id, CONCAT_WS('.',d.domainname,d.tld) AS fqdn FROM kundendaten.domains AS d LEFT JOIN mail.mailman_domains AS m ON (m.domain=d.id) WHERE d.useraccount=:uid AND m.id IS NULL ORDER BY CONCAT_WS('.',d.domainname,d.tld)", array(":uid" => $uid));
99
+    $ret = array();
100
+    while ($dom = $result->fetch()) {
101
+        $ret[] = $dom;
102
+    }
103
+    DEBUG($ret);
104
+    return $ret;
105
+}
106
+
107
+
108
+function insert_mailman_domain($subdomain, $domainid)
109
+{
110
+    DEBUG("insert_mailman_domain($subdomain, $domainid)");
111
+    $possible = get_possible_mailmandomains();
112
+    $found = false;
113
+    foreach ($possible as $dom) {
114
+        if ($domainid == $dom['id']) {
115
+            $found = true;
116
+        }
117
+    }
118
+    if (! $found) {
119
+        system_failue('invalid domain id');
120
+    }
121
+    db_query("INSERT INTO mail.mailman_domains (hostname, domain) VALUES (:hostname, :domain)", array(":hostname" => $subdomain, ":domain" => $domainid));
122
+    return db_insert_id();
123
+}
124
+
94 125
 
95 126
 function get_mailman_domains()
96 127
 {
128
+    DEBUG('get_mailman_domains()');
97 129
     $uid = (int) $_SESSION['userinfo']['uid'];
98 130
     $result = db_query("SELECT md.id, md.fqdn FROM mail.v_mailman_domains AS md left join mail.v_domains AS d on (d.id=md.domain) where d.user=?", array($uid));
99 131
     $ret = array();
... ...
@@ -26,18 +26,27 @@ foreach ($domains as $domain) {
26 26
     $maildomains[$domain['id']] = $domain['fqdn'];
27 27
 }
28 28
 
29
+$newdomains = get_possible_mailmandomains();
30
+if ($newdomains) {
31
+    $maildomains[null] = '--------------------------';
32
+    foreach ($newdomains as $domain) {
33
+        $maildomains['d'.$domain['id']] = 'lists.'.$domain['fqdn'];
34
+    }
35
+}
29 36
 output(
30
-    '<p>Tragen Sie hier die benötigten Daten zur Erstellung einer neuen Mailingliste ein. Die Liste wird <strong>mit etwas Zeitverzögerung</strong> angelegt, Sie erhalten dann eine E-Mail an die unten angegebene Adresse des Listen-Verwalters.</p>
37
+    '<p>Erstellen Sie hier eine neue Mailingliste auf unserem zentralen Mailinglisten-Manager (Mailman). Die Liste wird <strong>mit etwas Zeitverzögerung</strong> angelegt, Sie erhalten dann eine E-Mail an die unten angegebene Adresse des Listen-Verwalters.</p>
31 38
     <p><strong>Hinweis zum Listen-Verwalter:</strong> Der Listen-Verwalter bzw. Moderator erhält später im Betrieb auch die Nachrichten, die Mailman nicht zur Liste sendet mit der Bitte um Moderation/Freigabe. Bitte geben Sie hier eine E-Mail-Adresse an, die über keinen besonders aggressiven Spamfilter verfügt und auf der keine Autoresponder aktiviert werden.</p>
32 39
 
33 40
 '.html_form('mailman_newlist', 'save', 'action=new', '
34 41
 <table>
35
-<tr><td>Listenname:</td><td><input type="text" name="listname" value="" />&#160;@&#160;'.html_select('maildomain', $maildomains).'</td></tr>
42
+<tr><td>Listenname:</td><td><input type="text" name="listname" value="" />&#160;@&#160;'.html_select('maildomain', $maildomains, '0').'</td></tr>
36 43
 <tr><td>E-Mail-Adresse des Listen-Verwalters:</td><td><input type="text" name="admin" value="'.$_SESSION['userinfo']['username'].'@'.config('masterdomain').'" /></td></tr>
37 44
 </table>
38 45
 <br />
39 46
 <input type="submit" name="submit" value="Anlegen" />
40 47
 ').'
41 48
 
42
-<p><strong>Hinweis zu Domains:</strong> Aufgrund der Architektur von Mailman ist es momentan notwendig, bestimmte Domains oder Subdomains vollständig auf Mailman zu konfigurieren. Unter diesen Domains oder Subdomains kann keine anderweitige E-Mail-Adresse benutzt werden. Sofern Sie eine Ihrer eigenen Domains oder eine Subdomain unter einer Ihrer Domains für Mailinglisten benutzen möchten, müssen Sie diese Domain oder Subdomain vorher von einem Administrator anlegen lassen. Sie können danach in dieser Auswahlliste Ihre eigene Domain wählen.</p>'
49
+<h4>Hinweis zu Domains:</h4>
50
+<p>Die Angabe der Listen-Domain ist bei Mailman eher kosmetischer Natur. Auch wenn Sie eine eigene Domain benutzen, muss der Listennamen dennoch eindeutig auf dem gesamten Server sein.</p>
51
+<p>Aufgrund der Architektur von Mailman ist es zudem notwendig, für einen Hostname jeweils die Mail-Zustellung fest auf Mailman zu konfigurieren. Unter diesen Subdomains kann keine anderweitige E-Mail-Adresse benutzt werden. Sofern Sie erstmalig eine Ihrer eigenen Domains für eine Mailingliste wählen (im Auswahlfeld unter der Linie) wird eine entsprechende Konfiguration erstellt. Die Liste ist in dem Fall erst nach einigen Minuten (bis zu maximal einer Stunde) für eingehende E-Mails erreichbar.</p>'
43 52
 );
... ...
@@ -24,14 +24,35 @@ $maildomains = array('0' => config('mailman_host'));
24 24
 foreach ($domains as $domain) {
25 25
     $maildomains[$domain['id']] = $domain['fqdn'];
26 26
 }
27
-
27
+DEBUG("maildomains");
28
+DEBUG($maildomains);
28 29
 
29 30
 if ($_GET['action'] == 'new') {
30 31
     $maildomain = $_POST['maildomain'];
31
-    if ($maildomain == 0) {
32
-        $maildomain = null;
33
-    } elseif (! isset($maildomains[$maildomain])) {
32
+    DEBUG("maildomain: ".$maildomain);
33
+    if ($maildomain == null) {
34 34
         system_failure('Ihre Domain-Auswahl scheint ungültig zu sein');
35
+    } elseif ('0' === (string) $maildomain) {
36
+        DEBUG("maildomain == 0");
37
+        $maildomain = null;
38
+    } elseif (isset($maildomains[$maildomain])) {
39
+        DEBUG("maildomain in \$maildomains");
40
+        // regular, OK
41
+    } else {
42
+        DEBUG("possible new maildomain");
43
+        $possible = get_possible_mailmandomains();
44
+        $found = false;
45
+        foreach ($possible as $domain) {
46
+            if ($maildomain == 'd'.$domain['id']) {
47
+                // lege Mailman-Domain neu an
48
+                $found = true;
49
+                $maildomain = insert_mailman_domain('lists', $domain['id']);
50
+                warning('Die Domain '.$domain['fqdn'].' wurde erstmals für eine Mailingliste benutzt. Aufgrund der dafür nötigen Änderungen kann es bis zu 1 Stunde dauern, bis Mails an diese Adresse korrekt zugestellt werden.');
51
+            }
52
+        }
53
+        if (! $found) {
54
+            system_failure('Ihre Domain-Auswahl scheint ungültig zu sein');
55
+        }
35 56
     }
36 57
 
37 58
     create_list($_POST['listname'], $maildomain, $_POST['admin']);