Mailman Installieren: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
K (Nur example.com ist als Beispielsdomainname freigegeben.)
KKeine Bearbeitungszusammenfassung
 
(22 dazwischenliegende Versionen von 8 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Mailman installieren ==  
Achtung! Mailman 2 benötigt Python 2.7; das wird von den bei Hostsharing aktiven aktuellen Debian GNU/Linux-Betriebssystemen '''nicht mehr unterstützt'''.
 
Alternativen sind [[Mailman_3_installieren|Mailman 3]] und [[mlmmj]].
 
Adieu, Mailman 2, es war sehr schön mit dir.
 
 
== Vorab: Die Wahl von Mailman 2 ==
 
Mailman 2 hängt von Python 2.7 ab und wird damit voraussichtlich nur noch eine begrenzte Nutzungsdauer haben. Mailman 3 ist jetzt verfügbar (siehe [[Mailman_3_installieren]]), aber deutlich schwerer und komplexer im Betrieb. Es gibt auch weniger leistungsfähige Software, um E-Mail-Verteiler zu betreiben, wie beispielsweise [[mlmmj]]. Für eine Diskussion der Situation im Oktober 2019, siehe das HS-Support-Archiv ab [https://lists.hostsharing.net/archiv/support/2019-October/067243.html hier.]
 
== Mailman 2 installieren ==  


(zuletzt getestet mit mailman-2.1.29; Installation durch Paketuser)
(zuletzt getestet mit mailman-2.1.29; Installation durch Paketuser)


Vielen Dank an alle Benutzer die Verbesserungen beisteuern!
Vielen Dank an alle Benutzer, die Verbesserungen beisteuern!
 
=== Unter welchem Account installieren? ===


Mailman kann vom Paketadmin (beipsielsweise "xyz00") oder von einem Paketuser (bspw. "xyz00-listen") installiert werden. Letzteres ist dringend empfohlen, denn Mailman vom Paketadmin installiert wird, haben ausnahmslos alle Paketuser direkten Zugriff auf die Mailman-Daten, und bei Sicherheitslücken in Mailman wäre eventuell eine Rechte-Eskalierung auf Paketadmin-Ebene potentiell zu befürchten.
Mailman kann vom Paketadmin (beipsielsweise "xyz00") oder von einem Paketuser (bspw. "xyz00-listen") installiert werden. Letzteres ist dringend empfohlen, denn wenn Mailman vom Paketadmin installiert wird, haben ausnahmslos alle Paketuser direkten Zugriff auf die Mailman-Daten, und bei Sicherheitslücken in Mailman wäre eventuell eine Rechte-Eskalierung auf Paketadmin-Ebene potentiell zu befürchten.


Dem Paketuser, unter dem Mailman installiert wird, können mehrere Subdomains aufschaltet werden, und Mailinglisten können auch die Domainnamen verwenden, die anderen Paketusern gehören.
Dem Paketuser, unter dem Mailman installiert wird, können mehrere Subdomains aufschaltet werden, und Mailinglisten können auch die Domainnamen verwenden, die anderen Paketusern gehören.
Zeile 17: Zeile 30:
Unter admin.hostsharing.net als xyz00 anmelden; den User xyz00-listen erzeugen; die Domain listen.example.com mit "Domain-User" xyz00-listen anlegen. Aus admin.hostsharing.net abmelden.
Unter admin.hostsharing.net als xyz00 anmelden; den User xyz00-listen erzeugen; die Domain listen.example.com mit "Domain-User" xyz00-listen anlegen. Aus admin.hostsharing.net abmelden.


Mit [[Login_mit_SSH|SSH]] an hostsharing.net als xyz00-listen anmelden. Die Redirect-Zeile aus ~/doms/listen.example.com/htdocs-ssl/.htaccess löschen:
Mit [[Login_mit_SSH|SSH]] an hostsharing.net als xyz00-listen anmelden. Die Redirect-Zeile aus <tt><nowiki>~/doms/listen.example.com/htdocs-ssl/.htaccess</nowiki></tt> löschen:


~$ echo "" > ~/doms/lists.example.com/htdocs-ssl/.htaccess
<syntaxhighlight lang="bash">
echo "" > ~/doms/listen.example.com/htdocs-ssl/.htaccess
</syntaxhighlight>


Die Default-Subdomains www.* löschen:
Die Default-Subdomains www.* löschen:


  ~$ rm -r doms/listen.example.com/subs/www/
<syntaxhighlight lang="bash">
  ~$ rm -r doms/listen.example.com/subs-ssl/www/
rm -r doms/listen.example.com/subs/www/
rm -r doms/listen.example.com/subs-ssl/www/
</syntaxhighlight>


=== Sourcen besorgen und entpacken ===
=== Sourcen besorgen und entpacken ===


Unter http://www.gnu.org/software/mailman/ die aktuelle Software besorgen. Dort findet sich ein Link zu den Mailman 2 Versionen (http://ftp.gnu.org/gnu/mailman/). Die letzte Version downloaden ...
Unter http://www.gnu.org/software/mailman/ die aktuelle Software besorgen. Dort findet sich ein Link zu den 2er-Versionen von Mailman (http://ftp.gnu.org/gnu/mailman/). Die letzte Version downloaden ...


~$ wget http://ftp.gnu.org/gnu/mailman/mailman-2.1.29.tgz
<syntaxhighlight lang="bash">
wget http://ftp.gnu.org/gnu/mailman/mailman-2.1.29.tgz
</syntaxhighlight>


... und entpacken:
... und entpacken:


~$ tar -xzvf mailman-2.1.29.tgz
<syntaxhighlight lang="bash">
tar -xzvf mailman-2.1.29.tgz
</syntaxhighlight>


Ab diesem Augenblick gibt es ein Verzeichnis namens mailman-2.1.29/. Darin liegt die nunmehr entpackte ''Quellcode'' der Mailman-Software. Nach dem Kompilieren (folgt unten) wird die fertig kompilierte, gebrauchsfähige Mailman-Software in dem zusätzlich vorhandenen Verzeichnis mailman/ liegen. (Dieses Verzeichnis wird beim Konfigurieren der Source als "prefix" angegeben.)
Ab diesem Augenblick gibt es ein Verzeichnis namens <tt>mailman-2.1.29/</tt>. Darin liegt die nunmehr entpackte ''Quellcode'' der Mailman-Software. Nach dem Kompilieren (folgt unten) wird die fertig kompilierte, gebrauchsfähige Mailman-Software in dem zusätzlich vorhandenen Verzeichnis <tt>mailman/</tt> liegen. (Dieses Verzeichnis wird beim Konfigurieren der Source als "prefix" angegeben.)


=== var-Verzeichnis für Log-Dateien anlegen ===
=== var-Verzeichnis für Log-Dateien anlegen ===


Bei der Installation als Paketuser (xyz00-listen):
Bei der Installation als Paketuser (xyz00-listen):
~$ cd && mkdir -p mailman/var
<syntaxhighlight lang="bash">
~$ chmod 02775 mailman/var
cd && mkdir -p mailman/var
chmod 02775 mailman/var
</syntaxhighlight>


Bei der Installation als Paketadmin (xyz00):
Bei der Installation als Paketadmin (xyz00):
~$ cd && mkdir var/mailman
<syntaxhighlight lang="bash">
~$ chmod 02775 var/mailman
cd && mkdir var/mailman
chmod 02775 var/mailman
</syntaxhighlight>


=== Mailman konfigurieren ===
=== Mailman konfigurieren ===
Zeile 52: Zeile 77:
In das Source-Verzeichnis wechseln:
In das Source-Verzeichnis wechseln:


~$ cd mailman-2.1.29
<syntaxhighlight lang="bash">
cd mailman-2.1.29
</syntaxhighlight>


Bei der Installation als Paketuser:
Bei der Installation durch den Paketuser (xyz00-listen):
      ~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/users/listen/mailman \
<syntaxhighlight lang="bash">
              --with-username=xyz00-listen \
~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/users/listen/mailman \
              --with-groupname=xyz00 \
        --with-username=xyz00-listen \
              --with-var-prefix=/home/pacs/xyz00/users/listen/mailman/var \
        --with-groupname=xyz00 \
              --with-cgi-gid=xyz00 \
        --with-var-prefix=/home/pacs/xyz00/users/listen/mailman/var \
              --with-mail-gid=xyz00
        --with-cgi-gid=xyz00 \
        --with-mail-gid=xyz00
</syntaxhighlight>


Bei der Installation als Paketadmin:
Bei der Installation durch den Paketadmin (xyz00):
      ~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/mailman \
<syntaxhighlight lang="bash">
              --with-username=xyz00 \
~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/mailman \
              --with-groupname=xyz00 \
        --with-username=xyz00 \
              --with-var-prefix=/home/pacs/xyz00/var/mailman \
        --with-groupname=xyz00 \
              --with-cgi-gid=xyz00 \
        --with-var-prefix=/home/pacs/xyz00/var/mailman \
              --with-mail-gid=nogroup
        --with-cgi-gid=xyz00 \
        --with-mail-gid=nogroup
</syntaxhighlight>


(Die Rückwärtsschrägstriche "\" am Zeilenende bedeuten, dass der Befehl in der nächsten Zeile weitergeht. Alternativ können alle Argumente in eine Zeile getippt werden.)
(Die Rückwärtsschrägstriche "\" am Zeilenende bedeuten, dass der Befehl in der nächsten Zeile weitergeht. Alternativ können alle Argumente in eine Zeile getippt werden.)
Zeile 74: Zeile 105:
=== Mailman kompilieren ===
=== Mailman kompilieren ===


~/mailman-2.1.29$ make
<syntaxhighlight lang="bash">
~/mailman-2.1.29$ make install
~/mailman-2.1.29$ make
~/mailman-2.1.29$ make install
</syntaxhighlight>


=== Datenrechte prüfen ===
=== Datenrechte prüfen ===
Zeile 81: Zeile 114:
Sicherheitshalber die Dateirechte durch Mailmans mitgeliefertes Tool prüfen und ggf. korrigieren lassen:
Sicherheitshalber die Dateirechte durch Mailmans mitgeliefertes Tool prüfen und ggf. korrigieren lassen:


~/mailman-2.1.29$ cd ..       
<syntaxhighlight lang="bash">
~$ mailman/bin/check_perms -f
~/mailman-2.1.29$ cd ..       
mailman/bin/check_perms -f
</syntaxhighlight>


== Die neue Mailman-Installation konfigurieren ==
== Die neue Mailman-Installation konfigurieren ==


=== Konfigurationsdatei mm_cfg.py editieren ===
=== Konfigurationsdatei <tt>mm_cfg.py</tt> editieren ===
 
<syntaxhighlight lang="bash">
nano mailman/Mailman/mm_cfg.py
</syntaxhighlight>


~$ nano mailman/Mailman/mm_cfg.py
     
Eine Beispielkonfiguration für listen.example.com könnte so aussehen:
Eine Beispielkonfiguration für listen.example.com könnte so aussehen:


[...]
<syntaxhighlight lang="python" line>
      ##################################################
[...]
      # Put YOUR site-specific settings below this line.
##################################################
      # -*- python -*-
# Put YOUR site-specific settings below this line.
# -*- python -*-
      DEFAULT_HOST_NAME = 'listen.example.com'
 
      DEFAULT_EMAIL_HOST = 'listen.example.com'
DEFAULT_HOST_NAME = 'listen.example.com'
      DEFAULT_URL_HOST = 'listen.example.com'
DEFAULT_EMAIL_HOST = 'listen.example.com'
      add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
DEFAULT_URL_HOST = 'listen.example.com'
      add_virtualhost(zweite.listendomain.com, zweite.listendomain.com)
add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
add_virtualhost(zweite.listendomain.com, zweite.listendomain.com)
      DEFAULT_SERVER_LANGUAGE = 'de'
 
DEFAULT_SERVER_LANGUAGE = 'de'
      DEFAULT_URL_PATTERN = 'http://%s/'
 
 
DEFAULT_URL_PATTERN = 'http://%s/'
      # Es wird der HS Mailversand für Bulkmail verwendet:
 
      SMTPHOST = 'localhost'
# Es wird der HS Mailversand für Bulkmail verwendet:
      SMTPPORT = 4587  
SMTPHOST = 'localhost'
      SMTP_AUTH = True
SMTPPORT = 4587  
      SMTP_USER = 'xyz00-listen'
SMTP_AUTH = True
      SMTP_PASSWD = 'das-passwort-des-o.-g.-users'
SMTP_USER = 'xyz00-listen'
      SMTP_USE_TLS = True
SMTP_PASSWD = 'das-passwort-des-o.-g.-users'
SMTP_USE_TLS = True
</syntaxhighlight>
 
In <tt>~/mailman/Mailman/Defaults.py</tt> sieht man, was in mm_cfg.py alles angepasst werden kann.
 
==== Mailman gegen Subscription Spam härten ====
 
Mailman wird gelegentlich von böswilligen Crackern benutzt, die damit sogenannten Subscription Spam erzeugen. Dabei wird eine Mailadresse von Bots an Mailman zur Eintragung übergeben. Diese Mailadresse wird daraufhin brav von Mailman angeschrieben. Wenn das tausende von Mailmans auf der ganzen Welt zugleich machen, wird die Mailadresse zugespammt. Hier ist die Abhilfe:
 
Die Idee kommt von https://www.ralfj.de/blog/2018/06/02/mailman-subscription-spam.html
 
Auf der Kommandozeile ein zufälliges Secret-String erstellen:
<syntaxhighlight lang="bash">
openssl rand -base64 18
</syntaxhighlight>


Und dann in die Konfigurationsdatei den erzeugten String einfügen:


In ~/mailman/Mailman/Defaults.py sieht man, was in mm_cfg.py alles angepasst werden kann.
<syntaxhighlight lang="bash">
SUBSCRIBE_FORM_SECRET = '<Secret-String>'
</syntaxhighlight>


=== CGI-Programme in die Domain kopieren ===
=== CGI-Programme in die Domain kopieren ===


Bei der Installation als Paketuser:
Bei der Installation als Paketuser (xyz00-listen):


Die fertig kompilierten CGIs von Mailman müssen in das CGI-Verzeichnis der Domain (oder der Domains), auf der das Webfrontend von Mailman laufen soll, kopiert werden. Symbolische Links sind nicht ausreichend.
Die fertig kompilierten CGIs von Mailman müssen in das CGI-Verzeichnis der Domain (oder der Domains), auf der das Webfrontend von Mailman laufen soll, kopiert werden. Symbolische Links sind nicht ausreichend.


~$ mkdir ~/doms/listen.example.com/cgi-ssl/mailman
<syntaxhighlight lang="bash">
~$ cp mailman/cgi-bin/* doms/listen.example.com/cgi-ssl/mailman/
mkdir ~/doms/listen.example.com/cgi-ssl/mailman
cp mailman/cgi-bin/* doms/listen.example.com/cgi-ssl/mailman/
</syntaxhighlight>


Zusätzlich muss das sticky-Flag von den kopierten Dateien entfernt werden:
Zusätzlich muss das sticky-Flag von den kopierten Dateien entfernt werden:


~$ chmod g-s ~/doms/listen.example.com/cgi/mailman/*
<syntaxhighlight lang="bash">
chmod g-s ~/doms/listen.example.com/cgi/mailman/*
</syntaxhighlight>


Bei der Installation als Paketadmin:  
Bei der Installation als Paketadmin (xyz00):  


Die CGI-Programme können im Mailman-Verzeichnis bleiben. Im CGI-Verzeichnis von jeder Domain, auf der das Mailman-Webfrontend laufen soll, werden symbolische Links dazu erstellt:  
Die CGI-Programme können im Mailman-Verzeichnis bleiben. Im CGI-Verzeichnis von jeder Domain, auf der das Mailman-Webfrontend laufen soll, werden symbolische Links dazu erstellt:  


~$ cd doms/listen.example.com/cgi-ssl
<syntaxhighlight lang="bash">
~/doms/listen.example.com/cgi-ssl$ ln -s ../../../mailman/cgi-bin mailman
cd doms/listen.example.com/cgi-ssl
~/doms/listen.example.com/cgi-ssl$ ln -s ../../../mailman/cgi-bin mailman
</syntaxhighlight>


===  Mailman-Icons in die Domains kopieren ===
===  Mailman-Icons in die Domains kopieren ===
Zeile 142: Zeile 203:
Die Icons können wahlweise verlinkt oder kopiert werden:
Die Icons können wahlweise verlinkt oder kopiert werden:


~$ cd doms/listen.example.com/htdocs-ssl
<syntaxhighlight lang="bash">
~/doms/listen.example.com/htdocs-ssl$ ln -s ../../../mailman/icons
cd doms/listen.example.com/htdocs-ssl
~/doms/listen.example.com/htdocs-ssl$ ln -s ../../../mailman/icons
</syntaxhighlight>


oder
oder


~$ cp -R mailman/icons doms/lists.example.com/htdocs-ssl/
<syntaxhighlight lang="bash">
cp -R mailman/icons doms/listen.example.com/htdocs-ssl/
</syntaxhighlight>


=== Die Datei .htaccess bearbeiten ===
=== Die Datei .htaccess bearbeiten ===


Bei einer dedizierten Mailman-Domain sollte man dafür sorgen, dass Mailman nicht nur unter https://listen.example.com/cgi-bin/mailman, sondern auch unter https://listen.example.com  erreichbar ist.
Bei einer dedizierten Mailman-Domain sollte man dafür sorgen, dass Mailman nicht nur unter <tt><nowiki>https://listen.example.com/cgi-bin/mailman</nowiki></tt>, sondern auch unter <tt><nowiki>https://listen.example.com/</nowiki></tt> erreichbar ist.


Dazu werden in ~/doms/listen.example.com/htdocs-ssl/.htaccess folgende Rewrite-Anweisungen eintragen.
Dazu werden in <tt><nowiki>~/doms/listen.example.com/htdocs-ssl/.htaccess</nowiki></tt> folgende Rewrite-Anweisungen eintragen.


RewriteEngine On
<syntaxhighlight lang="apache" line>
RewriteCond %{REQUEST_URI} !^/icons/
RewriteEngine On
RewriteRule ^(.*)$ /cgi-bin/mailman/$1
RewriteCond %{REQUEST_URI} !^/icons/
RewriteRule ^/cgi-bin/mailman/$ /cgi-bin/mailman/listinfo
RewriteRule ^(.*)$ /cgi-bin/mailman/$1
RewriteRule ^/cgi-bin/mailman/$ /cgi-bin/mailman/listinfo
</syntaxhighlight>


Beachte dabei die zweite Zeile: Anfragen für Icons sollen ''nicht'' umgeschrieben werden.
Beachte dabei die zweite Zeile: Anfragen für Icons sollen ''nicht'' umgeschrieben werden.


Wenn Mailman z.B. auf einer als Unterverzeichnis angelegten Subdomain läuft und unter https://www.example.com/mailman statt https://www.example.com/cgi-bin/mailman erreichbar sein soll, hilft folgendes in der ~/doms/example.com/subs-ssl/www/.htaccess:
Wenn Mailman z.B. auf einer als Unterverzeichnis angelegten Subdomain läuft und unter <tt><nowiki>https://www.example.com/mailman</nowiki></tt> statt <tt><nowiki>https://www.example.com/cgi-bin/mailman</nowiki></tt> erreichbar sein soll, hilft folgendes in der <tt><nowiki>~/doms/example.com/subs-ssl/www/.htaccess</nowiki></tt>:


RewriteEngine On
<syntaxhighlight lang="apache" line>
RewriteCond %{REQUEST_URI} !^/icons/
RewriteEngine On
RewriteRule    ^mailman/(.*)$          /cgi-bin/mailman/$1
RewriteCond %{REQUEST_URI} !^/icons/
RewriteRule    ^/cgi-bin/mailman/$ /cgi-bin/mailman/listinfo
RewriteRule    ^mailman/(.*)$          /cgi-bin/mailman/$1
RewriteRule    ^/cgi-bin/mailman/$ /cgi-bin/mailman/listinfo
</syntaxhighlight>


(In diesem Fall kann die Zeile DEFAULT_URL_PATTERN... in der mm_cfg.py auskommentiert werden.)
(In diesem Fall kann die Zeile <tt>DEFAULT_URL_PATTERN...</tt> in der <tt>mm_cfg.py</tt> auskommentiert werden.)


=== Hauptpasswort setzen ===
=== Hauptpasswort setzen ===
Zeile 175: Zeile 244:
Das "site password" ist in Mailman eine Art Generalschlüssel: es wird neben dem jeweiligen Admin- oder Moderator-Passwort überall in der Weboberfläche für sämtliche Mailing-Listen akzeptiert. Also vorsichtig wählen! Das "site password" einrichten mit dem Befehl:  
Das "site password" ist in Mailman eine Art Generalschlüssel: es wird neben dem jeweiligen Admin- oder Moderator-Passwort überall in der Weboberfläche für sämtliche Mailing-Listen akzeptiert. Also vorsichtig wählen! Das "site password" einrichten mit dem Befehl:  


~$ mailman/bin/mmsitepass
<syntaxhighlight lang="bash">
mailman/bin/mmsitepass
</syntaxhighlight>


=== Cronjobs einrichten ===
=== Cronjobs einrichten ===
Zeile 181: Zeile 252:
In die [[Cron |Crontab]] werden Befehle eingetragen, um die Mail-Warteschlange abzuarbeiten, Logs zu löschen, usw.:
In die [[Cron |Crontab]] werden Befehle eingetragen, um die Mail-Warteschlange abzuarbeiten, Logs zu löschen, usw.:


# Warteschlange jede Minute bearbeiten:
<syntaxhighlight lang="bash" line>
* * * * * ~/mailman/bin/qrunner -o -r All
# Warteschlange jede Minute bearbeiten:
# Verarbeitungslogs in der 47ten Minute jeder Stunde löschen:
* * * * * ~/mailman/bin/qrunner -o -r All
47 * * * * rm -f ~/var/mailman/logs/qrunner
# Verarbeitungslogs in der 47ten Minute jeder Stunde löschen:
47 * * * * rm -f ~/var/mailman/logs/qrunner
</syntaxhighlight>


Damit übernimmt cron die Funktion des qrunner-Dämons, der normalerweise auf einem Mailman-Server laufen sollte.
Damit übernimmt cron die Funktion des qrunner-Dämons, der normalerweise auf einem Mailman-Server laufen sollte.
Zeile 190: Zeile 263:
Das Logfile wird stündlich gelöscht, da es sonst sehr schnell sehr groß wird. Falls Mailman von einem Paketuser (bspw. "xyz00-listen") installiert wurde, sollte die letzte Zeile im Beispiel oben so lauten:
Das Logfile wird stündlich gelöscht, da es sonst sehr schnell sehr groß wird. Falls Mailman von einem Paketuser (bspw. "xyz00-listen") installiert wurde, sollte die letzte Zeile im Beispiel oben so lauten:


47 * * * * rm -f ~/mailman/var/logs/qrunner
<syntaxhighlight lang="bash">
47 * * * * rm -f ~/mailman/var/logs/qrunner
</syntaxhighlight>


... entsprechend dem beim Konfigurieren angegebenen var-Verzeichnis, siehe oben.
... entsprechend dem beim Konfigurieren angegebenen <tt>var</tt>-Verzeichnis, siehe oben.


Zudem müssen noch die von Mailman ohnehin vorgesehenen cron-Aufträge aus ~/mailman/cron/crontab.in dem crontab des Users angehängt werden:
Zudem müssen noch die von Mailman ohnehin vorgesehenen cron-Aufträge aus <tt>~/mailman/cron/crontab.in</tt> dem crontab des Users angehängt werden:


crontab -l > mycronjobs.tmp
<syntaxhighlight lang="bash">
cat ~/mailman/cron/crontab.in >> mycronjobs.tmp
crontab -l > mycronjobs.tmp
crontab mycronjobs.tmp
cat ~/mailman/cron/crontab.in >> mycronjobs.tmp
crontab mycronjobs.tmp
</syntaxhighlight>


== Mailinglisten einrichten ==
== Mailinglisten einrichten ==
Zeile 204: Zeile 281:
Jetzt läuft die Software; nun können die eigentlichen Verteiler angelegt werden. Als erster '''muß''' ein Hauptverteiler ("site list") eingerichtet werden. Dieser Verteiler dient u.a. als Absender der Paßwort-Erinnerungen an die Abonnenten aller Mailinglisten. Er hat standardmäßig den Namen "mailman". Falls ein anderer Name verwendet werden soll, muß dieser mit der Anweisung  
Jetzt läuft die Software; nun können die eigentlichen Verteiler angelegt werden. Als erster '''muß''' ein Hauptverteiler ("site list") eingerichtet werden. Dieser Verteiler dient u.a. als Absender der Paßwort-Erinnerungen an die Abonnenten aller Mailinglisten. Er hat standardmäßig den Namen "mailman". Falls ein anderer Name verwendet werden soll, muß dieser mit der Anweisung  


MAILMAN_SITE_LIST = 'sitelistname'
<syntaxhighlight lang="bash">
MAILMAN_SITE_LIST = 'sitelistname'
</syntaxhighlight>


in der Konfigurationsdatei mailman/Mailman/mm_cfg.py eingetragen werden.
in der Konfigurationsdatei <tt>mailman/Mailman/mm_cfg.py</tt> eingetragen werden.


=== Den Hauptverteiler "mailman" anlegen ===
=== Den Hauptverteiler "mailman" anlegen ===
Zeile 214: Zeile 293:
Mit dem Mailman-Befehl newlist den Verteiler anlegen:
Mit dem Mailman-Befehl newlist den Verteiler anlegen:


~$ mailman/bin/newlist mailman
<syntaxhighlight lang="bash">
Enter the email of the person running the list: admin@xyz00.hostsharing.net
mailman/bin/newlist mailman
Initial mailman password:
Enter the email of the person running the list: admin@xyz00.hostsharing.net
Initial mailman password:
</syntaxhighlight>


(Der Befehl newlist kann – alternativ zur Weboberfläche – später benutzt werden, um gewöhnliche Mailinglisten anzulegen.)
(Der Befehl newlist kann – alternativ zur Weboberfläche – später benutzt werden, um gewöhnliche Mailinglisten anzulegen.)
Zeile 224: Zeile 305:
Falls mailman vom Paketuser (bspw. "xyz00-listen") installiert wurde:
Falls mailman vom Paketuser (bspw. "xyz00-listen") installiert wurde:


~$ mailman/bin/config_list -i ~/mailman/var/data/sitelist.cfg mailman
<syntaxhighlight lang="bash">
mailman/bin/config_list -i ~/mailman/var/data/sitelist.cfg mailman
</syntaxhighlight>


Falls mailman vom Paketadmin ("xyz00") installiert wurde:
Falls mailman vom Paketadmin ("xyz00") installiert wurde:


~$ mailman/bin/config_list -i ~/var/mailman/data/sitelist.cfg mailman
<syntaxhighlight lang="bash">
mailman/bin/config_list -i ~/var/mailman/data/sitelist.cfg mailman
</syntaxhighlight>


Diese Konfigurationsdatei soll '''nicht''' auf gewöhnliche Mailinglisten anwendet werden.
Diese Konfigurationsdatei soll '''nicht''' auf gewöhnliche Mailinglisten anwendet werden.


=== Email Adressen einrichten ===
=== E-Mail Adressen bei Mailman einrichten ===


Sobald ein neuer Verteiler angelegt worden ist, sendet Mailman eine Mail an den dabei eingetragenen Listenadministrator. Diese Mail enthält die Anweisung, E-Mail-Aliases für den neuen Verteiler und für die verschiedenen Mailman-Funktionen anzulegen. Bei Hostsharing wird die Zustellung von E-Mails an Mailman anders geregelt: alle Mails an Mailman werden an erweiterte ''E-Mail-Adressen'' des Mailman-Users xyz00-listen geschickt. Diese Adressen haben die form xyz00-listen'''+'''<liste>[_funktion]. Mails an diese Adressen werden dann durch Pipe-Anweisungen in ''.forward-Dateien'' im Home-Verzeichnis des Mailman-Users mit den entsprechenden Argumenten an Mailman übergeben.  
Sobald ein neuer Verteiler angelegt worden ist, sendet Mailman eine E-Mail an den dabei eingetragenen Listenadministrator. Diese E-Mail enthält die Anweisung, E-Mail-Aliases für den neuen Verteiler und für die verschiedenen Mailman-Funktionen anzulegen. Bei Hostsharing wird die Zustellung von E-Mails an Mailman anders geregelt: alle E-Mails an Mailman werden an erweiterte ''E-Mail-Adressen'' des Mailman-Users xyz00-listen geschickt. Diese Adressen haben die form <tt>xyz00-listen'''+'''<liste>[_funktion]</tt>. E-Mails an diese Adressen werden dann durch Pipe-Anweisungen in ''.forward-Dateien'' im Home-Verzeichnis des Mailman-Users mit den entsprechenden Argumenten an Mailman übergeben.  


Falls Mailman von einem Paketuser (bspw. "xyz00-listen") installiert wurde, werden  ''E-Mail-Adressen'' werden durch [https://doc.hostsharing.net/users/administration/hsadmin/index.html hsadmin (bzw. das Befehlszeielentool hsscript)] eingerichtet; die ''.forward-Dateien'' werden durch [[Login_mit_SSH|Shell-Befehle]] angelegt.
Falls Mailman von einem Paketuser (bspw. "xyz00-listen") installiert wurde, werden  ''E-Mail-Adressen'' durch [https://doc.hostsharing.net/users/administration/hsadmin/index.html hsadmin (bzw. das Befehlszeilentool hsscript)] eingerichtet; die ''.forward-Dateien'' werden durch [[Login_mit_SSH|Shell-Befehle]] angelegt.


Das folgende Beispiel zeigt die Befehle, mit denen in einer interaktiven hsscript-Sitzung die E-Mail-Adressen für die Hauptliste "mailman" eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten "mailman" durch den Namen der Mailingliste ersetzt.)
Das folgende Beispiel zeigt die Befehle, mit denen in einer interaktiven hsscript-Sitzung die E-Mail-Adressen für die Hauptliste "mailman" eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten "mailman" durch den Namen der Mailingliste ersetzt.)


  hsscript -u xyz00 -i
<syntaxhighlight lang="bash" line>
  [hsscript verlangt die Eingabe des Paßworts vom Paketadmin xyz00; dann können diese Befehle eingegeben werden:]
hsscript -u xyz00 -i
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman',target:'xyz00-listen+mailman'}})
# [hsscript verlangt die Eingabe des Passworts vom Paketadmin xyz00; dann können diese Befehle eingegeben werden:]
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-admin',target:'xyz00-listen+mailman-admin'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman',target:'xyz00-listen+mailman'}})
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-bounces',target:'xyz00-listen+mailman-bounces'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-admin',target:'xyz00-listen+mailman-admin'}})
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-confirm',target:'xyz00-listen+mailman-confirm'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-bounces',target:'xyz00-listen+mailman-bounces'}})
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-join',target:'xyz00-listen+mailman-join'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-confirm',target:'xyz00-listen+mailman-confirm'}})
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-leave',target:'xyz00-listen+mailman-leave'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-join',target:'xyz00-listen+mailman-join'}})
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-owner',target:'xyz00-listen+mailman-owner'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-leave',target:'xyz00-listen+mailman-leave'}})
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-request',target:'xyz00-listen+mailman-request'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-owner',target:'xyz00-listen+mailman-owner'}})
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-subscribe',target:'xyz00-listen+mailman-subscribe'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-request',target:'xyz00-listen+mailman-request'}})
  emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-unsubscribe',target:'xyz00-listen+mailman-unsubscribe'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-subscribe',target:'xyz00-listen+mailman-subscribe'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-unsubscribe',target:'xyz00-listen+mailman-unsubscribe'}})
</syntaxhighlight>


Die korrekte Einrichtung der E-Mail-Adressen kann in der Web-Oberfläche von hsadmin kontrolliert werden.
Die korrekte Einrichtung der E-Mail-Adressen kann in der Web-Oberfläche von hsadmin kontrolliert werden.


Für jede der soeben eingerichteten Adressen wird nun eine .forward-Datei im Homeverzeichnis des Users xyz00-listen angelegt. Die Dateinamen bestehen aus der Zeichenfolge ".forward+" gefolgt vom Namen der ausführen soll. Der Inhalt der jeweiligen .forward-Datei legt die Weiterleitung der Mail durch einen Pipe an Mailman fest, mit dem jeweiligen Befehl als Argument:
Für jede der soeben eingerichteten Adressen wird nun eine <tt>.forward</tt>-Datei im Homeverzeichnis des Users xyz00-listen angelegt. Die Dateinamen bestehen aus der Zeichenfolge <tt>.forward+</tt> gefolgt vom Namen der ausführen soll. Der Inhalt der jeweiligen <tt>.forward</tt>-Datei legt die Weiterleitung der Mail durch einen Pipe an Mailman fest, mit dem jeweiligen Befehl als Argument:
 
<syntaxhighlight lang="bash">
"|/home/pacs/xyz00/users/listen/mailman/mail/mailman [Befehl] [Listenname]"
</syntaxhighlight>
 
Zum Beispiel wird die <tt>.forward</tt>-Datei .forward+mailman-subscribe verwendet, wenn eine E-Mail an die Adresse <tt>mailman-subscribe@listen.example.com</tt> eingeht. Aufgrund der oben eingerichteten E-Mail-Adresse mit dem Ziel <tt>xyz00-listen+mailman-subscribe</tt> wertet der Mail-Transfer-Agent die <tt>.forward</tt>-Datei <tt>.forward+mailman-subscribe</tt> im Home-Verzeichnis des Users xyz00-listen aus, und entsprechend ihrem Inhalt wird die Mail an die Mailman-Software mit den Argumenten "subscribe mailman" übergeben.


  "|/home/pacs/xyz00/users/listen/mailman/mail/mailman [Befehl] [Listenname]"
Das folgende Beispiel zeigt die Befehle, mit denen an der Befehlszeilenaufforderung der Shell die <tt>.forward</tt>-Dateien für die Hauptliste "mailman" eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten und in den Namen der <tt>.forward</tt>-Dateien "mailman" durch den Namen der Mailingliste ersetzt, jedoch '''nicht''' in der Pfadangabe zum Mailman-Programm selbst; diese ändert sich ja nicht.)


Zum Beispiel wird die .forward-Datei .forward+mailman-subscribe verwendet, wenn eine Mail an die Adresse mailman-subscribe@lists.example.com eingeht. Aufgrund der oben eingerichteten E-Mail-Adresse mit dem Ziel "xyz00-listen+mailman-subscribe" wertet der Mail-Transfer-Agent die .forward-Datei .forward+mailman-subscribe im Home-Verzeichnis des Users xyz00-listen aus, und entsprechend ihrem Inhalt wird die Mail an die Mailman-Software mit den Argumenten "subscribe mailman" übergeben.
<syntaxhighlight lang="bash" line>
echo 'admin@xyz00.hostsharing.net' > .forward # Weiterleitung von cron Fehlern etc an Paketadmin.
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman post mailman"' > .forward+mailman
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin mailman"' > .forward+mailman-admin
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces mailman"' > .forward+mailman-bounces
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm mailman"' > .forward+mailman-confirm
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman join mailman"' > .forward+mailman-join
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave mailman"' > .forward+mailman-leave
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner mailman"' > .forward+mailman-owner
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman request mailman"' > .forward+mailman-request
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe mailman"' > .forward+mailman-subscribe
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe mailman"' > .forward+mailman-unsubscribe
</syntaxhighlight>


Das folgende Beispiel zeigt die Befehle, mit denen an der Befehlszeilenaufforderung der Shell die .forward-Dateien für die Hauptliste "mailman" eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten und in den Namen der .forward-Dateien "mailman" durch den Namen der Mailingliste ersetzt, jedoch '''nicht''' in der Pfadangabe zum Mailman-Programm selbst; diese ändert sich ja nicht.)
Die vielen Befehle können von dieser Anleitung kopiert und nach Anpassung auf den tatsächlichen Unsernamen in die SSH-Sitzung kopiert werden. Noch leichter ist es, mit einem Editor einen Shell-Skript namens <tt>~/bin/mailmanaddresses</tt> mit folgendem Inhalt zu erstellen:


echo 'admin@xyz00.hostsharing.net' > .forward # Weiterleitung von cron Fehlern etc an Paketadmin.
<syntaxhighlight lang="bash" line>
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman post mailman"' > .forward+mailman
#!/bin/bash
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin mailman"' > .forward+mailman-admin
# Add e-mail addresses and dot-forward files for mailman lists.
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces mailman"' > .forward+mailman-bounces
#
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm mailman"' > .forward+mailman-confirm
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman join mailman"' > .forward+mailman-join
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave mailman"' > .forward+mailman-leave
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner mailman"' > .forward+mailman-owner
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman request mailman"' > .forward+mailman-request
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe mailman"' > .forward+mailman-subscribe
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe mailman"' > .forward+mailman-unsubscribe


Die vielen Befehle können von dieser Anleitung kopiert und nach Anpassung auf den tatsächlichen Unsernamen in die SSH-Sitzung kopiert werden. Noch leichter ist es, mit einem Editor einen Shell-Skript namens ~/bin/addforwards mit folgendem Inhalt zu erstellen:
# All the sanity checks.


#!/bin/sh
if [ "$3" = "" -o "$2" = "" -o "$1" = "" ] ; then
# .forward-Dateien für einen Verteiler unter Mailman einrichten.
     echo "Syntax: $0 listname domainname listowner\n"  
#
if [ "$1" = "" ] ; then
     echo "Aufruf: $0 Listenname\n"  
     exit
     exit
fi
fi
if [ "$2" != "" ] ; then
 
     echo "Aufruf: $0 Listenname\n"  
if [ "$4" != "" ] ; then
     echo "Syntax: $0 listname domainname listowner\n"  
     exit
     exit
fi
fi
if [ "`pwd`" != "`echo ~`" ] ; then
 
     echo "Diesen Befehl vom Home-Verzeichnis aus aufrufen.\n"  
if [ "`pwd`" != "`echo ~`" ] ; then
     echo "Run this script from your home directory.\n"  
     exit
     exit
fi
fi
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman post $1\"" > .forward+$1
 
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin $1\"" > .forward+$1-admin
if [ ! -d "../${3:6}" ] ; then
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces $1\"" > .forward+$1-bounces
echo "There's no user named $3."
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm $1\"" > .forward+$1-confirm
exit
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman join $1\"" > .forward+$1-join
else
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave $1\"" > .forward+$1-leave
echo "You may be asked for a password for $3."
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner $1\"" > .forward+$1-owner
fi
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman request $1\"" > .forward+$1-request
 
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe $1\"" > .forward+$1-subscribe
if [ ! -d "./mailman/Mailman" ] ; then
echo "\"|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe $1\"" > .forward+$1-unsubscribe
echo "Are you sure you have a Mailman installation?"
exit
exit
fi
 
# hsscript fails with a "no result" and 255 if $2 (domain name) is not valid.
# It also fails if a requested address already exists.
# scriptexpr contains the expanded variables. Avoid spaces, because it's unquoted in the hsscript call.
 
# Add the base list address and its forward file:
scriptexpr="emailaddress.add({set:{localpart:\"$1\",target:\"xyz00-lists+$1\",domain:\"$2\"}})"
hsscript -r$3 -u$3 -e $scriptexpr
if [ "$?" != "0" ] ; then echo "hsscript failed to add address with localpart $1" ; exit ; fi
echo "\"|/home/pacs/xyz00/users/lists/mailman/mail/mailman post $1\"" > .forward+$1
if [ "$?" != "0" ] ; then echo "failed to create a forward file for posts" ; exit ; fi
 
# Now do the same for all the suffixes
for subpart in admin bounces confirm join leave owner request subscribe unsubscribe
do
    scriptexpr="emailaddress.add({set:{localpart:\"$1-${subpart}\",target:\"xyz00-lists+$1-${subpart}\",domain:\"$2\"}})"
    hsscript -r$3 -u$3 -e $scriptexpr
    if [ "$?" != "0" ] ; then echo "hsscript failed on subpart ${subpart}" ; exit ; fi
    echo "\"|/home/pacs/xyz00/users/lists/mailman/mail/mailman $subpart $1\"" > .forward+$1-$subpart
    if [ "$?" != "0" ] ; then echo "failed to create a forward file for ${subpart}" ; exit ; fi
done
 
echo "$0 ran to the end and finished with $?"
exit
</syntaxhighlight>


Der Skript muß natürlich als ausführbar gekennzeichnet werden:
Das Script muss als ausführbar gekennzeichnet werden:


  ~$ chmod u+x bin/addforwards
<syntaxhighlight lang="bash">
chmod u+x bin/mailmanaddresses
</syntaxhighlight>


Die Erweiterung dieses Skripts um die hsscript-Befehle wird dem Leser als Aufgabe überlassen.
Die Erstellung eines Skripts um die Adressen wieder zu entfernen wird dem Leser überlassen.
(Der hsscript-Befehl lautet <tt>hsscript -r<listenowner> -u<listenowner> -e 'emailaddress.remove({where:{localpart:"<listenname[-suffix]>",target:"<mailman-owner+listenname-suffix",domain:"dommainname"}})'</tt>.)


=== Administration ===
=== Administration ===


Als erstes sollte man als Administrator der neuen Mailman-Installation die Liste "mailman" selbst abonnieren. Die Liste "mailman" kann aber unter https://listen.example.com/mailman/admin/mailman verwaltet werden.
Als erstes sollte man als Administrator der neuen Mailman-Installation die Liste "mailman" selbst abonnieren. Die Liste "mailman" kann aber unter <tt><nowiki>https://listen.example.com/mailman/admin/mailman</nowiki></tt> verwaltet werden.


Die Hauptseite der Mailman-Web-Verwaltung ist in unserem Beispiel (mit den oben angegebenen Rewrite-Anweisungen in der Datei .htaccess) https://listen.example.com/mailman/admin/. Diese Seite enthält Links zu den bisher eingerichteten Mailinglisten (außer "mailman") und einen Link, um neue Mailinglisten anzulegen (https://listen.example.com/mailman/create). Das Anlegen einer neuen Mailingliste geschieht entweder über diesen Link oder (wie oben) in der Shell mit dem Befehl:
Die Hauptseite der Mailman-Web-Verwaltung ist in unserem Beispiel (mit den oben angegebenen Rewrite-Anweisungen in der Datei <tt>.htaccess</tt>) <tt><nowiki>https://listen.example.com/mailman/admin/</nowiki></tt>. Diese Seite enthält Links zu den bisher eingerichteten Mailinglisten (außer "mailman") und einen Link, um neue Mailinglisten anzulegen (<tt><nowiki>https://listen.example.com/mailman/create</nowiki></tt>). Das Anlegen einer neuen Mailingliste geschieht entweder über diesen Link oder (wie oben) in der Shell mit dem Befehl:


~$ mailman/bin/newlist <Listenname>
<syntaxhighlight lang="bash">
mailman/bin/newlist <Listenname>
</syntaxhighlight>


In beiden Fällen müssen zusätzlich die E-Mail-Adressen und die .forward-Dateien wie bei dem Einrichten der Liste "mailman" nach Verfahren im obigen Abschnitt angelegt werden.
In beiden Fällen müssen zusätzlich die E-Mail-Adressen und die <tt>.forward</tt>-Dateien wie bei dem Einrichten der Liste "mailman" nach Verfahren im obigen Abschnitt angelegt werden.


Für die Verwaltung der Mailinglisten im Alltag, d.h. den Umgang mit Bounces, Spam, Abonnenten usw., siehe u.a. die [https://wiki.list.org/ Mailman-Wiki].
Für die Verwaltung der Mailinglisten im Alltag, d.h. den Umgang mit Bounces, Spam, Abonnenten usw., siehe u.a. die [https://wiki.list.org/ Mailman-Wiki].
Zeile 337: Zeile 465:
* in ~/mailman/bin/paths.py, ~/mailman/cron/paths.py und ~/mailman/scripts/paths.py die Zeilen:
* in ~/mailman/bin/paths.py, ~/mailman/cron/paths.py und ~/mailman/scripts/paths.py die Zeilen:


# In a normal interactive Python environment, the japanese.pth and korean.pth
<syntaxhighlight lang="python" line>
# files would be imported automatically.  But because we inhibit the importing
# In a normal interactive Python environment, the japanese.pth and korean.pth
# of the site module, we need to be explicit about importing these codecs.
# files would be imported automatically.  But because we inhibit the importing
if not jaok:
# of the site module, we need to be explicit about importing these codecs.
    import japanese
if not jaok:
# As of KoreanCodecs 2.0.5, you had to do the second import to get the Korean
    import japanese
# codecs installed, however leave the first import in there in case an upgrade
# As of KoreanCodecs 2.0.5, you had to do the second import to get the Korean
# changes this.
# codecs installed, however leave the first import in there in case an upgrade
if not kook:
# changes this.
    import korean
if not kook:
    import korean.aliases
    import korean
    import korean.aliases
</syntaxhighlight>


auskommentieren.
auskommentieren.
Zeile 355: Zeile 485:
Man kann auch noch die Debug-Informationen aus den binaries strippen:
Man kann auch noch die Debug-Informationen aus den binaries strippen:


strip ~/mailman/mail/mailman
<syntaxhighlight lang="bash">
strip ~/mailman/cgi-bin/*
strip ~/mailman/mail/mailman
strip ~/mailman/cgi-bin/*
</syntaxhighlight>


Falls die CGIs nicht gesymlinkt wurden:
Falls die CGIs nicht gesymlinkt wurden:


strip ~/doms/lists.example.com/cgi/mailman/*
<syntaxhighlight lang="bash">
strip ~/doms/listen.example.com/cgi/mailman/*
</syntaxhighlight>


== Multidomainfähigkeit ==
== Multidomainfähigkeit ==
Zeile 372: Zeile 506:
Wenn man nun Mailinglisten mit newlist neu anlegt, muss man den Hostnamen für das Webfontend mit angeben, und zwar so:
Wenn man nun Mailinglisten mit newlist neu anlegt, muss man den Hostnamen für das Webfontend mit angeben, und zwar so:


~$ mailman/bin/newlist listenname@lists.example.com
<syntaxhighlight lang="bash">
mailman/bin/newlist listenname@listen.example.com
</syntaxhighlight>


Es ist ggf. wichtig, dass in der mm_cfg.py eine entsprechende add_virtualhost-Direktive für www.example.com steht, die der Frontend-URL einen Host-Part für die Mailadressen zuordnet. Ist eine solche Direktive nicht vorhanden, so wird lists.example.com sowohl als URL für das Webfrontend wie auch als Hostpart für Emailadressen verwendet. (Was für separate aufgeschaltete Domains wie z.B. lists.example.com gerade zutrifft.)
Es ist ggf. wichtig, dass in der mm_cfg.py eine entsprechende add_virtualhost-Direktive für www.example.com steht, die der Frontend-URL einen Host-Part für die Mailadressen zuordnet. Ist eine solche Direktive nicht vorhanden, so wird listen.example.com sowohl als URL für das Webfrontend wie auch als Hostpart für E-Mailadressen verwendet. (Was für separate aufgeschaltete Domains wie z.B. listen.example.com gerade zutrifft.)


Liegt das Frondend nicht auf der Maildomain ist es wichtig, dass ihr Mailman sagt, für welches die zugehörige Maildomain ist. Dies tut ihr in der Datei ~/mailman/Mailman/mm_cfg.py:
Liegt das Frondend nicht auf der Maildomain ist es wichtig, dass ihr Mailman sagt, für welches die zugehörige Maildomain ist. Dies tut ihr in der Datei ~/mailman/Mailman/mm_cfg.py:


Also z.B.
Also z.B.
DEFAULT_URL_HOST = 'www.example.com'
<syntaxhighlight lang="python">
DEFAULT_EMAIL_HOST = 'lists.example.com'
DEFAULT_URL_HOST = 'www.example.com'
add_virtualhost(DEFAULT_URL_HOST,DEFAULT_EMAIL_HOST)
DEFAULT_EMAIL_HOST = 'listen.example.com'
add_virtualhost(DEFAULT_URL_HOST,DEFAULT_EMAIL_HOST)
</syntaxhighlight>


und
und
add_virtualhost('www.zoopnet.de', 'lists.zoopnet.de')
<syntaxhighlight lang="python">
add_virtualhost('www.zoopnet.de', 'lists.zoopnet.de')
</syntaxhighlight>


Das bedeutet, dass Mailman per default davon ausgeht, dass alle Listen für die Domain example.com sind.
Das bedeutet, dass Mailman per default davon ausgeht, dass alle Listen für die Domain example.com sind.
Zeile 404: Zeile 544:
Nach URL Änderungen stimmen Links im Web-Interface nicht mehr und Listen werden nicht mehr angezeigt.
Nach URL Änderungen stimmen Links im Web-Interface nicht mehr und Listen werden nicht mehr angezeigt.
Es sind dann, zusätzlich zur Anpassung der mm_cfg.py, schon bestehende Listen und Archive mit folgendem Befehl zu aktualisieren:
Es sind dann, zusätzlich zur Anpassung der mm_cfg.py, schon bestehende Listen und Archive mit folgendem Befehl zu aktualisieren:
~/mailman/bin/withlist -l -r fix_url <Listen_Name> -v -u <Neue_Url>
<syntaxhighlight lang="bash">
~/mailman/bin/withlist -l -r fix_url <Listen_Name> -v -u <Neue_Url>
<Listen_Name> steht für die Mailingliste, die bearbeitet werden soll. <Neue_Url> für die neue URL/Webadresse des Webinterfaces.
<Listen_Name> steht für die Mailingliste, die bearbeitet werden soll. <Neue_Url> für die neue URL/Webadresse des Webinterfaces.
</syntaxhighlight>


=== Weitere Cron-Jobs zur Mailinglisten Verwaltung ===
=== Weitere Cron-Jobs zur Mailinglisten Verwaltung ===
Zeile 415: Zeile 557:
== Referenzen ==
== Referenzen ==


Lösung zur installation als Domainadmin statt Paketadmin: https://lists.hostsharing.net/archiv/support/2009-June/019414.html<br>
Lösung zur installation als Domainadmin (xyz00-listen) statt Paketadmin (xyz00): https://lists.hostsharing.net/archiv/support/2009-June/019414.html<br>
Ältere Anleitung für Installation als Domain-Admin: <http://lists.hostsharing.net/archiv/support/2005-January/012426.html><br>
 
"Kleine Tools" auf http://hs.andreasloesch.de, wobei das 'pac-mm-install' wahrscheinlich nicht aktuell (genug) ist<br>
Ältere Anleitung für Installation als Domain-Admin (xyz00-listen): <http://lists.hostsharing.net/archiv/support/2005-January/012426.html><br>
 
"Kleine Tools" auf http://hs.andreasloesch.de/, wobei das 'pac-mm-install' wahrscheinlich nicht aktuell (genug) ist<br>


----
----
Zeile 425: Zeile 569:
[[Kategorie:Mailinglisten]]
[[Kategorie:Mailinglisten]]
[[Kategorie:E-Mail]]
[[Kategorie:E-Mail]]
[[Kategorie:Python]]

Aktuelle Version vom 13. Juni 2024, 11:25 Uhr

Achtung! Mailman 2 benötigt Python 2.7; das wird von den bei Hostsharing aktiven aktuellen Debian GNU/Linux-Betriebssystemen nicht mehr unterstützt.

Alternativen sind Mailman 3 und mlmmj.

Adieu, Mailman 2, es war sehr schön mit dir.


Vorab: Die Wahl von Mailman 2

Mailman 2 hängt von Python 2.7 ab und wird damit voraussichtlich nur noch eine begrenzte Nutzungsdauer haben. Mailman 3 ist jetzt verfügbar (siehe Mailman_3_installieren), aber deutlich schwerer und komplexer im Betrieb. Es gibt auch weniger leistungsfähige Software, um E-Mail-Verteiler zu betreiben, wie beispielsweise mlmmj. Für eine Diskussion der Situation im Oktober 2019, siehe das HS-Support-Archiv ab hier.

Mailman 2 installieren

(zuletzt getestet mit mailman-2.1.29; Installation durch Paketuser)

Vielen Dank an alle Benutzer, die Verbesserungen beisteuern!

Unter welchem Account installieren?

Mailman kann vom Paketadmin (beipsielsweise "xyz00") oder von einem Paketuser (bspw. "xyz00-listen") installiert werden. Letzteres ist dringend empfohlen, denn wenn Mailman vom Paketadmin installiert wird, haben ausnahmslos alle Paketuser direkten Zugriff auf die Mailman-Daten, und bei Sicherheitslücken in Mailman wäre eventuell eine Rechte-Eskalierung auf Paketadmin-Ebene potentiell zu befürchten.

Dem Paketuser, unter dem Mailman installiert wird, können mehrere Subdomains aufschaltet werden, und Mailinglisten können auch die Domainnamen verwenden, die anderen Paketusern gehören.

Vorteil der Installation als Paketuser ist, dass nur dieser direkten Zugriff auf die Mailmandaten hat und mailman ohne Paketadminrechte läuft. Während der Emailauslieferung gelten (wie immer bei der Mailweiterleitung durch .forward-Dateien oder durch procmail) die Rechte des Paketusers, dem die Mailman-Installation gehört.

Nachteil der Installation als Paketuser ist lediglich, dass die Paketdomain mit dem SSL Zertifikat von Hostsharing nicht genutzt werden kann.

Einen User und eine Domain anlegen

Unter admin.hostsharing.net als xyz00 anmelden; den User xyz00-listen erzeugen; die Domain listen.example.com mit "Domain-User" xyz00-listen anlegen. Aus admin.hostsharing.net abmelden.

Mit SSH an hostsharing.net als xyz00-listen anmelden. Die Redirect-Zeile aus ~/doms/listen.example.com/htdocs-ssl/.htaccess löschen:

echo "" > ~/doms/listen.example.com/htdocs-ssl/.htaccess

Die Default-Subdomains www.* löschen:

rm -r doms/listen.example.com/subs/www/
rm -r doms/listen.example.com/subs-ssl/www/

Sourcen besorgen und entpacken

Unter http://www.gnu.org/software/mailman/ die aktuelle Software besorgen. Dort findet sich ein Link zu den 2er-Versionen von Mailman (http://ftp.gnu.org/gnu/mailman/). Die letzte Version downloaden ...

wget http://ftp.gnu.org/gnu/mailman/mailman-2.1.29.tgz

... und entpacken:

tar -xzvf mailman-2.1.29.tgz

Ab diesem Augenblick gibt es ein Verzeichnis namens mailman-2.1.29/. Darin liegt die nunmehr entpackte Quellcode der Mailman-Software. Nach dem Kompilieren (folgt unten) wird die fertig kompilierte, gebrauchsfähige Mailman-Software in dem zusätzlich vorhandenen Verzeichnis mailman/ liegen. (Dieses Verzeichnis wird beim Konfigurieren der Source als "prefix" angegeben.)

var-Verzeichnis für Log-Dateien anlegen

Bei der Installation als Paketuser (xyz00-listen):

cd && mkdir -p mailman/var
chmod 02775 mailman/var

Bei der Installation als Paketadmin (xyz00):

cd && mkdir var/mailman
chmod 02775 var/mailman

Mailman konfigurieren

In das Source-Verzeichnis wechseln:

cd mailman-2.1.29

Bei der Installation durch den Paketuser (xyz00-listen):

~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/users/listen/mailman \
        --with-username=xyz00-listen \
        --with-groupname=xyz00 \
        --with-var-prefix=/home/pacs/xyz00/users/listen/mailman/var \
        --with-cgi-gid=xyz00 \
        --with-mail-gid=xyz00

Bei der Installation durch den Paketadmin (xyz00):

~/mailman-2.1.29$ ./configure --prefix=/home/pacs/xyz00/mailman \
        --with-username=xyz00 \
        --with-groupname=xyz00 \
        --with-var-prefix=/home/pacs/xyz00/var/mailman \
        --with-cgi-gid=xyz00 \
        --with-mail-gid=nogroup

(Die Rückwärtsschrägstriche "\" am Zeilenende bedeuten, dass der Befehl in der nächsten Zeile weitergeht. Alternativ können alle Argumente in eine Zeile getippt werden.)

Mailman kompilieren

~/mailman-2.1.29$ make
~/mailman-2.1.29$ make install

Datenrechte prüfen

Sicherheitshalber die Dateirechte durch Mailmans mitgeliefertes Tool prüfen und ggf. korrigieren lassen:

~/mailman-2.1.29$ cd ..      
mailman/bin/check_perms -f

Die neue Mailman-Installation konfigurieren

Konfigurationsdatei mm_cfg.py editieren

nano mailman/Mailman/mm_cfg.py

Eine Beispielkonfiguration für listen.example.com könnte so aussehen:

[...]
##################################################
# Put YOUR site-specific settings below this line.
# -*- python -*-

DEFAULT_HOST_NAME = 'listen.example.com'
DEFAULT_EMAIL_HOST = 'listen.example.com'
DEFAULT_URL_HOST = 'listen.example.com'
add_virtualhost(DEFAULT_URL_HOST, DEFAULT_EMAIL_HOST)
add_virtualhost(zweite.listendomain.com, zweite.listendomain.com)

DEFAULT_SERVER_LANGUAGE = 'de'

DEFAULT_URL_PATTERN = 'http://%s/'

# Es wird der HS Mailversand für Bulkmail verwendet:
SMTPHOST = 'localhost'
SMTPPORT = 4587 
SMTP_AUTH = True
SMTP_USER = 'xyz00-listen'
SMTP_PASSWD = 'das-passwort-des-o.-g.-users'
SMTP_USE_TLS = True

In ~/mailman/Mailman/Defaults.py sieht man, was in mm_cfg.py alles angepasst werden kann.

Mailman gegen Subscription Spam härten

Mailman wird gelegentlich von böswilligen Crackern benutzt, die damit sogenannten Subscription Spam erzeugen. Dabei wird eine Mailadresse von Bots an Mailman zur Eintragung übergeben. Diese Mailadresse wird daraufhin brav von Mailman angeschrieben. Wenn das tausende von Mailmans auf der ganzen Welt zugleich machen, wird die Mailadresse zugespammt. Hier ist die Abhilfe:

Die Idee kommt von https://www.ralfj.de/blog/2018/06/02/mailman-subscription-spam.html

Auf der Kommandozeile ein zufälliges Secret-String erstellen:

openssl rand -base64 18

Und dann in die Konfigurationsdatei den erzeugten String einfügen:

SUBSCRIBE_FORM_SECRET = '<Secret-String>'

CGI-Programme in die Domain kopieren

Bei der Installation als Paketuser (xyz00-listen):

Die fertig kompilierten CGIs von Mailman müssen in das CGI-Verzeichnis der Domain (oder der Domains), auf der das Webfrontend von Mailman laufen soll, kopiert werden. Symbolische Links sind nicht ausreichend.

mkdir ~/doms/listen.example.com/cgi-ssl/mailman
cp mailman/cgi-bin/* doms/listen.example.com/cgi-ssl/mailman/

Zusätzlich muss das sticky-Flag von den kopierten Dateien entfernt werden:

chmod g-s ~/doms/listen.example.com/cgi/mailman/*

Bei der Installation als Paketadmin (xyz00):

Die CGI-Programme können im Mailman-Verzeichnis bleiben. Im CGI-Verzeichnis von jeder Domain, auf der das Mailman-Webfrontend laufen soll, werden symbolische Links dazu erstellt:

cd doms/listen.example.com/cgi-ssl
~/doms/listen.example.com/cgi-ssl$ ln -s ../../../mailman/cgi-bin mailman

Mailman-Icons in die Domains kopieren

Die Icons können wahlweise verlinkt oder kopiert werden:

cd doms/listen.example.com/htdocs-ssl
~/doms/listen.example.com/htdocs-ssl$ ln -s ../../../mailman/icons

oder

cp -R mailman/icons doms/listen.example.com/htdocs-ssl/

Die Datei .htaccess bearbeiten

Bei einer dedizierten Mailman-Domain sollte man dafür sorgen, dass Mailman nicht nur unter https://listen.example.com/cgi-bin/mailman, sondern auch unter https://listen.example.com/ erreichbar ist.

Dazu werden in ~/doms/listen.example.com/htdocs-ssl/.htaccess folgende Rewrite-Anweisungen eintragen.

RewriteEngine On
RewriteCond	%{REQUEST_URI}		!^/icons/
RewriteRule	^(.*)$			/cgi-bin/mailman/$1
RewriteRule	^/cgi-bin/mailman/$	/cgi-bin/mailman/listinfo

Beachte dabei die zweite Zeile: Anfragen für Icons sollen nicht umgeschrieben werden.

Wenn Mailman z.B. auf einer als Unterverzeichnis angelegten Subdomain läuft und unter https://www.example.com/mailman statt https://www.example.com/cgi-bin/mailman erreichbar sein soll, hilft folgendes in der ~/doms/example.com/subs-ssl/www/.htaccess:

RewriteEngine On
RewriteCond	%{REQUEST_URI}		!^/icons/
RewriteRule    ^mailman/(.*)$          /cgi-bin/mailman/$1
RewriteRule    ^/cgi-bin/mailman/$	/cgi-bin/mailman/listinfo

(In diesem Fall kann die Zeile DEFAULT_URL_PATTERN... in der mm_cfg.py auskommentiert werden.)

Hauptpasswort setzen

Das "site password" ist in Mailman eine Art Generalschlüssel: es wird neben dem jeweiligen Admin- oder Moderator-Passwort überall in der Weboberfläche für sämtliche Mailing-Listen akzeptiert. Also vorsichtig wählen! Das "site password" einrichten mit dem Befehl:

mailman/bin/mmsitepass

Cronjobs einrichten

In die Crontab werden Befehle eingetragen, um die Mail-Warteschlange abzuarbeiten, Logs zu löschen, usw.:

# Warteschlange jede Minute bearbeiten:
* * * * *	~/mailman/bin/qrunner -o -r All
# Verarbeitungslogs in der 47ten Minute jeder Stunde löschen:
47 * * * *	rm -f ~/var/mailman/logs/qrunner

Damit übernimmt cron die Funktion des qrunner-Dämons, der normalerweise auf einem Mailman-Server laufen sollte.

Das Logfile wird stündlich gelöscht, da es sonst sehr schnell sehr groß wird. Falls Mailman von einem Paketuser (bspw. "xyz00-listen") installiert wurde, sollte die letzte Zeile im Beispiel oben so lauten:

47 * * * * rm -f ~/mailman/var/logs/qrunner

... entsprechend dem beim Konfigurieren angegebenen var-Verzeichnis, siehe oben.

Zudem müssen noch die von Mailman ohnehin vorgesehenen cron-Aufträge aus ~/mailman/cron/crontab.in dem crontab des Users angehängt werden:

crontab -l > mycronjobs.tmp
cat ~/mailman/cron/crontab.in >> mycronjobs.tmp
crontab mycronjobs.tmp

Mailinglisten einrichten

Jetzt läuft die Software; nun können die eigentlichen Verteiler angelegt werden. Als erster muß ein Hauptverteiler ("site list") eingerichtet werden. Dieser Verteiler dient u.a. als Absender der Paßwort-Erinnerungen an die Abonnenten aller Mailinglisten. Er hat standardmäßig den Namen "mailman". Falls ein anderer Name verwendet werden soll, muß dieser mit der Anweisung

MAILMAN_SITE_LIST = 'sitelistname'

in der Konfigurationsdatei mailman/Mailman/mm_cfg.py eingetragen werden.

Den Hauptverteiler "mailman" anlegen

Die "site list" mit dem Namen "mailman" ist die Mailingliste der lokalen Mailman-Administratoren. Sie wird zur einwandfreien Funktion von Mailman benötigt.

Mit dem Mailman-Befehl newlist den Verteiler anlegen:

mailman/bin/newlist mailman
Enter the email of the person running the list: admin@xyz00.hostsharing.net
Initial mailman password:

(Der Befehl newlist kann – alternativ zur Weboberfläche – später benutzt werden, um gewöhnliche Mailinglisten anzulegen.)

Nur dieses eine Mal für die "site list" müssen wir die Konfigurationsvorgaben laden. (Gewöhnliche Mailinglisten werden später über die Weboberfläche konfiguriert.)

Falls mailman vom Paketuser (bspw. "xyz00-listen") installiert wurde:

mailman/bin/config_list -i ~/mailman/var/data/sitelist.cfg mailman

Falls mailman vom Paketadmin ("xyz00") installiert wurde:

mailman/bin/config_list -i ~/var/mailman/data/sitelist.cfg mailman

Diese Konfigurationsdatei soll nicht auf gewöhnliche Mailinglisten anwendet werden.

E-Mail Adressen bei Mailman einrichten

Sobald ein neuer Verteiler angelegt worden ist, sendet Mailman eine E-Mail an den dabei eingetragenen Listenadministrator. Diese E-Mail enthält die Anweisung, E-Mail-Aliases für den neuen Verteiler und für die verschiedenen Mailman-Funktionen anzulegen. Bei Hostsharing wird die Zustellung von E-Mails an Mailman anders geregelt: alle E-Mails an Mailman werden an erweiterte E-Mail-Adressen des Mailman-Users xyz00-listen geschickt. Diese Adressen haben die form xyz00-listen+<liste>[_funktion]. E-Mails an diese Adressen werden dann durch Pipe-Anweisungen in .forward-Dateien im Home-Verzeichnis des Mailman-Users mit den entsprechenden Argumenten an Mailman übergeben.

Falls Mailman von einem Paketuser (bspw. "xyz00-listen") installiert wurde, werden E-Mail-Adressen durch hsadmin (bzw. das Befehlszeilentool hsscript) eingerichtet; die .forward-Dateien werden durch Shell-Befehle angelegt.

Das folgende Beispiel zeigt die Befehle, mit denen in einer interaktiven hsscript-Sitzung die E-Mail-Adressen für die Hauptliste "mailman" eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten "mailman" durch den Namen der Mailingliste ersetzt.)

hsscript -u xyz00 -i
# [hsscript verlangt die Eingabe des Passworts vom Paketadmin xyz00; dann können diese Befehle eingegeben werden:]
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman',target:'xyz00-listen+mailman'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-admin',target:'xyz00-listen+mailman-admin'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-bounces',target:'xyz00-listen+mailman-bounces'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-confirm',target:'xyz00-listen+mailman-confirm'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-join',target:'xyz00-listen+mailman-join'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-leave',target:'xyz00-listen+mailman-leave'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-owner',target:'xyz00-listen+mailman-owner'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-request',target:'xyz00-listen+mailman-request'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-subscribe',target:'xyz00-listen+mailman-subscribe'}})
emailaddress.add ({set:{domain:'listen.example.com',localpart:'mailman-unsubscribe',target:'xyz00-listen+mailman-unsubscribe'}})

Die korrekte Einrichtung der E-Mail-Adressen kann in der Web-Oberfläche von hsadmin kontrolliert werden.

Für jede der soeben eingerichteten Adressen wird nun eine .forward-Datei im Homeverzeichnis des Users xyz00-listen angelegt. Die Dateinamen bestehen aus der Zeichenfolge .forward+ gefolgt vom Namen der ausführen soll. Der Inhalt der jeweiligen .forward-Datei legt die Weiterleitung der Mail durch einen Pipe an Mailman fest, mit dem jeweiligen Befehl als Argument:

"|/home/pacs/xyz00/users/listen/mailman/mail/mailman [Befehl] [Listenname]"

Zum Beispiel wird die .forward-Datei .forward+mailman-subscribe verwendet, wenn eine E-Mail an die Adresse mailman-subscribe@listen.example.com eingeht. Aufgrund der oben eingerichteten E-Mail-Adresse mit dem Ziel xyz00-listen+mailman-subscribe wertet der Mail-Transfer-Agent die .forward-Datei .forward+mailman-subscribe im Home-Verzeichnis des Users xyz00-listen aus, und entsprechend ihrem Inhalt wird die Mail an die Mailman-Software mit den Argumenten "subscribe mailman" übergeben.

Das folgende Beispiel zeigt die Befehle, mit denen an der Befehlszeilenaufforderung der Shell die .forward-Dateien für die Hauptliste "mailman" eingerichtet werden. (Für spätere Mailinglisten wird in den Argumenten und in den Namen der .forward-Dateien "mailman" durch den Namen der Mailingliste ersetzt, jedoch nicht in der Pfadangabe zum Mailman-Programm selbst; diese ändert sich ja nicht.)

echo 'admin@xyz00.hostsharing.net' > .forward # Weiterleitung von cron Fehlern etc an Paketadmin.
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman post mailman"' > .forward+mailman
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman admin mailman"' > .forward+mailman-admin
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman bounces mailman"' > .forward+mailman-bounces
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman confirm mailman"' > .forward+mailman-confirm
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman join mailman"' > .forward+mailman-join
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman leave mailman"' > .forward+mailman-leave
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman owner mailman"' > .forward+mailman-owner
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman request mailman"' > .forward+mailman-request
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman subscribe mailman"' > .forward+mailman-subscribe
echo '"|/home/pacs/xyz00/users/listen/mailman/mail/mailman unsubscribe mailman"' > .forward+mailman-unsubscribe

Die vielen Befehle können von dieser Anleitung kopiert und nach Anpassung auf den tatsächlichen Unsernamen in die SSH-Sitzung kopiert werden. Noch leichter ist es, mit einem Editor einen Shell-Skript namens ~/bin/mailmanaddresses mit folgendem Inhalt zu erstellen:

#!/bin/bash
# Add e-mail addresses and dot-forward files for mailman lists.
#

# All the sanity checks.

if [ "$3" = "" -o "$2" = "" -o "$1" = "" ] ; then
    echo "Syntax: $0 listname domainname listowner\n" 
    exit
fi

if [ "$4" != "" ] ; then
    echo "Syntax: $0 listname domainname listowner\n" 
    exit
fi

if [ "`pwd`" != "`echo ~`" ] ; then
    echo "Run this script from your home directory.\n" 
    exit
fi

if [ ! -d "../${3:6}" ] ; then
	echo "There's no user named $3."
	exit
else
	echo "You may be asked for a password for $3."
fi

if [ ! -d "./mailman/Mailman" ] ; then
	echo "Are you sure you have a Mailman installation?"
	exit
fi

# hsscript fails with a "no result" and 255 if $2 (domain name) is not valid.
# It also fails if a requested address already exists.
# scriptexpr contains the expanded variables. Avoid spaces, because it's unquoted in the hsscript call.

# Add the base list address and its forward file:
scriptexpr="emailaddress.add({set:{localpart:\"$1\",target:\"xyz00-lists+$1\",domain:\"$2\"}})"
hsscript -r$3 -u$3 -e $scriptexpr
if [ "$?" != "0" ] ; then echo "hsscript failed to add address with localpart $1" ; exit ; fi
echo "\"|/home/pacs/xyz00/users/lists/mailman/mail/mailman post $1\"" > .forward+$1
if [ "$?" != "0" ] ; then echo "failed to create a forward file for posts" ; exit ; fi

# Now do the same for all the suffixes
for subpart in admin bounces confirm join leave owner request subscribe unsubscribe
do
    scriptexpr="emailaddress.add({set:{localpart:\"$1-${subpart}\",target:\"xyz00-lists+$1-${subpart}\",domain:\"$2\"}})"
    hsscript -r$3 -u$3 -e $scriptexpr
    if [ "$?" != "0" ] ; then echo "hsscript failed on subpart ${subpart}" ; exit ; fi
    echo "\"|/home/pacs/xyz00/users/lists/mailman/mail/mailman $subpart $1\"" > .forward+$1-$subpart
    if [ "$?" != "0" ] ; then echo "failed to create a forward file for ${subpart}" ; exit ; fi
done

echo "$0 ran to the end and finished with $?"
exit

Das Script muss als ausführbar gekennzeichnet werden:

chmod u+x bin/mailmanaddresses

Die Erstellung eines Skripts um die Adressen wieder zu entfernen wird dem Leser überlassen. (Der hsscript-Befehl lautet hsscript -r<listenowner> -u<listenowner> -e 'emailaddress.remove({where:{localpart:"<listenname[-suffix]>",target:"<mailman-owner+listenname-suffix",domain:"dommainname"}})'.)

Administration

Als erstes sollte man als Administrator der neuen Mailman-Installation die Liste "mailman" selbst abonnieren. Die Liste "mailman" kann aber unter https://listen.example.com/mailman/admin/mailman verwaltet werden.

Die Hauptseite der Mailman-Web-Verwaltung ist in unserem Beispiel (mit den oben angegebenen Rewrite-Anweisungen in der Datei .htaccess) https://listen.example.com/mailman/admin/. Diese Seite enthält Links zu den bisher eingerichteten Mailinglisten (außer "mailman") und einen Link, um neue Mailinglisten anzulegen (https://listen.example.com/mailman/create). Das Anlegen einer neuen Mailingliste geschieht entweder über diesen Link oder (wie oben) in der Shell mit dem Befehl:

mailman/bin/newlist <Listenname>

In beiden Fällen müssen zusätzlich die E-Mail-Adressen und die .forward-Dateien wie bei dem Einrichten der Liste "mailman" nach Verfahren im obigen Abschnitt angelegt werden.

Für die Verwaltung der Mailinglisten im Alltag, d.h. den Umgang mit Bounces, Spam, Abonnenten usw., siehe u.a. die Mailman-Wiki.

Feintuning

Wer will, kann auch noch etwas Platz sparen. Die normale Mailmaninstallation schlägt mit über 20 MB zu Buche...

Mit den folgenden Tips kann man das auf ca. 6 MB reduzieren :)

Es kann natürlich sein, dass ich zuviel lösche, aber bei mir funktioniert's. Wenn ihr also sicher(er) sein wollt, dass euch der Mailman nicht um die Ohren fliegt, macht das nicht!

  • ~/mailman/cgi-bin und ~/mailman/icons können gelöscht werden, falls sie an andere Stelle kopiert worden sind.
  • Die nicht benötigten Sprachen in ~/mailman/messages löschen.
  • Die nicht benötigten Sprachen in ~/mailman/templates löschen (bis auf englisch).
  • ~/mailman/tests kann, soweit ich das sehe, komplett gelöscht werden.
  • Falls man koreanisch und japanisch nicht braucht, kann man folgendes machen:
  • in ~/mailman/bin/paths.py, ~/mailman/cron/paths.py und ~/mailman/scripts/paths.py die Zeilen:
# In a normal interactive Python environment, the japanese.pth and korean.pth
# files would be imported automatically.  But because we inhibit the importing
# of the site module, we need to be explicit about importing these codecs.
if not jaok:
    import japanese
# As of KoreanCodecs 2.0.5, you had to do the second import to get the Korean
# codecs installed, however leave the first import in there in case an upgrade
# changes this.
if not kook:
    import korean
    import korean.aliases

auskommentieren.

Dann kann man ~/mailman/pythonlib/japanese, ~/mailman/pythonlib/korean, ~/mailman/pythonlib/korean.pth sowie ~/mailman/pythonlib/lib löschen.

Man kann auch noch die Debug-Informationen aus den binaries strippen:

strip ~/mailman/mail/mailman
strip ~/mailman/cgi-bin/*

Falls die CGIs nicht gesymlinkt wurden:

strip ~/doms/listen.example.com/cgi/mailman/*

Multidomainfähigkeit

Seit Mailman 2.x kann eine Mailman-Installation unter gewissen Einschränkungen für mehrere Domains verwendet werden. Hier soll kurz gezeigt werden, was geht und wie es geht.

Anleitung

Logischerweise muss das Webfrontend (die CGIs) auf allen Domains installiert werden.

Wenn man nun Mailinglisten mit newlist neu anlegt, muss man den Hostnamen für das Webfontend mit angeben, und zwar so:

mailman/bin/newlist listenname@listen.example.com

Es ist ggf. wichtig, dass in der mm_cfg.py eine entsprechende add_virtualhost-Direktive für www.example.com steht, die der Frontend-URL einen Host-Part für die Mailadressen zuordnet. Ist eine solche Direktive nicht vorhanden, so wird listen.example.com sowohl als URL für das Webfrontend wie auch als Hostpart für E-Mailadressen verwendet. (Was für separate aufgeschaltete Domains wie z.B. listen.example.com gerade zutrifft.)

Liegt das Frondend nicht auf der Maildomain ist es wichtig, dass ihr Mailman sagt, für welches die zugehörige Maildomain ist. Dies tut ihr in der Datei ~/mailman/Mailman/mm_cfg.py:

Also z.B.

DEFAULT_URL_HOST = 'www.example.com'
DEFAULT_EMAIL_HOST = 'listen.example.com'
add_virtualhost(DEFAULT_URL_HOST,DEFAULT_EMAIL_HOST)

und

add_virtualhost('www.zoopnet.de', 'lists.zoopnet.de')

Das bedeutet, dass Mailman per default davon ausgeht, dass alle Listen für die Domain example.com sind. Alle weiteren add_virtualhost-Direktiven ordnen einem Hostnamen für das Webfrontend (z.B. www.zoopnet.de) einen Hostpart für die Adresse der Mailinglisten (z.B. lists.zoopnet.de) zu.

Tip von Raimund Specht: Lässt man den zweiten Parameter weg, also schreibt z.B. add_virtualhost('www.example.org'), dann benutzt Mailman als Hostpart alles was nach dem ersten Punkt steht, hier also example.org als Maildomain.


Prinzipiell war's das. Man muss die Listeneinträge natürlich immer in die richtige virtusertable eintragen, und für gleichnamige Mailinglisten auf verschiedenen Domains (mailman@*) verschidene +Ergänzungen bzw. aliase verwenden. :)

Probleme

Verschiedene Listen mit gleichem Namen (also z.B. liste@example1.com und liste@example2.com) sind mit Mailman 2.1 leider nicht möglich.


Tips und Tricks

URL Änderungen

Nach URL Änderungen stimmen Links im Web-Interface nicht mehr und Listen werden nicht mehr angezeigt. Es sind dann, zusätzlich zur Anpassung der mm_cfg.py, schon bestehende Listen und Archive mit folgendem Befehl zu aktualisieren:

~/mailman/bin/withlist -l -r fix_url <Listen_Name> -v -u <Neue_Url>
<Listen_Name> steht für die Mailingliste, die bearbeitet werden soll. <Neue_Url> für die neue URL/Webadresse des Webinterfaces.

Weitere Cron-Jobs zur Mailinglisten Verwaltung

Folgende Cronjobs helfen bei der Verwaltung und sind User freundlich:

< In Arbeit >

Referenzen

Lösung zur installation als Domainadmin (xyz00-listen) statt Paketadmin (xyz00): https://lists.hostsharing.net/archiv/support/2009-June/019414.html

Ältere Anleitung für Installation als Domain-Admin (xyz00-listen): <http://lists.hostsharing.net/archiv/support/2005-January/012426.html>

"Kleine Tools" auf http://hs.andreasloesch.de/, wobei das 'pac-mm-install' wahrscheinlich nicht aktuell (genug) ist