<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.hostsharing.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jsu00</id>
	<title>Hostsharing Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hostsharing.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jsu00"/>
	<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spezial:Beitr%C3%A4ge/Jsu00"/>
	<updated>2026-07-28T00:40:45Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Vaultwarden&amp;diff=7591</id>
		<title>Vaultwarden</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Vaultwarden&amp;diff=7591"/>
		<updated>2026-06-16T10:04:31Z</updated>

		<summary type="html">&lt;p&gt;Jsu00: Update Block hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Vaultwarden, früher bekannt als Bitwarden_RS, ist eine leichtgewichtige und performante Open-Source-Alternative zu Bitwarden. Es handelt sich um eine selbst gehostete Passwortverwaltungslösung, die vollständig mit dem offiziellen Bitwarden-Ökosystem kompatibel ist. Vaultwarden ermöglicht es, sensible Zugangsdaten, sichere Notizen und andere geheime Informationen zentral und sicher zu verwalten.&lt;br /&gt;
&lt;br /&gt;
Mit minimalen Systemanforderungen kann Vaultwarden problemlos auf ressourcenschwachen Systemen oder in Containern betrieben werden. Es unterstützt Funktionen wie Zwei-Faktor-Authentifizierung (2FA), End-to-End-Verschlüsselung und die Integration in bestehende Verzeichnisdienste. Vaultwarden bietet zudem eine Webschnittstelle und verschiedene Clients für eine nahtlose Benutzererfahrung.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&lt;br /&gt;
== Cargo herunterladen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
curl --proto &#039;=https&#039; --tlsv1.2 -sSf https://sh.rustup.rs | sh&lt;br /&gt;
source $HOME/.cargo/env&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Vaultvarden herunterladen und builden ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
git clone https://github.com/dani-garcia/vaultwarden.git&lt;br /&gt;
cargo build --features postgresql --release&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Auf eine Domain aufschalten ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
# run.sh&lt;br /&gt;
&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
screen -dmS bitwarden ~/vaultwarden/target/release/vaultwarden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== .env File ===&lt;br /&gt;
  &lt;br /&gt;
Passe den Port nach belieben an, und stelle sicher das die SQL Daten (user, passwort und dbname) und der admin token stimmen, die vollständigen Informationen und alle setzbare Optionen (und deren defaults) findet sich unter https://raw.githubusercontent.com/dani-garcia/vaultwarden/main/.env.template &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini line&amp;gt;&lt;br /&gt;
## Be aware that most of these settings will be overridden if they were changed&lt;br /&gt;
## in the admin interface. Those overrides are stored within DATA_FOLDER/config.json .&lt;br /&gt;
##&lt;br /&gt;
## By default, Vaultwarden expects for this file to be named &amp;quot;.env&amp;quot; and located&lt;br /&gt;
## in the current working directory. If this is not the case, the environment&lt;br /&gt;
## variable ENV_FILE can be set to the location of this file prior to starting&lt;br /&gt;
## Vaultwarden.&lt;br /&gt;
DOMAIN=https://bitwarden.example.com&lt;br /&gt;
SIGNUPS_ALLOWED=false&lt;br /&gt;
ROCKET_ADDRESS=127.0.0.1&lt;br /&gt;
ROCKET_PORT=8222&lt;br /&gt;
DATABASE_URL=&#039;postgresql://xyz00_bitwarden:thesqlpassword@localhost/xyz00_bitwarden&#039;&lt;br /&gt;
SMTP_HOST=127.0.0.1&lt;br /&gt;
SMTP_PORT=25&lt;br /&gt;
SMTP_SSL=false&lt;br /&gt;
SMTP_FROM=bitwarden@example.com&lt;br /&gt;
SMTP_FROM_NAME=&amp;quot;My Personal Bitwarden&amp;quot;&lt;br /&gt;
ADMIN_TOKEN=&amp;lt;someverLonganduniquetoken&amp;gt;&lt;br /&gt;
ORG_CREATION_USERS=user@example.com&lt;br /&gt;
REQUIRE_DEVICE_EMAIL=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== .htaccess ===&lt;br /&gt;
Falls du den Port angepasst hast muss er auch hier angepasst werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteBase /&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]&lt;br /&gt;
RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]&lt;br /&gt;
RewriteRule .* ws://127.0.0.1:8222%{REQUEST_URI}  [proxy]&lt;br /&gt;
RewriteCond %{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f&lt;br /&gt;
RewriteRule .* http://127.0.0.1:8222%{REQUEST_URI} [proxy,last]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weboberfläche bereitstellen ===&lt;br /&gt;
&lt;br /&gt;
Versionsnummer anpassen, herunterladen und entpacken https://github.com/dani-garcia/bw_web_builds/releases/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget https://github.com/dani-garcia/bw_web_builds/releases/download/v2022.6.2/bw_web_v2022.6.2.tar.gz&lt;br /&gt;
tar xvf bw_web_v2022.6.2.tar.gz &lt;br /&gt;
rm bw_web_v2022.6.2.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update von Vaultwarden =&lt;br /&gt;
&lt;br /&gt;
Das Update von Vaultwarden auf einem Hostsharing-Server erfordert ein paar Besonderheiten. Diese Anleitung beschreibt das Update ohne Docker unter Nutzung der vorkompilierten Binärdatei. Wegen abweichender `glibc`-Versionen wird zwingend die **Alpine-Version** verwendet, die per Skript aus dem offiziellen Docker-Image extrahiert wird.&lt;br /&gt;
&lt;br /&gt;
Die folgende Anleitung geht davon aus, dass Vaultwarden im Verzeichnis `~/vaultwarden` installiert ist.&lt;br /&gt;
&lt;br /&gt;
== Dienst stoppen und Backup erstellen ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
cd ~/vaultwarden&lt;br /&gt;
systemctl --user stop vaultwarden&lt;br /&gt;
cp -r data data_backup_$(date +&amp;quot;%Y%m%d&amp;quot;)&lt;br /&gt;
mv vaultwarden vaultwarden_alt&lt;br /&gt;
mv web-vault web-vault_alt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vaultwarden Backend (Alpine) aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -qO docker-image-extract https://raw.githubusercontent.com/jjlin/docker-image-extract/main/docker-image-extract&lt;br /&gt;
chmod +x docker-image-extract&lt;br /&gt;
./docker-image-extract vaultwarden/server:alpine&lt;br /&gt;
cp output/vaultwarden ./vaultwarden&lt;br /&gt;
chmod +x vaultwarden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Web-Vault (Frontend) aktualisieren ==&lt;br /&gt;
&lt;br /&gt;
Den direkten Link zur aktuellen `.tar.gz`-Datei unter https://github.com/dani-garcia/bw_web_builds/releases/latest manuell kopieren.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
wget -O web-vault.tar.gz &amp;quot;HIER_KOPIERTEN_LINK_EINFÜGEN&amp;quot;&lt;br /&gt;
tar -xzf web-vault.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufräumen und Dienst neu starten ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rm -rf output docker-image-extract web-vault.tar.gz&lt;br /&gt;
systemctl --user start vaultwarden&lt;br /&gt;
systemctl --user status vaultwarden&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Abschluss ==&lt;br /&gt;
&lt;br /&gt;
Wenn der Server nach dem Update fehlerfrei läuft, können die Backups entfernt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
rm -rf vaultwarden_alt web-vault_alt data_backup_*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jsu00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7221</id>
		<title>Spamfilter</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spamfilter&amp;diff=7221"/>
		<updated>2025-01-12T10:46:57Z</updated>

		<summary type="html">&lt;p&gt;Jsu00: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einrichtung, Konfiguration und Optimierung eines Spamfilters auf den Hostsharing Servern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Spamassassin Konfigurieren =&lt;br /&gt;
&lt;br /&gt;
Der Spamfilter &amp;quot;Spamassassin&amp;quot; ist bei HS vorinstalliert und kann wie auf der Seite [[Procmail]] beschrieben für eine Mailbox eingebunden werden.&lt;br /&gt;
Alternativ kann &amp;quot;spamc&amp;quot;, das Kommando zur Nutzung des Spamassassin-Daemon, auch einfach in der Datei &amp;quot;.forward&amp;quot; eines Mail-Users aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/spamc -U /var/run/spamd -e /usr/lib/dovecot/deliver&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Effekt: Spammassassin schreibt seine Testergebnisse in die Headerzeilen jeder E-Mail und leitet die E-Mails weiter an das Programm &amp;quot;deliver&amp;quot; aus dem Dovecot-Paket. Das Sortieren von Spam-EMail in einen Spam-Ordner lässt sich mit Sieve-Filtern umsetzten.&lt;br /&gt;
&lt;br /&gt;
ToDo: Anpassung Konfiguration, Filtertraining&lt;br /&gt;
&lt;br /&gt;
= Mitteilungen über aussortierte Emails erzeugen lassen =&lt;br /&gt;
&lt;br /&gt;
Spamcheck Verzeichnis im Homeverzeichnis anlegen,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
mkdir spamcheck&lt;br /&gt;
cd spamcheck&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
und dort drei Skriptdateien anlegen und deren Voreinstellungen anpassen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
cat &amp;gt; check &amp;lt;&amp;lt;EOF&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#----------------------------------------------------------------------------------------&lt;br /&gt;
# send spam mailfolder infomail&lt;br /&gt;
# (c) 04/2004 by ff, webmaster@ff-newmedia.net&lt;br /&gt;
#----------------------------------------------------------------------------------------&lt;br /&gt;
#set -x&lt;br /&gt;
version=&amp;quot;0.4 0405201035 (modified)&amp;quot;&lt;br /&gt;
mailuser=$1&lt;br /&gt;
mailpath=&amp;quot;Maildir/.Spam/&amp;quot;&lt;br /&gt;
checkmaildir=&amp;quot;spamcheck/checkmaildir&amp;quot;&lt;br /&gt;
listmaildir=&amp;quot;spamcheck/listmaildir&amp;quot;&lt;br /&gt;
mailhost=&amp;quot;h02&amp;quot;&lt;br /&gt;
maildomain=&amp;quot;hostsharing.net&amp;quot;&lt;br /&gt;
purgetime=&amp;quot;7&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if ($checkmaildir $mailpath)&lt;br /&gt;
    then&lt;br /&gt;
        mailbox_status=`$listmaildir $mailpath`&lt;br /&gt;
	# send infomail&lt;br /&gt;
	(&lt;br /&gt;
	echo &amp;quot;From: spamcheck &amp;lt;admin@xyz00.$maildomain&amp;gt;&amp;quot;&lt;br /&gt;
        echo &amp;quot;To: $mailuser &amp;lt;$mailuser@$mailhost.$maildomain&amp;gt;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Subject: Status des Spam-Ordners&amp;quot;&lt;br /&gt;
	echo&lt;br /&gt;
        echo&lt;br /&gt;
        echo &amp;quot;$mailbox_status&amp;quot;&lt;br /&gt;
	echo&lt;br /&gt;
        echo&lt;br /&gt;
    	echo &amp;quot;Bitte pruefen ob evtl. erwuenschte Nachrichten aussortiert wurden.&amp;quot;&lt;br /&gt;
	echo &amp;quot;Zugriff auf das Postfach ist IMAP oder Webmail moeglich.&amp;quot;&lt;br /&gt;
        echo &amp;quot;(https://webmail.hostsharing.net)&amp;quot;&lt;br /&gt;
        echo&lt;br /&gt;
        echo&lt;br /&gt;
	echo &amp;quot;-- &amp;quot;&lt;br /&gt;
	echo &amp;quot;created by spamcheck $version&amp;quot;&lt;br /&gt;
    )|/usr/lib/sendmail $mailuser@$mailhost.$maildomain&lt;br /&gt;
else&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
cat &amp;gt; checkmaildir &amp;lt;&amp;lt;EOF&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#----------------------------------------------------------------------------------------&lt;br /&gt;
# send spam mailfolder infomail - check if maildir exists&lt;br /&gt;
# (c) 05/2004 by ff, webmaster@ff-newmedia.net&lt;br /&gt;
# based on mdfrm (c) 1996, Matthew C. Mead&lt;br /&gt;
#----------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
$maildir = shift;&lt;br /&gt;
&lt;br /&gt;
if (!$maildir) {&lt;br /&gt;
    $maildir = $ENV{&#039;MAILDIR&#039;};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!$maildir) {&lt;br /&gt;
    $maildir = &amp;quot;$ENV{&#039;HOME&#039;}/.Maildir&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$maildir =~ s/^=/$ENV{&#039;HOME&#039;}\/Mail\//;&lt;br /&gt;
&lt;br /&gt;
# Kein Spamordner vorhanden - Errorcode 1&lt;br /&gt;
if (!(-d $maildir &amp;amp;&amp;amp; -r $maildir &amp;amp;&amp;amp; -x $maildir &amp;amp;&amp;amp; -d &amp;quot;$maildir/cur&amp;quot; &amp;amp;&amp;amp;&lt;br /&gt;
      -r &amp;quot;$maildir/cur&amp;quot; &amp;amp;&amp;amp; -x &amp;quot;$maildir/cur&amp;quot; &amp;amp;&amp;amp; -d &amp;quot;$maildir/new&amp;quot; &amp;amp;&amp;amp;&lt;br /&gt;
      -r &amp;quot;$maildir/new&amp;quot; &amp;amp;&amp;amp; -x &amp;quot;$maildir/new&amp;quot;)) {&lt;br /&gt;
    exit 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Anderenfalls nachsehen ob Mails vorhanden sind&lt;br /&gt;
opendir(DIR, &amp;quot;$maildir/cur&amp;quot;);&lt;br /&gt;
@tmpfiles = map{$_ = &amp;quot;$maildir/cur/$_&amp;quot;} grep{!/(^\.$)|(^\.\.$)/} readdir(DIR);&lt;br /&gt;
@msgfiles = @tmpfiles;&lt;br /&gt;
closedir(DIR);&lt;br /&gt;
opendir(DIR, &amp;quot;$maildir/new&amp;quot;);&lt;br /&gt;
@tmpfiles = map{$_ = &amp;quot;$maildir/new/$_&amp;quot;} grep{!/(^\.$)|(^\.\.$)/} readdir(DIR);&lt;br /&gt;
push(@msgfiles, @tmpfiles);&lt;br /&gt;
closedir(DIR);&lt;br /&gt;
&lt;br /&gt;
# Wenn keine Mails vorhanden - Errorcode 1&lt;br /&gt;
if (!@msgfiles) {&lt;br /&gt;
    exit 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Wenn Mails vorhanden - Errorcode 0&lt;br /&gt;
exit 0;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash line&amp;gt;&lt;br /&gt;
cat &amp;gt; listmaildir &amp;lt;&amp;lt;EOF&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#----------------------------------------------------------------------------------------&lt;br /&gt;
# send spam mailfolder infomail - list maildir contents&lt;br /&gt;
# (c) 05/2004 by ff, webmaster@ff-newmedia.net&lt;br /&gt;
# based on mdfrm (c) 1996, Matthew C. Mead.&lt;br /&gt;
#----------------------------------------------------------------------------------------&lt;br /&gt;
$hours = 24; #Anzeigen von Mails, deren mtime hoechstens $hours Stunden in der Vergangenheit liegt&lt;br /&gt;
&lt;br /&gt;
use Date::Parse;&lt;br /&gt;
use Date::Format;&lt;br /&gt;
&lt;br /&gt;
$maildir = shift;&lt;br /&gt;
&lt;br /&gt;
if ($maildir eq &amp;quot;-h&amp;quot;) {&lt;br /&gt;
    print &amp;quot;usage: mdfrm /path/to/Maildir\n&amp;quot;;&lt;br /&gt;
    print &amp;quot;       mdfrm =Maildir == mdfrm ~/Mail/Maildir\n&amp;quot;;&lt;br /&gt;
    print &amp;quot;       otherwise, mdfrm defaults to \$MAILDIR\n&amp;quot;;&lt;br /&gt;
    print &amp;quot;       otherwise, mdfrm defaults to ~/.Maildir\n&amp;quot;;&lt;br /&gt;
    exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!$maildir) {&lt;br /&gt;
    $maildir = $ENV{&#039;MAILDIR&#039;};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (!$maildir) {&lt;br /&gt;
    $maildir = &amp;quot;$ENV{&#039;HOME&#039;}/.Maildir&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$maildir =~ s/^=/$ENV{&#039;HOME&#039;}\/Mail\//;&lt;br /&gt;
&lt;br /&gt;
if (!(-d $maildir &amp;amp;&amp;amp; -r $maildir &amp;amp;&amp;amp; -x $maildir &amp;amp;&amp;amp; -d &amp;quot;$maildir/cur&amp;quot; &amp;amp;&amp;amp;&lt;br /&gt;
      -r &amp;quot;$maildir/cur&amp;quot; &amp;amp;&amp;amp; -x &amp;quot;$maildir/cur&amp;quot; &amp;amp;&amp;amp; -d &amp;quot;$maildir/new&amp;quot; &amp;amp;&amp;amp;&lt;br /&gt;
      -r &amp;quot;$maildir/new&amp;quot; &amp;amp;&amp;amp; -x &amp;quot;$maildir/new&amp;quot;)) {&lt;br /&gt;
    # faellt weg, da checkmaildir bereits ueberprueft&lt;br /&gt;
    # print &amp;quot;Kein Spamordner in \&amp;quot;$maildir\&amp;quot; vorhanden. Sie haben offensichtlich noch keine Spammails erhalten.\n&amp;quot;;&lt;br /&gt;
    exit 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
opendir(DIR, &amp;quot;$maildir/cur&amp;quot;);&lt;br /&gt;
@tmpfiles = map{$_ = &amp;quot;$maildir/cur/$_&amp;quot;} grep{!/(^\.$)|(^\.\.$)/} readdir(DIR);&lt;br /&gt;
@msgfiles = @tmpfiles;&lt;br /&gt;
closedir(DIR);&lt;br /&gt;
opendir(DIR, &amp;quot;$maildir/new&amp;quot;);&lt;br /&gt;
@tmpfiles = map{$_ = &amp;quot;$maildir/new/$_&amp;quot;} grep{!/(^\.$)|(^\.\.$)/} readdir(DIR);&lt;br /&gt;
push(@msgfiles, @tmpfiles);&lt;br /&gt;
closedir(DIR);&lt;br /&gt;
&lt;br /&gt;
@msgs = ( );&lt;br /&gt;
&lt;br /&gt;
foreach $file (@msgfiles) {&lt;br /&gt;
    # wirkliches Alter der Mail&lt;br /&gt;
    $mtime = (stat($file))[9];&lt;br /&gt;
&lt;br /&gt;
    $from = &amp;quot;&amp;quot;;&lt;br /&gt;
    $subject = &amp;quot;&amp;quot;;&lt;br /&gt;
    $date = 0;&lt;br /&gt;
    $hits = 0;&lt;br /&gt;
    &lt;br /&gt;
    open(INPUT, sprintf(&amp;quot;zcat %s |&amp;quot;,$file));&lt;br /&gt;
&lt;br /&gt;
FILEINPUT:&lt;br /&gt;
    while(&amp;lt;INPUT&amp;gt;) {&lt;br /&gt;
	&lt;br /&gt;
	if (/^From:\s+(.*)$/i) {&lt;br /&gt;
	    $from = $1;&lt;br /&gt;
	    next FILEINPUT;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (/^Subject:\s+(.*)$/i) {&lt;br /&gt;
	    $subject = $1;&lt;br /&gt;
	    next FILEINPUT;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (/^Date:\s+(.*)$/i) {&lt;br /&gt;
	    $date = $1;&lt;br /&gt;
	    next FILEINPUT;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (/^X-Spam-Status: Yes, hits=+(.*)$/i) {&lt;br /&gt;
	    $hits = $1;&lt;br /&gt;
	    next FILEINPUT;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (/^\s*$/) {&lt;br /&gt;
	    last FILEINPUT;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ($from &amp;amp;&amp;amp; $subject &amp;amp;&amp;amp; $date &amp;amp;&amp;amp; $hits) {&lt;br /&gt;
	    last FILEINPUT;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    close(INPUT);&lt;br /&gt;
&lt;br /&gt;
    @tmp = ( str2time($date), $from, $subject, $mtime, $hits );&lt;br /&gt;
    push(@msgs, [ @tmp ]);&lt;br /&gt;
}&lt;br /&gt;
    &lt;br /&gt;
$oldest = time - $hours * 3600; # Berechnen des Timestamps now - $hours&lt;br /&gt;
&lt;br /&gt;
$o = 0;&lt;br /&gt;
&lt;br /&gt;
foreach $msg (@msgs){&lt;br /&gt;
    if ($msg-&amp;gt;[3] &amp;gt;= $oldest) { # Innerhalb der letzten $hours aussortierte Mails&lt;br /&gt;
    $o++;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $i++; # alle Mails&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ($i==0) { # Wenn keine Mail da sind, Errorcode 1&lt;br /&gt;
    exit 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Insgesamt befinden sich &amp;quot;, $i, &amp;quot; E-Mails in Ihrem Trash-Ordner.\n&amp;quot;);&lt;br /&gt;
print(&amp;quot;In den letzen &amp;quot;, $hours, &amp;quot; Stunden wurden &amp;quot;, $o, &amp;quot; Spam-E-Mails&lt;br /&gt;
aussortiert.\n\n&amp;quot;);&lt;br /&gt;
if ($o==0) { exit 0; }&lt;br /&gt;
print(&amp;quot;Datum (mtime)   Absender              Betreff                      Hits\n&amp;quot;);&lt;br /&gt;
print(&amp;quot;-----------------------------------------------------------------------&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    foreach $msg (sort {$b-&amp;gt;[3] &amp;lt;=&amp;gt; $a-&amp;gt;[3]} @msgs) { # Sortierung vorher auf 0/0&lt;br /&gt;
	if ($msg-&amp;gt;[3] &amp;gt;= $oldest) {&lt;br /&gt;
    	    if ($msg-&amp;gt;[1] =~ /\s*&amp;quot;*([^&amp;quot;]*)&amp;quot;*\s*\&amp;lt;[a-zA-Z0-9._%-=]+@[a-zA-Z0-9._%-=]+\&amp;gt;/) {&lt;br /&gt;
		$from = $1;&lt;br /&gt;
    	    } elsif ($msg-&amp;gt;[1] =~ /[a-zA-z0-9._%-=]+@[a-zA-Z0-9._%-=]+.*\(&amp;quot;*([^&amp;quot;]*)&amp;quot;*\)/) {&lt;br /&gt;
		$from = $1;&lt;br /&gt;
	    } else {&lt;br /&gt;
		$from = $msg-&amp;gt;[1];&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    # Datum ausgeben&lt;br /&gt;
	    if (time2str(&amp;quot;%d&amp;quot;,$msg-&amp;gt;[3]) &amp;lt;=&amp;gt; $olddate) {&lt;br /&gt;
    		print(&amp;quot;\n&amp;quot;);&lt;br /&gt;
	    }   &lt;br /&gt;
	    &lt;br /&gt;
	    # Urspruengliches aus der Mail extrahiertes Datum, sinnlos weil oft gefaelscht&lt;br /&gt;
	    # printf(&amp;quot;%-12s  &amp;quot;, time2str(&amp;quot;%d.%m.%y %H:%M&amp;quot;,$msg-&amp;gt;[0]));&lt;br /&gt;
	    printf(&amp;quot;%-12s  &amp;quot;, time2str(&amp;quot;%d.%m.%y %H:%M&amp;quot;,$msg-&amp;gt;[3]));&lt;br /&gt;
    &lt;br /&gt;
    	    $olddate = time2str(&amp;quot;%d&amp;quot;,$msg-&amp;gt;[3]);    &lt;br /&gt;
&lt;br /&gt;
	    # From ausgeben&lt;br /&gt;
    	    if (length($from) &amp;lt;= 20) {&lt;br /&gt;
		printf(&amp;quot;%-20s  &amp;quot;, $from);&lt;br /&gt;
	    } else {&lt;br /&gt;
		printf(&amp;quot;%-.20s  &amp;quot;, $from);&lt;br /&gt;
	    }&lt;br /&gt;
    &lt;br /&gt;
	    # um *****SPAM***** bereinigtes Subject ausgeben&lt;br /&gt;
	    @sub = $msg-&amp;gt;[2];&lt;br /&gt;
	    if (length(@sub) &amp;lt;= 27) {&lt;br /&gt;
		printf(&amp;quot;%-27s  &amp;quot;, @sub);&lt;br /&gt;
	    } else {&lt;br /&gt;
		printf(&amp;quot;%-.27s  &amp;quot;, @sub);&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
	    # Punkte&lt;br /&gt;
	    if (length($msg-&amp;gt;[4]) &amp;lt;= 4) {&lt;br /&gt;
		printf(&amp;quot;%-4s\n&amp;quot;, $msg-&amp;gt;[4]);&lt;br /&gt;
	    } else {&lt;br /&gt;
		printf(&amp;quot;%-.4s\n&amp;quot;, $msg-&amp;gt;[4]);&lt;br /&gt;
	    }&lt;br /&gt;
	    &lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
exit 0;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und diese ausführbar machen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
chmod a+x check checkmaildir listmaildir&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend einen [[Cron]]job anlegen, der check für den Mailboxuser aufruft:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=bash&amp;gt;&lt;br /&gt;
#Spam Verzeichnis checken&lt;br /&gt;
51 5 * * * sleep $[ ($RANDOM % 120) ]; spamcheck/check xyz00-otto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Automatisches löschen aussortierter Emails =&lt;br /&gt;
&lt;br /&gt;
ToDo: Emails nach einer bestimmten Zeit löschen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Glossar]]&lt;/div&gt;</summary>
		<author><name>Jsu00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=7220</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=7220"/>
		<updated>2025-01-12T10:19:15Z</updated>

		<summary type="html">&lt;p&gt;Jsu00: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.mlmmj.org/ mlmmj], angeblich eine Abkürzung für &amp;quot;Mailing List Management Made Joyful&amp;quot;, ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Wer noch nicht weiß, was ein E-Mail-Verteiler machen soll oder wie, lese vielleicht auch den Wikipedia-Artikel:&lt;br /&gt;
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]&lt;br /&gt;
&lt;br /&gt;
Eine leistungsfähigere Alternative zu mlmmj könnte [[Mailman_3_installieren|Mailman 3]] sein.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt die Einrichtung einer Mailingliste für eine Domain in einem Hostsharing-Webspace.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen  ==&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb der Mailingliste empfiehlt sich das Anlegen eines eigenen Users für diesen Zweck mit hsadmin.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung heißt das Paket &#039;&#039;xyz00&#039;&#039; und der für Mailinglisten eingesetzte User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die E-Mail-Adresse der einzurichtende Mailing-Liste soll &#039;&#039;discuss@example.org&#039;&#039; sein. Den lokalen Teil dieser Adresse, &#039;&#039;discuss&#039;&#039;, ist der Listenname. Der Listenname darf auf keinen Fall das Plus-Zeichen (+) enthalten, weil dies ein Sonderbedeutung für die Listensteuerung hat: &#039;&#039;mlmmj&#039;&#039; wird nämlich Befehle der Abonnenten über erweiterte Adressen annehmen, wie z.B. &#039;&#039;discuss+help@example.org&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Domain &#039;&#039;example.org&#039;&#039; muss dazu bei einem beliebigen User im Paket &#039;&#039;xyz00&#039;&#039; [[aufgeschaltet]] sein. (&amp;quot;Aufgeschaltet&amp;quot; bedeutet, daß diese Domain bei Hostsharing gehostet wird und der Domainname als Verzeichnis /home/pacs/xyz00/*User*/doms/example.org/ erscheint.)&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Ich melde mich über SSH auf der Hostsharing-Console als der Paketuser &#039;&#039;xyz00&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
Im Shell kann ich dann durch den Befehl &#039;&#039;hsscript -i&#039;&#039; das Verwaltungswerkzeug [[hsadmin]] interaktiv ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h03:~$ hsscript -i&lt;br /&gt;
Password: *************&lt;br /&gt;
xyz00@hsadmin&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039; werden User und E-Mail-Adresse angelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-list&#039;,comment:&#039;Mailingliste Discuss&#039;,shell:&#039;/bin/bash&#039;,password:&#039;geheimnis&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; emailaddress.add({set:{target:&#039;xyz00-list&#039;,localpart:&#039;discuss&#039;,domain:&#039;example.org&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem Parameter &amp;quot;target&amp;quot; wird die für diese Adresse eingehende Post zunächst in das Postfach des Users xyz00-list abgelegt.&lt;br /&gt;
&lt;br /&gt;
Für den User xyz00-list lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann lege ich die Mailingliste mit folgendem Kommando an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript &#039;&#039;mlmmj-make-ml&#039;&#039; fragt weitere Parameter der Mailingliste ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
The Domain for the List? [] : example.org&lt;br /&gt;
The emailaddress of the list owner? [postmaster] : webmaster@example.org&lt;br /&gt;
For the list texts you can choose between the following languages or&lt;br /&gt;
give an absolute path to a directory containing the texts.&lt;br /&gt;
Available languages:&lt;br /&gt;
cz  da	de  en	es  fr	it  nl	ru&lt;br /&gt;
The path to texts for the list? [en] : de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das skript &#039;&#039;mlmmj-make-ml&#039;&#039; legt daraufhin unter &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; ein Verzeichnis &amp;quot;discuss&amp;quot; an, das die Datenstruktur zur Verwaltung der Mailingliste enthält.&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im&lt;br /&gt;
Verzeichnis &amp;quot;/home/pacs/xyz00/users/list/mlmmj/discuss/control&amp;quot;.&lt;br /&gt;
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/TUNABLES.html Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
Damit mlmmj die Verteilung der Post übernimmt, muß ich im Heimat-Verzeichnis des users xyz00-list die Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; mit folgenden Inhalt (INKLUSIVE der Anführungszeichen!) erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/mlmmj-receive -L /home/pacs/xyz00/users/list/mlmmj/discuss/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Ja, &#039;&#039;receive&#039;&#039; schreibt sich mit &#039;&#039;-ei-&#039;&#039;, aber mlmmj hält einen symbolischen Link bereit für diejenigen, die in englischer Rechtschreibung unsicher sind:)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-list@h03:~$ ls -la /usr/bin/mlmmj-rec*&lt;br /&gt;
-rwxr-xr-x 1 root root 27104 Sep 25  2018 /usr/bin/mlmmj-receive&lt;br /&gt;
lrwxrwxrwx 1 root root    13 Sep 25  2018 /usr/bin/mlmmj-recieve -&amp;gt; mlmmj-receive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei sorgt dafür, dass eingehende E-Mails an das User-Postfach an das Programm &#039;&#039;mlmmj-recieve&#039;&#039; übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Für regelmäßige Aufgaben der Listen-Managers definiere ich den systemd timer wie folgt (immer noch als &#039;&#039;xyz00-list&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/mlmmj.service&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=mlmmj maintenance&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
~/.config/systemd/user/mlmmj.timer&lt;br /&gt;
&amp;lt;syntaxhighlight lang=ini&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=mlmmj maintenance&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
OnCalendar=*:28/4&lt;br /&gt;
Persistent=True&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer aktivieren und starten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
$ systemctl --user enable mlmmj.timer&lt;br /&gt;
$ systemctl --user start mlmmj.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss rufe ich das Skript mlmmj-sub auf, um die E-Mail-Adressen der gewünschten Abonnenten des Verteilers einzutragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c &lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei bewirkt &amp;quot;-c&amp;quot;, dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man &amp;quot;-C&amp;quot; (großes C) angeben: dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.&lt;br /&gt;
&lt;br /&gt;
== weitere Optionen  ==&lt;br /&gt;
&lt;br /&gt;
Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:&lt;br /&gt;
&lt;br /&gt;
Ein Prefix in der Betreffzeile setzen, z.B.: &amp;quot;[discuss]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo &amp;quot;[discuss]&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wenn die Liste nur E-Mails von eingetragenen Abonnenten weiterleiten soll:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit der Listen-Owner weitere Abonnements bestätigen muss:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Einen &amp;quot;Reply-To:&amp;quot;-Header setzen, damit Antwort-Mails standardmäßig an die Mailing-Liste gehen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo &amp;quot;Reply-To:&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders&lt;br /&gt;
echo &amp;quot;Reply-To: discuss@example.org&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Um dies zu tun, setzen Sie den SMTP-Port entsprechend:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
echo &amp;quot;4025&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/smtpport&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationsvariante des Ausgangsserver sind unter https://www.hostsharing.net/doc/managed-operations-platform/email/ zu finden.&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten finden Sie (wie oben bereits angegeben) &lt;br /&gt;
auf der [http://mlmmj.org/TUNABLES.html Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
=== Achtung: DKIM ===&lt;br /&gt;
&lt;br /&gt;
Mlmmj gibt die Möglichkeit, mit &#039;&#039;&#039;delheaders&#039;&#039;&#039; und &#039;&#039;&#039;customheaders&#039;&#039;&#039; 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 &#039;&#039;Subject:&#039;&#039;, &#039;&#039;From:&#039;&#039;, &#039;&#039;To:&#039;&#039;, &#039;&#039;Date:&#039;&#039;, &#039;&#039;From&#039;&#039;, und oft auch &#039;&#039;Reply-To:&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
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)&lt;br /&gt;
&lt;br /&gt;
== Zur Konfiguration im Browser ==&lt;br /&gt;
&lt;br /&gt;
Die Original-Distribution von &#039;&#039;mlmmj&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
Wer es sich ansehen möchte:&lt;br /&gt;
&lt;br /&gt;
Als Paket-Admin eine Domain aufschalten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -e &amp;quot;domain.add({set:{name:&#039;lists.example.org&#039;,user:&#039;xyz00-list&#039;}})&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und weiter als &amp;quot;xyz00-list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;/mlmmj-$versionsnummer/contrib/web/php-admin/&amp;quot;, oder beim .deb-Paket unter &amp;quot;usr/share/mlmmj-...&amp;quot;, findet sich die PHP-Admin-Anwendung. Also ...&lt;br /&gt;
&lt;br /&gt;
* den Inhalt diese Verzeichnisses nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/&amp;quot; packen;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php&amp;quot; die Variable &amp;quot;$topdir&amp;quot; anpassen;&lt;br /&gt;
* die Dateien aus &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/&amp;quot; nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; verschieben;&lt;br /&gt;
* Beim .deb-Paket die config.php, die templates/ und die tunables.pl aus etc/ nach example.org/conf/ verschieben;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; und in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; eine &amp;quot;.htaccess&amp;quot; mit folgendem Inhalt ablegen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Require valid-user&lt;br /&gt;
AuthType Basic&lt;br /&gt;
AuthName &amp;quot;mlmmj web-interface&amp;quot;&lt;br /&gt;
AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Und schließlich die &amp;quot;htpasswd&amp;quot;-Datei anlegen.&lt;br /&gt;
&lt;br /&gt;
 cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/&lt;br /&gt;
 htpasswd -c htpasswd listadmin&lt;br /&gt;
&lt;br /&gt;
* Ein Passwort angeben.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
* in &amp;lt;tt&amp;gt;.../htdocs-ssl/index.php&amp;lt;/tt&amp;gt; folgende Änderung vornehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=diff line&amp;gt;&lt;br /&gt;
@@ -38,4 +38,5 @@&lt;br /&gt;
 # use scandir to have alphabetical order &lt;br /&gt;
 foreach (scandir($topdir) as $file) {&lt;br /&gt;
-    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+# ereg obsolete!! Vormals:    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+    if (!preg_match(&#039;/^\./&#039;,$file))&lt;br /&gt;
     {&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und das Ergebnis auf https://lists.example.org anschauen.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Mailinglisten betreiben ==&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;mlmmj&#039;&#039; für die jeweiligen Liste mit ihrem Daten-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Dazu trägt man in der Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; statt des Aufrufs von &#039;&#039;mlmmj-recieve&#039;&#039; einen Aufruf von &#039;&#039;procmail&#039;&#039; ein:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
|/usr/bin/procmail&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; mit folgendem Inhalt ins $HOME des Users:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
SHELL=/bin/sh&lt;br /&gt;
HOMEDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
MAILDIR=/home/pacs/xyz00/users/list/Maildir&lt;br /&gt;
PMDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
VERBOSE=yes&lt;br /&gt;
LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log&lt;br /&gt;
DEFAULT&lt;br /&gt;
 &lt;br /&gt;
:0:&lt;br /&gt;
* ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/&lt;br /&gt;
 &lt;br /&gt;
:0&lt;br /&gt;
{ EXITCODE 67 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bitte dafür sorgen, dass das Verzeichnis &#039;&#039;/home/pacs/xyz00/users/list/var&#039;&#039; existiert.&lt;br /&gt;
&lt;br /&gt;
Der kryptische reguläre Ausdruck hinter dem Header &#039;&#039;X-Original-To:&#039;&#039; passt auf den Beginn der E-Mail-Adresse bis zum ersten &#039;&#039;@&#039;&#039;- oder &#039;&#039;+&#039;&#039;-Zeichen. In der Variable &#039;&#039;MATCH&#039;&#039; steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig ist die Zeile &#039;&#039;DEFAULT&#039;&#039; zu Beginn der &#039;&#039;.procmailrc&#039;&#039;. Die Variable &#039;&#039;DEFAULT&#039;&#039; wird von &#039;&#039;procmail&#039;&#039; gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von &#039;&#039;mlmmj&#039;&#039; benutzt, wenn sie gesetzt ist. Das führt in Kombination mit &#039;&#039;procmail&#039;&#039; zu Fehlfunktionen (vgl. Links).&lt;br /&gt;
&lt;br /&gt;
===Groß- und Kleinschreibung===&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Listen-Name&amp;quot; oder &amp;quot;listen-name&amp;quot; oder &amp;quot;Listen-name&amp;quot; sein. &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; hingegen wird diesen Wert in Unix-Manier mit dem genauen Verzeichnisnamen &amp;lt;tt&amp;gt;${HOME}/mlmmj/listen-name&amp;lt;/tt&amp;gt; vergleichen, und bei unterschiedlicher Schreibweise die Mail nicht verteilen.&lt;br /&gt;
&lt;br /&gt;
====Lösung 1====&lt;br /&gt;
&lt;br /&gt;
Eine teilweise Lösung besteht darin, den Listennamen in dem &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt;-Aufruf in der &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; in Kleinbuchstaben umzuschreiben. Dann lautet das Rezept so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
:0:&lt;br /&gt;
* ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/$(echo ${MATCH} | tr [:upper:] [:lower:])/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Rest der Datei muß gleich bleiben, wie weiter oben angezeigt.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall müssen aber alle Mailing-Listen ohne Großbuchstaben im Namen angelegt werden!&lt;br /&gt;
&lt;br /&gt;
(Man kann auch in &amp;lt;tt&amp;gt;${HOME}/mlmmj/&amp;lt;/tt&amp;gt; durch kleingeschriebene Symlinks großgeschriebene Listennamen ansprechbar machen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output&amp;gt;&lt;br /&gt;
xyz00-list@h02:~$ ls -lA mlmmj/&lt;br /&gt;
total 8&lt;br /&gt;
-rw-r--r--  1 xyz00-list xyz00  148 Feb  1 16:56 .htaccess&lt;br /&gt;
lrwxrwxrwx  1 xyz00-list xyz00   10 Feb  2 18:01 mitglieder -&amp;gt; Mitglieder&lt;br /&gt;
drwxr-xr-x 15 xyz00-list xyz00 4096 Feb  2 16:53 Mitglieder&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Lösung 2====&lt;br /&gt;
&lt;br /&gt;
Bash kann bei der Auflösung von Variablen die Groß- und Kleinschreibung manipulieren. (Siehe dazu bei der Zeichenfolge &amp;lt;tt&amp;gt;,,&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;man bash&amp;lt;/tt&amp;gt;.) Dann ist &amp;lt;tt&amp;gt;$(echo ${MATCH} | tr [:upper:] [:lower:])&amp;lt;/tt&amp;gt; gleichbedeutend mit &amp;lt;tt&amp;gt;${MATCH,,}&amp;lt;/tt&amp;gt;. Allerdings braucht procmail einige Überredung, um Bash zu verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
SHELL=/bin/bash&lt;br /&gt;
SHELLMETAS=&amp;amp;|&amp;lt;&amp;gt;~;?*[{&lt;br /&gt;
HOMEDIR= ...&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
:0:&lt;br /&gt;
* ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
|/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH,,}/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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 &#039;|&#039; am Anfang der Zeile zählt dabei nicht! In diesem Beispiel ist es das Zeichen &amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;, das den Einsatz von Bash auslöst.&lt;br /&gt;
&lt;br /&gt;
Beide Lösungen scheinen zu funktionieren; Angabe ohne Gewähr.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://mlmmj.org/ Projektseite&lt;br /&gt;
* https://codeberg.org/mlmmj mlmmj auf Codeberg&lt;br /&gt;
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS&lt;br /&gt;
* [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&lt;br /&gt;
* [https://gist.github.com/kboss/7c9593f0fd9219406226c4f11256b98a Einfaches Python-Script zum Massenimport aus einem Texfile.] Geht bestimmt auch eleganter mit purem Bash&lt;br /&gt;
* 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 &amp;quot;public&amp;quot;-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).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Jsu00</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6870</id>
		<title>Mlmmj</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mlmmj&amp;diff=6870"/>
		<updated>2024-07-22T09:13:32Z</updated>

		<summary type="html">&lt;p&gt;Jsu00: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.mlmmj.org/ mlmmj], angeblich eine Abkürzung für &amp;quot;Mailing List Management Made Joyful&amp;quot;, ist ein Programm, mit dem in einem Hostsharing Paket E-Mail-Verteiler realisiert werden kann.&lt;br /&gt;
&lt;br /&gt;
Wer noch nicht weiß, was ein E-Mail-Verteiler machen soll oder wie, lese veilleicht auch den Wikipedia-Artikel:&lt;br /&gt;
[http://de.wikipedia.org/wiki/Mailingliste Mailingliste]&lt;br /&gt;
&lt;br /&gt;
Eine leistungsfähigere Alternative zu mlmmj könnte [[Mailman_3_installieren|Mailman 3]] sein.&lt;br /&gt;
&lt;br /&gt;
Diese Anleitung beschreibt die Einrichtung einer Mailingliste für eine Domain in einem Hostsharing-Webspace.&lt;br /&gt;
&lt;br /&gt;
== Voraussetzungen  ==&lt;br /&gt;
&lt;br /&gt;
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.)&lt;br /&gt;
&lt;br /&gt;
Für den Betrieb der Mailingliste empfiehlt sich das Anlegen eines eigenen Users für diesen Zweck mit hsadmin.&lt;br /&gt;
&lt;br /&gt;
In dieser Anleitung heißt das Paket &#039;&#039;xyz00&#039;&#039; und der für Mailinglisten eingesetzte User &#039;&#039;xyz00-list&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die E-Mail-Adresse der einzurichtende Mailing-Liste soll &#039;&#039;discuss@example.org&#039;&#039; sein. Den lokalen Teil dieser Adresse, &#039;&#039;discuss&#039;&#039;, ist der Listenname. Der Listenname darf auf keinen Fall das Plus-Zeichen (+) enthalten, weil dies ein Sonderbedeutung für die Listensteuerung hat: &#039;&#039;mlmmj&#039;&#039; wird nämlich Befehle der Abonnenten über erweiterte Adressen annehmen, wie z.B. &#039;&#039;discuss+help@example.org&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Die Domain &#039;&#039;example.org&#039;&#039; muss dazu bei einem beliebigen User im Paket &#039;&#039;xyz00&#039;&#039; [[aufgeschaltet]] sein. (&amp;quot;Aufgeschaltet&amp;quot; bedeutet, daß diese Domain bei Hostsharing gehostet wird und der Domainname als Verzeichnis /home/pacs/xyz00/*User*/doms/example.org/ erscheint.)&lt;br /&gt;
&lt;br /&gt;
== Einrichtung ==&lt;br /&gt;
&lt;br /&gt;
Ich melde mich über SSH auf der Hostsharing-Console als der Paketuser &#039;&#039;xyz00&#039;&#039; an.&lt;br /&gt;
&lt;br /&gt;
Im Shell kann ich dann durch den Befehl &#039;&#039;hsscript -i&#039;&#039; das Verwaltungswerkzeug [[hsadmin]] interaktiv ausführen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@h03:~$ hsscript -i&lt;br /&gt;
Password: *************&lt;br /&gt;
xyz00@hsadmin&amp;gt; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &#039;&#039;hsadmin&#039;&#039; werden User und E-Mail-Adresse angelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00@hsadmin&amp;gt; user.add({set:{name:&#039;xyz00-list&#039;,comment:&#039;Mailingliste Discuss&#039;,shell:&#039;/bin/bash&#039;,password:&#039;geheimnis&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; emailaddress.add({set:{target:&#039;xyz00-list&#039;,localpart:&#039;discuss&#039;,domain:&#039;example.org&#039;}})&lt;br /&gt;
xyz00@hsadmin&amp;gt; bye&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit dem Parameter &amp;quot;target&amp;quot; wird die für diese Adresse eingehende Post zunächst in das Postfach des Users xyz00-list abgelegt.&lt;br /&gt;
&lt;br /&gt;
Für den User xyz00-list lege ich in seinem Heimat-Verzeichnis das Unterverzeichnis &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mkdir /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dann lege ich die Mailingliste mit folgendem Kommando an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
mlmmj-make-ml -L discuss -s /home/pacs/xyz00/users/list/mlmmj&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript &#039;&#039;mlmmj-make-ml&#039;&#039; fragt weitere Parameter der Mailingliste ab:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=output line&amp;gt;&lt;br /&gt;
The Domain for the List? [] : example.org&lt;br /&gt;
The emailaddress of the list owner? [postmaster] : webmaster@example.org&lt;br /&gt;
For the list texts you can choose between the following languages or&lt;br /&gt;
give an absolute path to a directory containing the texts.&lt;br /&gt;
Available languages:&lt;br /&gt;
cz  da	de  en	es  fr	it  nl	ru&lt;br /&gt;
The path to texts for the list? [en] : de&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das skript &#039;&#039;mlmmj-make-ml&#039;&#039; legt daraufhin unter &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; ein Verzeichnis &amp;quot;discuss&amp;quot; an, das die Datenstruktur zur Verwaltung der Mailingliste enthält.&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationen der Liste erfolgen durch das Anlegen von Dateien im&lt;br /&gt;
Verzeichnis &amp;quot;/home/pacs/xyz00/users/list/mlmmj/discuss/control&amp;quot;.&lt;br /&gt;
Die Konfigurationsmöglichkeiten finden Sie auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
Damit mlmmj die Verteilung der Post übernimmt, muß ich im Heimat-Verzeichnis des users xyz00-list die Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; mit folgenden Inhalt (INKLUSIVE der Anführungszeichen!) erstellen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
&amp;quot;|/usr/bin/mlmmj-recieve -L /home/pacs/xyz00/users/list/mlmmj/discuss/&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(Ja, &#039;&#039;receive&#039;&#039; schreibt sich mit &#039;&#039;-ei-&#039;&#039;, aber mlmmj hält einen symbolischen Link bereit für diejenigen, die in englischer Rechtschreibung unsicher sind:)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
xyz00-list@h03:~$ ls -la /usr/bin/mlmmj-rec*&lt;br /&gt;
-rwxr-xr-x 1 root root 27104 Sep 25  2018 /usr/bin/mlmmj-receive&lt;br /&gt;
lrwxrwxrwx 1 root root    13 Sep 25  2018 /usr/bin/mlmmj-recieve -&amp;gt; mlmmj-receive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt;-Datei sorgt dafür, dass eingehende E-Mails an das User-Postfach an das Programm &#039;&#039;mlmmj-recieve&#039;&#039; übergeben werden.&lt;br /&gt;
&lt;br /&gt;
Für regelmäßige Aufgaben der Listen-Managers definiere ich die&lt;br /&gt;
[[Cron|crontab]] wie folgt (immer noch als &#039;&#039;xyz00-list&#039;&#039;):&lt;br /&gt;
&lt;br /&gt;
  xyz00-list@h03:~$ crontab -e&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell line&amp;gt;&lt;br /&gt;
MAILTO=webmaster@example.org&lt;br /&gt;
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin&lt;br /&gt;
HOME=/home/pacs/xyz00/users/list&lt;br /&gt;
SHELL=/bin/bash&lt;br /&gt;
LANG=en_US.UTF-8&lt;br /&gt;
# m h  dom mon dow   command&lt;br /&gt;
28 */4 * * * /usr/bin/mlmmj-maintd -d /home/pacs/xyz00/users/list/mlmmj -F&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zum Schluss rufe ich das Skript mlmmj-sub auf, um die E-Mail-Adressen der gewünschten Abonnenten des Verteilers einzutragen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a klaus.muster@gmx.de -c &lt;br /&gt;
/usr/bin/mlmmj-sub -L /home/pacs/xyz00/users/list/mlmmj/discuss -a sabine.beispiel@arcor.de -c &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei bewirkt &amp;quot;-c&amp;quot;, dass der Abonnent eine Begrüßungs-Nachricht erhält. Alternativ kann man &amp;quot;-C&amp;quot; (großes C) angeben: dann muss der Abonnent das Abo durch Antworten auf die Nachricht bestätigen.&lt;br /&gt;
&lt;br /&gt;
== weitere Optionen  ==&lt;br /&gt;
&lt;br /&gt;
Noch ein paar Dinge, die Sie möglicherweise einstellen wollen:&lt;br /&gt;
&lt;br /&gt;
Ein Prefix in der Betreffzeile setzen, z.B.: &amp;quot;[discuss]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
 echo &amp;quot;[discuss]&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/prefix&lt;br /&gt;
&lt;br /&gt;
Wenn die Liste nur E-Mails von eingetragenen Abonnenten weiterleiten soll:&lt;br /&gt;
&lt;br /&gt;
 touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/subonlypost&lt;br /&gt;
&lt;br /&gt;
Damit der Listen-Owner weitere Abonnements bestätigen muss:&lt;br /&gt;
&lt;br /&gt;
 touch /home/pacs/xyz00/users/list/mlmmj/discuss/control/submod&lt;br /&gt;
&lt;br /&gt;
Einen &amp;quot;Reply-To:&amp;quot;-Header setzen, damit Antwort-Mails standardmäßig an die Mailing-Liste gehen:&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Reply-To:&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/delheaders&lt;br /&gt;
  echo &amp;quot;Reply-To: discuss@example.org&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/customheaders&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Um dies zu tun, setzen Sie den SMTP-Port entsprechend:&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;4025&amp;quot; &amp;gt; /home/pacs/xyz00/users/list/mlmmj/discuss/control/smtpport&lt;br /&gt;
&lt;br /&gt;
Weitere Konfigurationsvariante des Ausgangsserver sind unter https://www.hostsharing.net/doc/managed-operations-platform/email/ zu finden.&lt;br /&gt;
&lt;br /&gt;
Weitere Möglichkeiten finden Sie (wie oben bereits angegeben) &lt;br /&gt;
auf der [http://mlmmj.org/docs/tunables/ Internetseite von mlmmj].&lt;br /&gt;
&lt;br /&gt;
=== Achtung: DKIM ===&lt;br /&gt;
&lt;br /&gt;
Mlmmj gibt die Möglichkeit, mit &#039;&#039;&#039;delheaders&#039;&#039;&#039; und &#039;&#039;&#039;customheaders&#039;&#039;&#039; 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 &#039;&#039;Subject:&#039;&#039;, &#039;&#039;From:&#039;&#039;, &#039;&#039;To:&#039;&#039;, &#039;&#039;Date:&#039;&#039;, &#039;&#039;From&#039;&#039;, und oft auch &#039;&#039;Reply-To:&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Zur Konfiguration im Browser ==&lt;br /&gt;
&lt;br /&gt;
Die Original-Distribution von &#039;&#039;mlmmj&#039;&#039; 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.&lt;br /&gt;
&lt;br /&gt;
Wer es sich ansehen möchte:&lt;br /&gt;
&lt;br /&gt;
Als Paket-Admin eine Domain aufschalten:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=shell&amp;gt;&lt;br /&gt;
hsscript -u xyz00 -e &amp;quot;domain.add({set:{name:&#039;lists.example.org&#039;,user:&#039;xyz00-list&#039;}})&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Und weiter als &amp;quot;xyz00-list&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
Unter &amp;quot;/mlmmj-$versionsnummer/contrib/web/php-admin/&amp;quot;, oder beim .deb-Paket unter &amp;quot;usr/share/mlmmj-...&amp;quot;, findet sich die PHP-Admin-Anwendung. Also ...&lt;br /&gt;
&lt;br /&gt;
* den Inhalt diese Verzeichnisses nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/&amp;quot; packen;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/conf/config.php&amp;quot; die Variable &amp;quot;$topdir&amp;quot; anpassen;&lt;br /&gt;
* die Dateien aus &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs/&amp;quot; nach &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; verschieben;&lt;br /&gt;
* Beim .deb-Paket die config.php, die templates/ und die tunables.pl aus etc/ nach example.org/conf/ verschieben;&lt;br /&gt;
* in &amp;quot;/home/pacs/xyz00/users/list/mlmmj&amp;quot; und in &amp;quot;/home/pacs/xyz00/users/list/doms/lists.example.org/htdocs-ssl/&amp;quot; eine &amp;quot;.htaccess&amp;quot; mit folgendem Inhalt ablegen: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=apache line&amp;gt;&lt;br /&gt;
Require valid-user&lt;br /&gt;
AuthType Basic&lt;br /&gt;
AuthName &amp;quot;mlmmj web-interface&amp;quot;&lt;br /&gt;
AuthUserFile /home/pacs/xyz00/users/list/doms/lists.example.org/etc/htpasswd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Und schließlich die &amp;quot;htpasswd&amp;quot;-Datei anlegen.&lt;br /&gt;
&lt;br /&gt;
 cd /home/pacs/xyz00/users/list/doms/lists.example.org/etc/&lt;br /&gt;
 htpasswd -c htpasswd listadmin&lt;br /&gt;
&lt;br /&gt;
* Ein Passwort angeben.&lt;br /&gt;
&lt;br /&gt;
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&lt;br /&gt;
&lt;br /&gt;
* in &amp;lt;tt&amp;gt;.../htdocs-ssl/index.php&amp;lt;/tt&amp;gt; folgende Änderung vornehmen:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=diff line&amp;gt;&lt;br /&gt;
@@ -38,4 +38,5 @@&lt;br /&gt;
 # use scandir to have alphabetical order &lt;br /&gt;
 foreach (scandir($topdir) as $file) {&lt;br /&gt;
-    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+# ereg obsolete!! Vormals:    if (!ereg(&amp;quot;^\.&amp;quot;,$file))&lt;br /&gt;
+    if (!preg_match(&#039;/^\./&#039;,$file))&lt;br /&gt;
     {&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
und das Ergebnis auf https://lists.example.org anschauen.&lt;br /&gt;
&lt;br /&gt;
== Mehrere Mailinglisten betreiben ==&lt;br /&gt;
&lt;br /&gt;
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 &#039;&#039;mlmmj&#039;&#039; für die jeweiligen Liste mit ihrem Daten-Verzeichnis.&lt;br /&gt;
&lt;br /&gt;
Dazu trägt man in der Datei &amp;lt;tt&amp;gt;.forward&amp;lt;/tt&amp;gt; statt des Aufrufs von &#039;&#039;mlmmj-recieve&#039;&#039; einen Aufruf von &#039;&#039;procmail&#039;&#039; ein:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 |/usr/bin/procmail&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration von Procmail kann generisch erfolgen. Dazu legt man eine Datei &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; mit folgendem Inhalt ins $HOME des Users:&lt;br /&gt;
&lt;br /&gt;
 SHELL=/bin/sh&lt;br /&gt;
 HOMEDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
 MAILDIR=/home/pacs/xyz00/users/list/Maildir&lt;br /&gt;
 PMDIR=/home/pacs/xyz00/users/list&lt;br /&gt;
 VERBOSE=yes&lt;br /&gt;
 LOGFILE=/home/pacs/xyz00/users/list/var/procmail.log&lt;br /&gt;
 DEFAULT&lt;br /&gt;
 &lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH}/&lt;br /&gt;
 &lt;br /&gt;
 :0&lt;br /&gt;
 { EXITCODE 67 }&lt;br /&gt;
&lt;br /&gt;
Bitte dafür sorgen, dass das Verzeichnis &#039;&#039;/home/pacs/xyz00/users/list/var&#039;&#039; existiert.&lt;br /&gt;
&lt;br /&gt;
Der kryptische reguläre Ausdruck hinter dem Header &#039;&#039;X-Original-To:&#039;&#039; passt auf den Beginn der E-Mail-Adresse bis zum ersten &#039;&#039;@&#039;&#039;- oder &#039;&#039;+&#039;&#039;-Zeichen. In der Variable &#039;&#039;MATCH&#039;&#039; steht also der Name der Mailingliste, d.h. der Name der Verzeichnisses, in dem die Liste verwaltet wird.&lt;br /&gt;
&lt;br /&gt;
Sehr wichtig ist die Zeile &#039;&#039;DEFAULT&#039;&#039; zu Beginn der &#039;&#039;.procmailrc&#039;&#039;. Die Variable &#039;&#039;DEFAULT&#039;&#039; wird von &#039;&#039;procmail&#039;&#039; gesetzt. Wir sorgen mit dieser Zeile dafür, dass sie wieder undefiniert ist. Diese Variable wird intern von &#039;&#039;mlmmj&#039;&#039; benutzt, wenn sie gesetzt ist. Das führt in Kombination mit &#039;&#039;procmail&#039;&#039; zu Fehlfunktionen (vgl. Links).&lt;br /&gt;
&lt;br /&gt;
===Groß- und Kleinschreibung===&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Listen-Name&amp;quot; oder &amp;quot;listen-name&amp;quot; oder &amp;quot;Listen-name&amp;quot; sein. &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt; hingegen wird diesen Wert in Unix-Manier mit dem genauen Verzeichnisnamen &amp;lt;tt&amp;gt;${HOME}/mlmmj/listen-name&amp;lt;/tt&amp;gt; vergleichen, und bei unterschiedlicher Schreibweise die Mail nicht verteilen.&lt;br /&gt;
&lt;br /&gt;
====Lösung 1====&lt;br /&gt;
&lt;br /&gt;
Eine teilweise Lösung besteht darin, den Listennamen in dem &amp;lt;tt&amp;gt;mlmmj&amp;lt;/tt&amp;gt;-Aufruf in der &amp;lt;tt&amp;gt;.procmailrc&amp;lt;/tt&amp;gt; in Kleinbuchstaben umzuschreiben. Dann lautet das Rezept so:&lt;br /&gt;
&lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/$(echo ${MATCH} | tr [:upper:] [:lower:])/&lt;br /&gt;
&lt;br /&gt;
Der Rest der Datei muß gleich bleiben, wie weiter oben angezeigt.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall müssen aber alle Mailing-Listen ohne Großbuchstaben im Namen angelegt werden!&lt;br /&gt;
&lt;br /&gt;
(Man kann auch in &amp;lt;tt&amp;gt;${HOME}/mlmmj/&amp;lt;/tt&amp;gt; durch kleingeschriebene Symlinks großgeschriebene Listennamen ansprechbar machen:&lt;br /&gt;
&lt;br /&gt;
  xyz00-list@h02:~$ ls -lA mlmmj/&lt;br /&gt;
  total 8&lt;br /&gt;
  -rw-r--r--  1 xyz00-list xyz00  148 Feb  1 16:56 .htaccess&lt;br /&gt;
  lrwxrwxrwx  1 xyz00-list xyz00   10 Feb  2 18:01 mitglieder -&amp;gt; Mitglieder&lt;br /&gt;
  drwxr-xr-x 15 xyz00-list xyz00 4096 Feb  2 16:53 Mitglieder&lt;br /&gt;
&lt;br /&gt;
====Lösung 2====&lt;br /&gt;
&lt;br /&gt;
Bash kann bei der Auflösung von Variablen die Groß- und Kleinschreibung manipulieren. (Siehe dazu bei der Zeichenfolge &amp;lt;tt&amp;gt;,,&amp;lt;/tt&amp;gt; in &amp;lt;tt&amp;gt;man bash&amp;lt;/tt&amp;gt;.) Dann ist &amp;lt;tt&amp;gt;$(echo ${MATCH} | tr [:upper:] [:lower:])&amp;lt;/tt&amp;gt; gleichbedeutend mit &amp;lt;tt&amp;gt;${MATCH,,}&amp;lt;/tt&amp;gt;. Allerdings braucht procmail einige Überredung, um Bash zu verwenden.&lt;br /&gt;
&lt;br /&gt;
 SHELL=/bin/bash&lt;br /&gt;
 SHELLMETAS=&amp;amp;|&amp;lt;&amp;gt;~;?*[{&lt;br /&gt;
 HOMEDIR= ...&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
 :0:&lt;br /&gt;
 * ^X-Original-To: ()\/[^@+]+&lt;br /&gt;
 |/usr/bin/mlmmj-receive -F -L /home/pacs/xyz00/users/list/mlmmj/${MATCH,,}/&lt;br /&gt;
 &lt;br /&gt;
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 &#039;|&#039; am Anfang der Zeile zählt dabei nicht! In diesem Beispiel ist es das Zeichen &amp;lt;tt&amp;gt;{&amp;lt;/tt&amp;gt;, das den Einsatz von Bash auslöst.&lt;br /&gt;
&lt;br /&gt;
Beide Lösungen scheinen zu funktionieren; Angabe ohne Gewähr.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://mlmmj.org/ Projektseite&lt;br /&gt;
* https://codeberg.org/mlmmj mlmmj auf Codeberg&lt;br /&gt;
* https://github.com/tchapi/mlmmj-simple-web-interface ein Admin-Interface in NodeJS&lt;br /&gt;
* [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&lt;br /&gt;
* [https://gist.github.com/kboss/7c9593f0fd9219406226c4f11256b98a Einfaches Python-Script zum Massenimport aus einem Texfile.] Geht bestimmt auch eleganter mit purem Bash&lt;br /&gt;
* 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 &amp;quot;public&amp;quot;-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).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Jsu00</name></author>
	</entry>
</feed>