User Tools

Site Tools


mailingliste_nur_mit_boardmitteln

Arme Leute Mailingliste

Warum?

Ich hätte schon öfters eine Mailingliste gebraucht. Für so kleine Projekte wo man mit ein paar FreundInnen zusammenarbeitet. Man vergisst regelmäßig den einen oder anderen im Mailverteiler, antwortet nur der Senderin anstatt allen zu antworten, etc. Ich hätte da gerne eine Mailingliste. Wir hatten das auch schon als eine Addresse mit einfach allen Teilnehmern als Alias eingetragen. Da gibt es dann so kleine Problemchen wie die Antwortadresse und Co. Egal wie man es gemacht hat, es war nie schön und gut.

Was nicht?

Mailman, Sympa und Co. Die ganzen großen Mailinglisten sind ein Graus zu installieren und administrieren. Die gehen teilweise recht tief in die Mailserver rein. Ein Sicherheitsrisiko mehr, das man gar nicht auf seinem Server betreiben will.

Was dann?

Die Idee war nur mit sieve eine Mailingliste zu betreiben. Die Suchmaschine meines Vertrauens brachte dazu nur einen vernünftigen Artikel[1], und an dem habe ich mich zuerst auch mal orientiert. Da man an zwei Stellen im Sievescript die Mailaddressen eintragen muss, wollte ich ein Pythonscript erstellen, dass die Mails aus einer Textdatei ausliest, und dann das Script generiert. Dann hab ich das erstellte Script von Hand in den Server kopiert. Das war mir dann auch zu blöd, also hab ich noch eingebaut, dass das Script direkt an den Mailserver übertragen wird. D.h. mit etwas Python auf dem eigenen Rechner, und einer Mailaddresse die Sieve spricht, kann man jetzt eine Mailingliste betreiben. Ich hab dann noch sogar eine rudimentäre subscribe und unsubscribe Funktion nachgebaut.

Wie jetzt?

Das Sievescript

Das eigentliche Sievescript ist nahezu identsch, zu dem von mir online gefundenen.

require ["copy", "imap4flags", "editheader", "variables", "regex","envelope","fileinto"];
# rule:[Mailinglist]
if anyof(
	address :is "from" "mail1@domain.tld",
	address :is "from" "mail2@domain2.tld"
)
{
if header :regex "From" "([^<]+)" {
set "name" "${1}";
}
deleteheader "Reply-To"; 
deleteheader "From";
deleteheader "To";
deleteheader "DKIM-Signature";
deleteheader "DomainKey-Signature";
deleteheader "X-DKIM";
deleteheader "X-DomainKeys";
deleteheader "X-Google-DKIM-Signature";
addheader "From" "${name} <mailinglist@domain.tld>";
addheader "To" "mailinglist@domain.tld";
redirect :copy "mail1@domain.tld";
redirect :copy "mail2@domain2.tld";
setflag "\\Seen";
fileinto "INBOX/Approved";
stop;
}

Es ist eigentlich recht einfach zu verstehen. Damit die Mails überhaupt weiterverarbeitet werden, muss der Absender in der Liste bekannt sein. Es werden also nur Mails von Teilnehmern weitergeschickt. Dann wird per RegEx noch der Name des Absenders rauskopiert, damit der dann später wieder dazugeschrieben wird, damit man sieht, von wem die Mail ursprünglich kam. Dann entfernen wir alles was da so an DKIM und Co vom ursprünglichen Absender drinnen war, entfernen den Absender, und setzen unsere Liste als Absenderadresse, der besseren Lesbarkeit wegen aber mit dem Absendernamen des ursprünglichen Senders. Schon hat man eine Mailingliste, die eigentlich alles erfüllt, was man so möchte.

Python

Da wir an zwei Stellen in dem Sievescript die Teilnehmer definieren müssen, bin ich dazu schon zu faul. Also ganz schnell ein Pythonscript erstellt, mit einer config.py datei, aus der man sowohl die Listenadresse, Teilnehmeradressen, etc auslesen kann. Die Teilnehmeradressen sind dann nochmal in eine eigene Datei ausgewandert, da mir dies das Leben einfacher machte, als noch eine subsribe/unsubscribe-Funktion dazu kommen sollte. Wenn alle persönlichen Daten in einer config Datei liegen tut man sicha cuh einfach das ganze später zu veröffentlichen. Das manuelle kopieren der Sievedatei auf den Server hat mich noch etwas genervt, deshalb habe ich dann noch die Logindaten für den sErverhinterlegt, und jetzt wird direkt nach generieren des scriptes alles auf den Mailserver hochgeladen. Zuerst habe ich die Datei per SCP hochgeladen, aber wenn man jetzt nicht der Admin des Mailservers ist, geht das eben nicht. Also per managesieve, das geht mit den Logindaten des Mailaccounts, ganz ohne Adminrechte. Jetzt hat man eigentlich schon genügend Funktionalität, um das nächste Hochzeitsgeschenk zu planen und zu bauen. Eine Party zu organiseren, whatever.

subscribe/unsubscribe-Funktion

Eigentlich hätte das jetzt so ja alles schon ausgereicht, aber ich dachte mir, es sei schön, wenn man sich noch selbst subscriben und unsubscriben könnte. Die erste Idee dazu war, dass man aus dem sievescript am Server ein externes Pythonscript aufruft, welches dann die config-Dateien umschreibt, und ein neues script generiert. Rein theroretisch sollte dies sogar möglich sein, aber ich habe es verworfen, da die Anforderung ja war, dass das funktionieren muss ohne Adminrachte am Mailserver. Also muss das von extern erfolgen, und somit ist das An- und Abmelden an der Liste also ein halbautomatischer Prozess. Wenn jetzt jemand eine Mail mit dem Betreff “subscribe” an die Mailinglistenaddresse schickt, dann wird die Mail erstmal nur in den Unterordner subscribe umkopiert. Der Mailinglistenbetreiber muss jetzt von Zeit zu Zeit ein zweites Pythonscript (subunsub.py) starten, welche sich per IMAP auf den Mailserver verbindet, und jenachdem in welchem Unterordner sich eine Mail befindet den Absender entweder zufüg oder entfernt. Diese Datei könnte man per Cronjob auch alle halbe Stunde mal automatisiert laufen lassen.

https://gitlab.com/sven222/sievemailinglist

[1]https://datatainment.de/this-n-that/simple-sieve-mailinglist

mailingliste_nur_mit_boardmitteln.txt · Last modified: 2025/01/01 17:05 by admin

Except where otherwise noted, content on this wiki is licensed under the following license: CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki