Mlmmj: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
K (Gliederung)
K (Link korrigiert)
 
(30 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
[http://www.mlmmj.org/ mlmmj], angeblich eine Abkürzung für "Mailing List Management Made Joyful", ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.
[http://www.mlmmj.org/ mlmmj], angeblich eine Abkürzung für "Mailing List Management Made Joyful", ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.


Wer noch nicht weiß, was ein E-Mail-Verteiler machen soll oder wie, lese veilleicht auch den Wikipedia-Artikel:
Wer noch nicht weiß, was ein E-Mail-Verteiler machen soll oder wie, lese vielleicht auch den Wikipedia-Artikel:
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]


Zeile 8: Zeile 8:
Diese Anleitung beschreibt die Einrichtung einer Mailingliste für eine Domain in einem Hostsharing-Webspace.
Diese Anleitung beschreibt die Einrichtung einer Mailingliste für eine Domain in einem Hostsharing-Webspace.


== mlmmj ==
== Voraussetzungen  ==


Das Debian Paket [http://packages.debian.org/search?keywords=mlmmj mlmmj] ist auf den Shared-Hosting-Servern bereits installiert.
Das Debian Paket [http://packages.debian.org/search?keywords=mlmmj mlmmj] ist auf den Shared-Hosting-Servern bereits installiert. (Wer die Software selbst kompilieren möchte kann aktuellen Source-Code bei [https://codeberg.org/mlmmj/mlmmj codeberg.org] finden.)
 
=== Voraussetzungen  ===


Für den Betrieb der Mailingliste empfiehlt sich das Anlegen eines eigenen Users für diesen Zweck mit hsadmin.
Für den Betrieb der Mailingliste empfiehlt sich das Anlegen eines eigenen Users für diesen Zweck mit hsadmin.
Zeile 18: Zeile 16:
In dieser Anleitung heißt das Paket ''xyz00'' und der für Mailinglisten eingesetzte User ''xyz00-list''.
In dieser Anleitung heißt das Paket ''xyz00'' und der für Mailinglisten eingesetzte User ''xyz00-list''.


Die E-Mail-Adresse der einzurichtende Mailing-Liste soll ''discuss@example.org'' sein.
Die E-Mail-Adresse der einzurichtende Mailing-Liste soll ''discuss@example.org'' sein. Den lokalen Teil dieser Adresse, ''discuss'', ist der Listenname. Der Listenname darf auf keinen Fall das Plus-Zeichen (+) enthalten, weil dies ein Sonderbedeutung für die Listensteuerung hat: ''mlmmj'' wird nämlich Befehle der Abonnenten über erweiterte Adressen annehmen, wie z.B. ''discuss+help@example.org''.


Die Domain ''example.org'' muss dazu bei einem beliebigen User im Paket ''xyz00'' [[aufgeschaltet]] sein. ("Aufgeschaltet" bedeutet, daß diese Domain bei Hostsharing gehostet wird und der Domainname als Verzeichnis /home/pacs/xyz00/*User*/doms/example.org/ erscheint.)
Die Domain ''example.org'' muss dazu bei einem beliebigen User im Paket ''xyz00'' [[aufgeschaltet]] sein. ("Aufgeschaltet" bedeutet, daß diese Domain bei Hostsharing gehostet wird und der Domainname als Verzeichnis /home/pacs/xyz00/*User*/doms/example.org/ erscheint.)


=== Einrichtung ===
== Einrichtung ==


Ich melde mich über SSH auf der Hostsharing-Console als der Paketuser ''xyz00'' an.
Ich melde mich über SSH auf der Hostsharing-Console als der Paketuser ''xyz00'' an.


Im Shell kann ich dann durch den Befehl ''hsscript -i'' das Verwaltungswerkzeug ''hsadmin'' interaktiv ausführen:
Im Shell kann ich dann durch den Befehl ''hsscript -i'' das Verwaltungswerkzeug [[hsadmin]] interaktiv ausführen:


  xyz00@h03:~$ hsscript -i
<syntaxhighlight lang=shell>
  Password: *************
xyz00@h03:~$ hsscript -i
  xyz00@hsadmin>  
Password: *************
xyz00@hsadmin>
</syntaxhighlight>


In ''hsadmin'' werden User und E-Mail-Adresse angelegt.
In ''hsadmin'' werden User und E-Mail-Adresse angelegt.


  xyz00@hsadmin> user.add({set:{name:'xyz00-list',comment:'Mailingliste Discuss',shell:'/bin/bash',password:'geheimnis'}})
<syntaxhighlight lang=shell>
  xyz00@hsadmin> emailaddress.add({set:{target:'xyz00-list',localpart:'discuss',domain:'example.org'}})
xyz00@hsadmin> user.add({set:{name:'xyz00-list',comment:'Mailingliste Discuss',shell:'/bin/bash',password:'geheimnis'}})
  xyz00@hsadmin> bye
xyz00@hsadmin> emailaddress.add({set:{target:'xyz00-list',localpart:'discuss',domain:'example.org'}})
xyz00@hsadmin> bye
</syntaxhighlight>


Mit dem Parameter "target" wird die für diese Adresse eingehende Post zunächst in das Postfach des Users xyz00-list abgelegt.
Mit dem Parameter "target" wird die für diese Adresse eingehende Post zunächst in das Postfach des Users xyz00-list abgelegt.


Für den User xyz00-list lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis "mlmmj" an:
Für den User xyz00-list lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis <tt>mlmmj</tt> an:


  mkdir /home/pacs/xyz00/users/list/mlmmj
<syntaxhighlight lang=shell>
mkdir /home/pacs/xyz00/users/list/mlmmj
</syntaxhighlight>


Dann lege ich die Mailingliste mit folgendem Kommando an:
Dann lege ich die Mailingliste mit folgendem Kommando an:


  mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj
<syntaxhighlight lang=shell>
mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj
</syntaxhighlight>


Das Skript ''mlmmj-make-ml'' fragt weitere Parameter der Mailingliste ab:
Das Skript ''mlmmj-make-ml'' fragt weitere Parameter der Mailingliste ab:


  The Domain for the List? [] : example.org
<syntaxhighlight lang=output line>
  The emailaddress of the list owner? [postmaster] : webmaster@example.org
The Domain for the List? [] : example.org
  For the list texts you can choose between the following languages or
The emailaddress of the list owner? [postmaster] : webmaster@example.org
  give an absolute path to a directory containing the texts.
For the list texts you can choose between the following languages or
  Available languages:
give an absolute path to a directory containing the texts.
  cz  da de  en es  fr it  nl ru
Available languages:
  The path to texts for the list? [en] : de
cz  da de  en es  fr it  nl ru
The path to texts for the list? [en] : de
</syntaxhighlight>


Das skript ''mlmmj-make-ml'' legt daraufhin unter "/home/pacs/xyz00/users/list/mlmmj" ein Verzeichnis "discuss" an, das die Datenstruktur zur Verwaltung der Mailingliste enthält.
Das skript ''mlmmj-make-ml'' legt daraufhin unter "/home/pacs/xyz00/users/list/mlmmj" ein Verzeichnis "discuss" an, das die Datenstruktur zur Verwaltung der Mailingliste enthält.
Zeile 62: Zeile 70:
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im
Verzeichnis "/home/pacs/xyz00/users/list/mlmmj/discuss/control".
Verzeichnis "/home/pacs/xyz00/users/list/mlmmj/discuss/control".
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/TUNABLES.html Internetseite von mlmmj].


Damit mlmmj die Verteilung der Post übernimmt, muß ich im Heimat-Verzeichnis des users xyz00-list die Datei <tt>.forward</tt> mit folgenden Inhalt (INKLUSIVE der Anführungszeichen!) erstellen:
Damit mlmmj die Verteilung der Post übernimmt, muß ich im Heimat-Verzeichnis des users xyz00-list die Datei <tt>.forward</tt> mit folgenden Inhalt (INKLUSIVE der Anführungszeichen!) erstellen:


  "|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/"
<syntaxhighlight lang=shell>
"|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/"
</syntaxhighlight>


(Ja, ''receive'' schreibt sich mit ''-ei-'', aber mlmmj hält einen symbolischen Link bereit für diejenigen, die in englischer Rechtschreibung unsicher sind:)
(Ja, ''receive'' schreibt sich mit ''-ei-'', aber mlmmj hält einen symbolischen Link bereit für diejenigen, die in englischer Rechtschreibung unsicher sind:)


  xyz00-list@h03:~$ ls -la /usr/bin/mlmmj-rec*
<syntaxhighlight lang=shell>
  -rwxr-xr-x 1 root root 27104 Sep 25  2018 /usr/bin/mlmmj-receive
xyz00-list@h03:~$ ls -la /usr/bin/mlmmj-rec*
  lrwxrwxrwx 1 root root    13 Sep 25  2018 /usr/bin/mlmmj-recieve -> mlmmj-receive
-rwxr-xr-x 1 root root 27104 Sep 25  2018 /usr/bin/mlmmj-receive
lrwxrwxrwx 1 root root    13 Sep 25  2018 /usr/bin/mlmmj-recieve -> mlmmj-receive
</syntaxhighlight>


Die <tt>.forward</tt>-Datei sorgt dafür, dass eingehende E-Mails an das User-Postfach an das Programm ''mlmmj-recieve'' übergeben werden.
Die <tt>.forward</tt>-Datei sorgt dafür, dass eingehende E-Mails an das User-Postfach an das Programm ''mlmmj-recieve'' übergeben werden.


Für regelmäßige Aufgaben der Listen-Managers definiere ich die
Für regelmäßige Aufgaben der Listen-Managers definiere ich die
crontab wie folgt (immer noch als ''xyz00-list''):
[[Cron|crontab]] wie folgt (immer noch als ''xyz00-list''):


   xyz00-list@h03:~$ crontab -e
   xyz00-list@h03:~$ crontab -e


MAILTO=webmaster@example.org
<syntaxhighlight lang=shell line>
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
MAILTO=webmaster@example.org
HOME=/home/pacs/xyz00/users/list
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
HOME=/home/pacs/xyz00/users/list
LANG=en_US.UTF-8
SHELL=/bin/bash
# m h  dom mon dow  command
LANG=en_US.UTF-8
28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F
# m h  dom mon dow  command
28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F
</syntaxhighlight>


Zum Schluss rufe ich das Skript mlmmj-sub auf, um die E-Mail-Adressen der gewünschten Abonnenten des Verteilers einzutragen:
Zum Schluss rufe ich das Skript mlmmj-sub auf, um die E-Mail-Adressen der gewünschten Abonnenten des Verteilers einzutragen:


/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c  
<syntaxhighlight lang=shell>
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c  
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c  
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c  
</syntaxhighlight>


Dabei bewirkt "-c", dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man "-C" (großes C) angeben: dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.
Dabei bewirkt "-c", dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man "-C" (großes C) angeben: dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.


=== weitere Konfiguration ===
== weitere Optionen ==


Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:
Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:
Zeile 102: Zeile 118:
Ein Prefix in der Betreffzeile setzen, z.B.: "[discuss]".
Ein Prefix in der Betreffzeile setzen, z.B.: "[discuss]".


echo "[discuss]" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix
<syntaxhighlight lang=shell>
echo "[discuss]" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix
</syntaxhighlight>


Wenn die Liste nur E-Mails von eingetragenen Abonnenten weiterleiten soll:
Wenn die Liste nur E-Mails von eingetragenen Abonnenten weiterleiten soll:


touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost
<syntaxhighlight lang=shell>
touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost
</syntaxhighlight>


Damit der Listen-Owner weitere Abonnements bestätigen muss:
Damit der Listen-Owner weitere Abonnements bestätigen muss:


touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod
<syntaxhighlight lang=shell>
touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod
</syntaxhighlight>


Einen "Reply-To:"-Header setzen, damit Antwort-Mails standardmäßig an die Mailing-Liste gehen:
Einen "Reply-To:"-Header setzen, damit Antwort-Mails standardmäßig an die Mailing-Liste gehen:


  echo "Reply-To:" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders
<syntaxhighlight lang=shell>
  echo "Reply-To: discuss@example.org" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders
echo "Reply-To:" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders
echo "Reply-To: discuss@example.org" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders
</syntaxhighlight>
 
Beim Massenversand, z.B. bei Newslettern, nutzen Sie bitte möglichst den dedizierten Postausgangsserver für den Massenversand. Dadurch tragen Sie dazu bei, die Reputation unserer regulären Ausgangsserver aufrechtzuerhalten.
 
Um dies zu tun, setzen Sie den SMTP-Port entsprechend:
 
<syntaxhighlight lang=shell>
echo "4025" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/smtpport
</syntaxhighlight>
 
Weitere Konfigurationsvariante des Ausgangsserver sind unter https://www.hostsharing.net/doc/managed-operations-platform/email/ zu finden.


Weitere Möglichkeiten finden Sie (wie oben bereits angegeben)  
Weitere Möglichkeiten finden Sie (wie oben bereits angegeben)  
auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].
auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].


=== Konfiguration im Browser ===
=== Achtung: DKIM ===
 
Mlmmj gibt die Möglichkeit, mit '''delheaders''' und '''customheaders''' die Header der durchgeleiteten Mail umfangreich zu ändern. Allerdings tragen Mails heute häufig kryptografische Signaturen der sendenden Mailserver. Eine DKIM-Signatur sichert damit in der Regel die Integrität des Body der Mail sowie der Header ''Subject:'', ''From:'', ''To:'', ''Date:'', ''From'', und oft auch ''Reply-To:''.
 
Wird zum Beispiel mit einem Prefix das Subject geändert oder ein Footer angehängt, macht dies die DKIM-Signatur ungültig. Das ist für viele Mailprovider ein Grund die Nachricht abzuweisen. (siehe auch Diskussions-Seite zum Artikel)
 
== Zur Konfiguration im Browser ==


Die Original-Distribution von ''mlmmj'' enthält ein paar einfache PHP- und Perl-Skripte.  Das sind Beispiele für Subscribe-/Unsubscribe-Formulare, ein Admin-Formular zum Eintragen und Löschen von Abonnements und eine Seite mit der gesamten Listen-Konfiguration.
Die Original-Distribution von ''mlmmj'' enthält ein paar einfache PHP- und Perl-Skripte.  Das sind Beispiele für Subscribe-/Unsubscribe-Formulare, ein Admin-Formular zum Eintragen und Löschen von Abonnements und eine Seite mit der gesamten Listen-Konfiguration.
Zeile 127: Zeile 167:


Als Paket-Admin eine Domain aufschalten:
Als Paket-Admin eine Domain aufschalten:
 
<syntaxhighlight lang=shell>
hsscript -u xyz00 -e "domain.add({set:{name:'lists.example.org',user:'xyz00-list'}})"
hsscript -u xyz00 -e "domain.add({set:{name:'lists.example.org',user:'xyz00-list'}})"
 
</syntaxhighlight>
Und weiter als "xyz00-list".
Und weiter als "xyz00-list".


Download der neuesten Version der Sourcen von mlmmj von http://mlmmj.org/downloads/ und diese in einem temporären Verzeichnis entpacken.
Download der neuesten Version der Sourcen von mlmmj von http://mlmmj.org/downloads/ (noch besser: Download des aktuellen Debian-Pakets von [https://packages.debian.org/bookworm/all/mlmmj-php-web-admin/download debian.org]: da sind einige veraltete PHP-Ausdrücke schon herausgepatcht) und diese in einem temporären Verzeichnis entpacken (mit tar oder dpkg-deb).


Unter "/mlmmj-$versionsnummer/contrib/web/php-admin/" findet sich die PHP-Admin-Anwendung.
Unter "/mlmmj-$versionsnummer/contrib/web/php-admin/", oder beim .deb-Paket unter "usr/share/mlmmj-...", findet sich die PHP-Admin-Anwendung. Also ...


Also den Inhalt diese Verzeichnisses nach "/home/pacs/xyz00/users/list/doms/lists.example.org/" packen,
* den Inhalt diese Verzeichnisses nach "/home/pacs/xyz00/users/list/doms/lists.example.org/" packen;
* in "/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php" die Variable "$topdir" anpassen
* in "/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php" die Variable "$topdir" anpassen;
* die Dateien aus "/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/" nach "/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/" verschieben
* die Dateien aus "/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/" nach "/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/" verschieben;
* Beim .deb-Paket die config.php, die templates/ und die tunables.pl aus etc/ nach example.org/conf/ verschieben;
* in "/home/pacs/xyz00/users/list/mlmmj" und in "/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/" eine ".htaccess" mit folgendem Inhalt ablegen:  
* in "/home/pacs/xyz00/users/list/mlmmj" und in "/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/" eine ".htaccess" mit folgendem Inhalt ablegen:  
<syntaxhighlight lang=apache line>
Require valid-user
Require valid-user
AuthType Basic
AuthType Basic
AuthName "mlmmj web-interface"
AuthName "mlmmj web-interface"
AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd
AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd
 
</syntaxhighlight>
Und schließlich die "htpasswd"-Datei anlegen.
* Und schließlich die "htpasswd"-Datei anlegen.


  cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/
  cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/
  htpasswd -c htpasswd listadmin
  htpasswd -c htpasswd listadmin


Ein Passwort angeben und auf
* Ein Passwort angeben.
https://lists.example.org schauen.
 
Nun enthält diese PHP-Anwendung, wenn man sie nicht dem Debian-Paket entnommen hat, leider noch eine Zeile, die schon seit PHP 7 nicht mehr lauffähig ist. Also muß man noch
 
* in <tt>.../htdocs-ssl/index.php</tt> folgende Änderung vornehmen:
<syntaxhighlight lang=diff line>
@@ -38,4 +38,5 @@
# use scandir to have alphabetical order
foreach (scandir($topdir) as $file) {
-    if (!ereg("^\.",$file))
+# ereg obsolete!! Vormals:    if (!ereg("^\.",$file))
+    if (!preg_match('/^\./',$file))
    {
</syntaxhighlight>
und das Ergebnis auf https://lists.example.org anschauen.


== Mehrere Mailinglisten betreiben ==
== Mehrere Mailinglisten betreiben ==
Zeile 158: Zeile 212:
Wenn mehrere Mailinglisten in einem Account und mit einer Admin-Oberfläche betrieben werden soll, empfiehlt sich die Nutzung von Procmail für den Aufruf von ''mlmmj'' für die jeweiligen Liste mit ihrem Daten-Verzeichnis.
Wenn mehrere Mailinglisten in einem Account und mit einer Admin-Oberfläche betrieben werden soll, empfiehlt sich die Nutzung von Procmail für den Aufruf von ''mlmmj'' für die jeweiligen Liste mit ihrem Daten-Verzeichnis.


Dazu trägt man in der Date ''.forward'' statt des Aufrufs von ''mlmmj-recieve'' einen Aufruf von ''procmail'' ein:
Dazu trägt man in der Datei <tt>.forward</tt> statt des Aufrufs von ''mlmmj-recieve'' einen Aufruf von ''procmail'' ein:
 


|/usr/bin/procmail
<syntaxhighlight lang=shell>
|/usr/bin/procmail
</syntaxhighlight>


Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei ''.procmailrc'' mit folgendem Inhalt ins $HOME des Users:
Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei <tt>.procmailrc</tt> mit folgendem Inhalt ins $HOME des Users:


SHELL=/bin/sh
<syntaxhighlight lang=shell>
HOMEDIR=/home/pacs/xyz00/users/list
SHELL=/bin/sh
MAILDIR=/home/pacs/xyz00/users/list/Maildir
HOMEDIR=/home/pacs/xyz00/users/list
PMDIR=/home/pacs/xyz00/users/list
MAILDIR=/home/pacs/xyz00/users/list/Maildir
VERBOSE=yes
PMDIR=/home/pacs/xyz00/users/list
LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log
VERBOSE=yes
DEFAULT
LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log
DEFAULT
   
   
:0:
:0:
* ^X-Original-To: ()\/[^@+]+
* ^X-Original-To: ()\/[^@+]+
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/
   
   
:0
:0
{ EXITCODE 67 }
{ EXITCODE 67 }
</syntaxhighlight>


Bitte dafür sorgen, dass das Verzeichnis ''/home/pacs/xyz00/users/list/var'' existiert.


Der kryptische reguläre Ausdruck hinter dem Header ''X-Original-To:'' passt auf den Beginn der E-Mail-Adresse bis zum ersten ''@''- oder ''+''-Zeichen. In der Variable ''MATCH'' steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.
Der kryptische reguläre Ausdruck hinter dem Header ''X-Original-To:'' passt auf den Beginn der E-Mail-Adresse bis zum ersten ''@''- oder ''+''-Zeichen. In der Variable ''MATCH'' steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.


Sehr wichtig ist die Zeile ''DEFAULT'' zu Beginn der ''.procmailrc''. Die Variable ''DEFAULT'' wird von ''procmail'' gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von ''mlmmj'' benutzt, wenn sie gesetzt ist. Das führt in Kombination mit ''procmail'' zu Fehlfunktionen (vgl. Links).
Sehr wichtig ist die Zeile ''DEFAULT'' zu Beginn der ''.procmailrc''. Die Variable ''DEFAULT'' wird von ''procmail'' gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von ''mlmmj'' benutzt, wenn sie gesetzt ist. Das führt in Kombination mit ''procmail'' zu Fehlfunktionen (vgl. Links).
===Groß- und Kleinschreibung===
Achtung, mit der Groß- und Kleinschreibung von Listennamen gibt es bei dieser Procmail-Lösung eine kleine Tücke. Procmail übernimmt in die Variable $MATCH genau die in der X-Original-To-Headerzeile vorgefundene Schreibweise, und diese kann denkbarerweise "Listen-Name" oder "listen-name" oder "Listen-name" sein. <tt>mlmmj</tt> hingegen wird diesen Wert in Unix-Manier mit dem genauen Verzeichnisnamen <tt>${HOME}/mlmmj/listen-name</tt> vergleichen, und bei unterschiedlicher Schreibweise die Mail nicht verteilen.
====Lösung 1====
Eine teilweise Lösung besteht darin, den Listennamen in dem <tt>mlmmj</tt>-Aufruf in der <tt>.procmailrc</tt> in Kleinbuchstaben umzuschreiben. Dann lautet das Rezept so:
<syntaxhighlight lang=shell>
:0:
* ^X-Original-To: ()\/[^@+]+
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/$(echo ${MATCH} | tr [:upper:] [:lower:])/
</syntaxhighlight>
Der Rest der Datei muß gleich bleiben, wie weiter oben angezeigt.
In diesem Fall müssen aber alle Mailing-Listen ohne Großbuchstaben im Namen angelegt werden!
(Man kann auch in <tt>${HOME}/mlmmj/</tt> durch kleingeschriebene Symlinks großgeschriebene Listennamen ansprechbar machen:
<syntaxhighlight lang=output>
xyz00-list@h02:~$ ls -lA mlmmj/
total 8
-rw-r--r--  1 xyz00-list xyz00  148 Feb  1 16:56 .htaccess
lrwxrwxrwx  1 xyz00-list xyz00  10 Feb  2 18:01 mitglieder -> Mitglieder
drwxr-xr-x 15 xyz00-list xyz00 4096 Feb  2 16:53 Mitglieder
</syntaxhighlight>
====Lösung 2====
Bash kann bei der Auflösung von Variablen die Groß- und Kleinschreibung manipulieren. (Siehe dazu bei der Zeichenfolge <tt>,,</tt> in <tt>man bash</tt>.) Dann ist <tt>$(echo ${MATCH} | tr [:upper:] [:lower:])</tt> gleichbedeutend mit <tt>${MATCH,,}</tt>. Allerdings braucht procmail einige Überredung, um Bash zu verwenden.
<syntaxhighlight lang=shell>
SHELL=/bin/bash
SHELLMETAS=&|<>~;?*[{
HOMEDIR= ...
...
:0:
* ^X-Original-To: ()\/[^@+]+
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH,,}/
</syntaxhighlight>
Die Tücke ist, daß procmail den in SHELL angegebenen Shell nur dann verwendet, wenn die Befehlszeile eines der in SHELLMETAS angegebenen Zeichen enthält. Und das '|' am Anfang der Zeile zählt dabei nicht! In diesem Beispiel ist es das Zeichen <tt>{</tt>, das den Einsatz von Bash auslöst.
Beide Lösungen scheinen zu funktionieren; Angabe ohne Gewähr.


== Links ==
== Links ==
Zeile 189: Zeile 297:
* https://codeberg.org/mlmmj mlmmj auf Codeberg
* https://codeberg.org/mlmmj mlmmj auf Codeberg
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS
* https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ Nutzung von mlmmj in Verbindung mit Procmail
* [https://web.archive.org/web/20221228110514/https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ https://www.tablix.org/~avian/blog/archives/2010/04/the_faulty_default/ (via web.archive.org)] Nutzung von mlmmj in Verbindung mit Procmail
* [https://gist.github.com/kboss/7c9593f0fd9219406226c4f11256b98a Einfaches Python-Script zum Massenimport aus einem Texfile.] Geht bestimmt auch eleganter mit purem Bash
* Ein Self-Service zum Subscriben/Unsubscriben lässt sich in Form von Mail-to-Links in Webseiten einbinden. Beispiele gibt es bei Hostsharing für die öffentlichen "public"-Mailinglisten: https://www.hostsharing.net/lists/public-discussion/ . Alternativ auf https://github.com/hblasum/mlmmj-php-web-simplified ein Webfrontend mit dem sich Benutzerinnen und Benutzer selbst ein-/austragen können (Vereinfachung von mlmmj-php-web von Christoph Thiel).


----
----

Aktuelle Version vom 5. November 2024, 11:48 Uhr

mlmmj, angeblich eine Abkürzung für "Mailing List Management Made Joyful", ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.

Wer noch nicht weiß, was ein E-Mail-Verteiler machen soll oder wie, lese vielleicht auch den Wikipedia-Artikel: Mailingliste

Eine leistungsfähigere Alternative zu mlmmj könnte Mailman 3 sein.

Diese Anleitung beschreibt die Einrichtung einer Mailingliste für eine Domain in einem Hostsharing-Webspace.

Voraussetzungen

Das Debian Paket mlmmj ist auf den Shared-Hosting-Servern bereits installiert. (Wer die Software selbst kompilieren möchte kann aktuellen Source-Code bei codeberg.org finden.)

Für den Betrieb der Mailingliste empfiehlt sich das Anlegen eines eigenen Users für diesen Zweck mit hsadmin.

In dieser Anleitung heißt das Paket xyz00 und der für Mailinglisten eingesetzte User xyz00-list.

Die E-Mail-Adresse der einzurichtende Mailing-Liste soll discuss@example.org sein. Den lokalen Teil dieser Adresse, discuss, ist der Listenname. Der Listenname darf auf keinen Fall das Plus-Zeichen (+) enthalten, weil dies ein Sonderbedeutung für die Listensteuerung hat: mlmmj wird nämlich Befehle der Abonnenten über erweiterte Adressen annehmen, wie z.B. discuss+help@example.org.

Die Domain example.org muss dazu bei einem beliebigen User im Paket xyz00 aufgeschaltet sein. ("Aufgeschaltet" bedeutet, daß diese Domain bei Hostsharing gehostet wird und der Domainname als Verzeichnis /home/pacs/xyz00/*User*/doms/example.org/ erscheint.)

Einrichtung

Ich melde mich über SSH auf der Hostsharing-Console als der Paketuser xyz00 an.

Im Shell kann ich dann durch den Befehl hsscript -i das Verwaltungswerkzeug hsadmin interaktiv ausführen:

xyz00@h03:~$ hsscript -i
Password: *************
xyz00@hsadmin>

In hsadmin werden User und E-Mail-Adresse angelegt.

xyz00@hsadmin> user.add({set:{name:'xyz00-list',comment:'Mailingliste Discuss',shell:'/bin/bash',password:'geheimnis'}})
xyz00@hsadmin> emailaddress.add({set:{target:'xyz00-list',localpart:'discuss',domain:'example.org'}})
xyz00@hsadmin> bye

Mit dem Parameter "target" wird die für diese Adresse eingehende Post zunächst in das Postfach des Users xyz00-list abgelegt.

Für den User xyz00-list lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis mlmmj an:

mkdir /home/pacs/xyz00/users/list/mlmmj

Dann lege ich die Mailingliste mit folgendem Kommando an:

mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj

Das Skript mlmmj-make-ml fragt weitere Parameter der Mailingliste ab:

The Domain for the List? [] : example.org
The emailaddress of the list owner? [postmaster] : webmaster@example.org
For the list texts you can choose between the following languages or
give an absolute path to a directory containing the texts.
Available languages:
cz  da	de  en	es  fr	it  nl	ru
The path to texts for the list? [en] : de

Das skript mlmmj-make-ml legt daraufhin unter "/home/pacs/xyz00/users/list/mlmmj" ein Verzeichnis "discuss" an, das die Datenstruktur zur Verwaltung der Mailingliste enthält.

Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im Verzeichnis "/home/pacs/xyz00/users/list/mlmmj/discuss/control". Die Konfigurationsmöglichkeiten finden Sie auf der Internetseite von mlmmj.

Damit mlmmj die Verteilung der Post übernimmt, muß ich im Heimat-Verzeichnis des users xyz00-list die Datei .forward mit folgenden Inhalt (INKLUSIVE der Anführungszeichen!) erstellen:

"|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/"

(Ja, receive schreibt sich mit -ei-, aber mlmmj hält einen symbolischen Link bereit für diejenigen, die in englischer Rechtschreibung unsicher sind:)

xyz00-list@h03:~$ ls -la /usr/bin/mlmmj-rec*
-rwxr-xr-x 1 root root 27104 Sep 25  2018 /usr/bin/mlmmj-receive
lrwxrwxrwx 1 root root    13 Sep 25  2018 /usr/bin/mlmmj-recieve -> mlmmj-receive

Die .forward-Datei sorgt dafür, dass eingehende E-Mails an das User-Postfach an das Programm mlmmj-recieve übergeben werden.

Für regelmäßige Aufgaben der Listen-Managers definiere ich die crontab wie folgt (immer noch als xyz00-list):

 xyz00-list@h03:~$ crontab -e
MAILTO=webmaster@example.org
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/home/pacs/xyz00/users/list
SHELL=/bin/bash
LANG=en_US.UTF-8
# m h  dom mon dow   command
28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F

Zum Schluss rufe ich das Skript mlmmj-sub auf, um die E-Mail-Adressen der gewünschten Abonnenten des Verteilers einzutragen:

/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c 
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c

Dabei bewirkt "-c", dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man "-C" (großes C) angeben: dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.

weitere Optionen

Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:

Ein Prefix in der Betreffzeile setzen, z.B.: "[discuss]".

echo "[discuss]" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix

Wenn die Liste nur E-Mails von eingetragenen Abonnenten weiterleiten soll:

touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost

Damit der Listen-Owner weitere Abonnements bestätigen muss:

touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod

Einen "Reply-To:"-Header setzen, damit Antwort-Mails standardmäßig an die Mailing-Liste gehen:

echo "Reply-To:" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders
echo "Reply-To: discuss@example.org" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders

Beim Massenversand, z.B. bei Newslettern, nutzen Sie bitte möglichst den dedizierten Postausgangsserver für den Massenversand. Dadurch tragen Sie dazu bei, die Reputation unserer regulären Ausgangsserver aufrechtzuerhalten.

Um dies zu tun, setzen Sie den SMTP-Port entsprechend:

echo "4025" > /home/pacs/xyz00/users/list/mlmmj/discuss/control/smtpport

Weitere Konfigurationsvariante des Ausgangsserver sind unter https://www.hostsharing.net/doc/managed-operations-platform/email/ zu finden.

Weitere Möglichkeiten finden Sie (wie oben bereits angegeben) auf der Internetseite von mlmmj.

Achtung: DKIM

Mlmmj gibt die Möglichkeit, mit delheaders und customheaders die Header der durchgeleiteten Mail umfangreich zu ändern. Allerdings tragen Mails heute häufig kryptografische Signaturen der sendenden Mailserver. Eine DKIM-Signatur sichert damit in der Regel die Integrität des Body der Mail sowie der Header Subject:, From:, To:, Date:, From, und oft auch Reply-To:.

Wird zum Beispiel mit einem Prefix das Subject geändert oder ein Footer angehängt, macht dies die DKIM-Signatur ungültig. Das ist für viele Mailprovider ein Grund die Nachricht abzuweisen. (siehe auch Diskussions-Seite zum Artikel)

Zur Konfiguration im Browser

Die Original-Distribution von mlmmj enthält ein paar einfache PHP- und Perl-Skripte. Das sind Beispiele für Subscribe-/Unsubscribe-Formulare, ein Admin-Formular zum Eintragen und Löschen von Abonnements und eine Seite mit der gesamten Listen-Konfiguration.

Wer es sich ansehen möchte:

Als Paket-Admin eine Domain aufschalten:

hsscript -u xyz00 -e "domain.add({set:{name:'lists.example.org',user:'xyz00-list'}})"

Und weiter als "xyz00-list".

Download der neuesten Version der Sourcen von mlmmj von http://mlmmj.org/downloads/ (noch besser: Download des aktuellen Debian-Pakets von debian.org: da sind einige veraltete PHP-Ausdrücke schon herausgepatcht) und diese in einem temporären Verzeichnis entpacken (mit tar oder dpkg-deb).

Unter "/mlmmj-$versionsnummer/contrib/web/php-admin/", oder beim .deb-Paket unter "usr/share/mlmmj-...", findet sich die PHP-Admin-Anwendung. Also ...

  • den Inhalt diese Verzeichnisses nach "/home/pacs/xyz00/users/list/doms/lists.example.org/" packen;
  • in "/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php" die Variable "$topdir" anpassen;
  • die Dateien aus "/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/" nach "/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/" verschieben;
  • Beim .deb-Paket die config.php, die templates/ und die tunables.pl aus etc/ nach example.org/conf/ verschieben;
  • in "/home/pacs/xyz00/users/list/mlmmj" und in "/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/" eine ".htaccess" mit folgendem Inhalt ablegen:
Require valid-user
AuthType Basic
AuthName "mlmmj web-interface"
AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd
  • Und schließlich die "htpasswd"-Datei anlegen.
cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/
htpasswd -c htpasswd listadmin
  • Ein Passwort angeben.

Nun enthält diese PHP-Anwendung, wenn man sie nicht dem Debian-Paket entnommen hat, leider noch eine Zeile, die schon seit PHP 7 nicht mehr lauffähig ist. Also muß man noch

  • in .../htdocs-ssl/index.php folgende Änderung vornehmen:
@@ -38,4 +38,5 @@
 # use scandir to have alphabetical order 
 foreach (scandir($topdir) as $file) {
-    if (!ereg("^\.",$file))
+# ereg obsolete!! Vormals:    if (!ereg("^\.",$file))
+    if (!preg_match('/^\./',$file))
     {

und das Ergebnis auf https://lists.example.org anschauen.

Mehrere Mailinglisten betreiben

Wenn mehrere Mailinglisten in einem Account und mit einer Admin-Oberfläche betrieben werden soll, empfiehlt sich die Nutzung von Procmail für den Aufruf von mlmmj für die jeweiligen Liste mit ihrem Daten-Verzeichnis.

Dazu trägt man in der Datei .forward statt des Aufrufs von mlmmj-recieve einen Aufruf von procmail ein:


|/usr/bin/procmail

Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei .procmailrc mit folgendem Inhalt ins $HOME des Users:

SHELL=/bin/sh
HOMEDIR=/home/pacs/xyz00/users/list
MAILDIR=/home/pacs/xyz00/users/list/Maildir
PMDIR=/home/pacs/xyz00/users/list
VERBOSE=yes
LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log
DEFAULT
 
:0:
* ^X-Original-To: ()\/[^@+]+
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/
 
:0
{ EXITCODE 67 }

Bitte dafür sorgen, dass das Verzeichnis /home/pacs/xyz00/users/list/var existiert.

Der kryptische reguläre Ausdruck hinter dem Header X-Original-To: passt auf den Beginn der E-Mail-Adresse bis zum ersten @- oder +-Zeichen. In der Variable MATCH steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.

Sehr wichtig ist die Zeile DEFAULT zu Beginn der .procmailrc. Die Variable DEFAULT wird von procmail gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von mlmmj benutzt, wenn sie gesetzt ist. Das führt in Kombination mit procmail zu Fehlfunktionen (vgl. Links).

Groß- und Kleinschreibung

Achtung, mit der Groß- und Kleinschreibung von Listennamen gibt es bei dieser Procmail-Lösung eine kleine Tücke. Procmail übernimmt in die Variable $MATCH genau die in der X-Original-To-Headerzeile vorgefundene Schreibweise, und diese kann denkbarerweise "Listen-Name" oder "listen-name" oder "Listen-name" sein. mlmmj hingegen wird diesen Wert in Unix-Manier mit dem genauen Verzeichnisnamen ${HOME}/mlmmj/listen-name vergleichen, und bei unterschiedlicher Schreibweise die Mail nicht verteilen.

Lösung 1

Eine teilweise Lösung besteht darin, den Listennamen in dem mlmmj-Aufruf in der .procmailrc in Kleinbuchstaben umzuschreiben. Dann lautet das Rezept so:

:0:
* ^X-Original-To: ()\/[^@+]+
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/$(echo ${MATCH} | tr [:upper:] [:lower:])/

Der Rest der Datei muß gleich bleiben, wie weiter oben angezeigt.

In diesem Fall müssen aber alle Mailing-Listen ohne Großbuchstaben im Namen angelegt werden!

(Man kann auch in ${HOME}/mlmmj/ durch kleingeschriebene Symlinks großgeschriebene Listennamen ansprechbar machen:

xyz00-list@h02:~$ ls -lA mlmmj/
total 8
-rw-r--r--  1 xyz00-list xyz00  148 Feb  1 16:56 .htaccess
lrwxrwxrwx  1 xyz00-list xyz00   10 Feb  2 18:01 mitglieder -> Mitglieder
drwxr-xr-x 15 xyz00-list xyz00 4096 Feb  2 16:53 Mitglieder

Lösung 2

Bash kann bei der Auflösung von Variablen die Groß- und Kleinschreibung manipulieren. (Siehe dazu bei der Zeichenfolge ,, in man bash.) Dann ist $(echo ${MATCH} | tr [:upper:] [:lower:]) gleichbedeutend mit ${MATCH,,}. Allerdings braucht procmail einige Überredung, um Bash zu verwenden.

SHELL=/bin/bash
SHELLMETAS=&|<>~;?*[{
HOMEDIR= ...

...

:0:
* ^X-Original-To: ()\/[^@+]+
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH,,}/

Die Tücke ist, daß procmail den in SHELL angegebenen Shell nur dann verwendet, wenn die Befehlszeile eines der in SHELLMETAS angegebenen Zeichen enthält. Und das '|' am Anfang der Zeile zählt dabei nicht! In diesem Beispiel ist es das Zeichen {, das den Einsatz von Bash auslöst.

Beide Lösungen scheinen zu funktionieren; Angabe ohne Gewähr.

Links