PostfixAdmin

Aus Tutorials
Zur Navigation springen Zur Suche springen

Da postfixdmin seine eigene Datenbankstruktur erzeugt, sollte man es daher installieren, bevor man postfix und dovecot konfiuriert.

Es ist nicht möglich, eine bereits bestehende dovecot-Datenbank zu verwenden, falls eine solche, mit abweichender Struktur, besteht.


Abhängigkeiten

sudo apt-get install php5-imap

Installation

postfixadmin herunterladen:

wget https://sourceforge.net/projects/postfixadmin/files/postfixadmin/postfixadmin-2.93/postfixadmin-2.93.tar.gz
tar -xzf postfixadmin-2.93.tar.gz
sudo mv postfixadmin-2.93 /var/www/postfixadmin/
sudo chown -R www-data:www-data /var/www/postfixadmin/

Datenbank anlegen:

mysql -u root -p 
mysql> create database if not exists postfix;
mysql> create user 'postfix'@'%' identified by '<password>';
mysql> grant all privileges on postfix.* to 'postfix'@'%';
mysql> flush privileges; 
mysql> quit;

Konfiguration

Apache2

cd /etc/apache2/conf-available/
sudo nano /etc/apache2/conf-available/postfixadmin.conf
Alias /postfixadmin "/var/www/postfixadmin/"
<Directory "/var/www/postfixadmin">
    Options +FollowSymLinks
    AllowOverride All

    <IfModule mod_dav.c>
      Dav off
    </IfModule>

    SetEnv HOME /var/www/postfixadmin
    SetEnv HTTP_HOME /var/www/postfixadmin
</Directory>

sudo a2enconf postfixadmin
sudo service apache2 reload

PostfixAdmin

Konfigurationsdatei anlegen (überschreibt die Standardwerte in config.inc.php):

cd /var/www/postfixadmin/
sudo -u www-data nano config.local.php

Datei sollte etwa folgendermaßen aussehen:

<?php
$CONF['configured'] = true;
$CONF['setup_password'] = '<setup password>';
$CONF['default_language'] = 'de';
$CONF['database_type'] = 'mysql';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = '<database password>';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = '<mail address>';
$CONF['encrypt'] = 'dovecot:SHA512-CRYPT';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw";
$CONF['transport'] = 'YES';

$CONF['default_aliasis'] = array (
     'abuse' => '<mail address>',
     'hostmaster' => '<mail address>',
     'postmaster' => '<mail address>',
     'webmaster' => '<mail address>'
);

$CONF['password_validation'] = array(
#    '/regular expression/' => '$PALANG key (optional: + parameter)',
    '/.{5}/'                => 'password_too_short 5',      # minimum length 5 characters
    '/([a-zA-Z].*){3}/'     => 'password_no_characters 3',  # must contain at least 3 characters
    '/([0-9].*){1}/'        => 'password_no_digits 1',      # must contain at least 1 digit(s)
);

$CONF['aliases'] = '100';
$CONF['mailboxes'] = '100';
$CONF['maxquota'] = '100';
$CONF['domain_quota_default'] = '2048';

$CONF['footer_text'] = 'Return to mail.<domain>';
$CONF['footer_link'] = 'https://mail.<domain>';
$CONF['mailbox_postcreation_script'] = 'sudo -u vmail /usr/local/bin/postfixadmin-mailbox-postcreation.sh';
$CONF['mailbox_postdeletion_script'] = 'sudo -u vmail /usr/local/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script'] = 'sudo -u vmail /usr/local/bin/postfixadmin-domain-postdeletion.sh';
?>

Setup aufrufen

Danach kann unter folgender Adresse kann die Setup-Seite aufgerufen werden:

http://<ip address>/postfixadmin/setup.php

Verzeichnisse automatisch erstellen bzw. löschen

Der Benutzer vmail muss bereits angelegt sein - siehe dazu die Seite Dovecot.

Verzeichnisse für die gelöschten Daten erstellen:

sudo mkdir /var/vmail-deleted
sudo chown vmail:vmail /var/vmail-deleted
sudo mkdir /home/vmail-deleted
sudo chown vmail:vmail /home/vmail-deleted

Maildir erstellen

In der Datei /var/www/postfixadmin/config.local.php folgende Zeilen einfügen:

$CONF['mailbox_postcreation_script'] = 'sudo -u vmail /usr/local/bin/postfixadmin-mailbox-postcreation.sh';
$CONF['mailbox_postdeletion_script'] = 'sudo -u vmail /usr/local/bin/postfixadmin-mailbox-postdeletion.sh';
$CONF['domain_postdeletion_script'] = 'sudo -u vmail /usr/local/bin/postfixadmin-domain-postdeletion.sh';

Die Scripte dafür liegen bereits in $DOCUMENT_ROOT/ADDITIONS und müssen nur noch ins cgi-bin-Verzeichnis kopiert werden:

sudo cp /var/www/postfixadmin/ADDITIONS/postfixadmin-mailbox-postcreation.sh /usr/local/bin/
sudo cp /var/www/postfixadmin/ADDITIONS/postfixadmin-mailbox-postdeletion.sh /usr/local/bin/
sudo cp /var/www/postfixadmin/ADDITIONS/postfixadmin-domain-postdeletion.sh /usr/local/bin/
sudo chown root:vmail /usr/local/bin/postfixadmin-*-post*.sh
sudo chmod 750 /usr/local/bin/postfixadmin-*-post*.sh

Datei /etc/sudoers bearbeiten (nicht direkt, sondern über visudo - macht einen Syntax-Check):

sudo visudo 

Am Ende folgende Zeilen einfügen:

# Allow postfixadmin to create/delete maildirs
www-data ALL=(vmail) NOPASSWD: /usr/local/bin/postfixadmin-mailbox-postcreation.sh
www-data ALL=(vmail) NOPASSWD: /usr/local/bin/postfixadmin-mailbox-postdeletion.sh
www-data ALL=(vmail) NOPASSWD: /usr/local/bin/postfixadmin-domain-postdeletion.sh

Das erlaubt dem Benutzer www-data die hinzugefügten Skripte als Benutzer vmail ohne Passwortabfrage auszuführen.


In der Datei /usr/local/bin/postfixadmin-mailbox-postcreation.sh folgende Zeilen anpassen:

basedir=/var/vmail
maildirmake.dovecot "$maildir"

In der Datei /usr/local/bin/postfixadmin-mailbox-postdeletion.sh folgende Zeilen anpassen:

basedir=/var/vmail
trashbase=/var/vmail-deleted

In der Datei /usr/local/bin/postfixadmin-domain-postdeletion.sh folgende Zeilen anpassen:

basedir=/var/vmail
trashbase=/var/vmail-deleted

Homedir

Zuerst legen wir ein Verzeignis für die Logdatei an:

sudo -u vmail mkdir /home/vmail/logs/
anlegen

Ähnlich dem ursprünglichen Skript postfixadmin-mailbox-postcreation.sh legen wir ein neues Skipt postfixadmin-homedir-postcreation.sh an:

sudo nano /usr/local/bin/postfixadmin-homedir-postcreation.sh

Dieses neue Skript wird mit folgenden Inhalt befüllt:

#!/bin/sh

# Change this to where you keep your virtual mail logfiles.
errorlog=/home/vmail/logs/error.log

# Change this to where you keep your virtual mail users' homedirs.
basedir=/home/vmail

if [ ! -e "$basedir" ]; then
    echo "$0: basedir '$basedir' does not exist; bailing out." >> $errorlog
    exit 1
fi

# create directory /home/vmail/<new user>/
current="${basedir}/$1"
mkdir -p "${current}" 
if [ $? -ne 0 ]; then
    echo "$0: mkdir -p '$current' returned non-zero; bailing out." >> $errorlog
    exit 1
fi

# create directory /home/vmail/<new user>/sieve/
current="${current}/sieve"
mkdir -p "${current}" 
if [ $? -ne 0 ]; then
    echo "$0: mkdir -p '$current' returned non-zero; bailing out." >> $errorlog
    exit 1
fi

# create directory /home/vmail/<new user>/sieve/scripts/
current="${current}/scripts"
mkdir -p "${current}" 
if [ $? -ne 0 ]; then
    echo "$0: mkdir -p '$current' returned non-zero; bailing out." >> $errorlog
    exit 1
fi

exit 0

Das Skript noch ausführbar machen und Besitzer ändern:

sudo chmod a+x /usr/local/bin/postfixadmin-homedir-postcreation.sh
sudo chown root:vmail /usr/local/bin/postfixadmin-homedir-postcreation.sh

Das fertige Skript wird dann im ursprünglichen Skript postfixadmin-mailbox-postcreation.sh aufgerufen:

sudo nano /usr/local/bin/postfixadmin-mailbox-postcreation.sh

Dazu am Ende der Datei anstelle von exit 0 folgende Zeilen einfügen:

# create home directory
`dirname "$0"`/postfixadmin-homedir-postcreation.sh `basename "$3"` 
exit $?
löschen

Verzeichnis für gelöschte Benutzerverzeichnisse anlegen:

sudo mkdir /home/vmail-deleted
sudo chown vmail:vmail /home/vmail-deleted

Ähnlich dem ursprünglichen Skript postfixadmin-mailbox-postdeletion.sh legen wir ein neues Skipt postfixadmin-homedir-postdeletion.sh an:

sudo nano /usr/local/bin/postfixadmin-homedir-postdeletion.sh

Dieses neue Skript wird mit folgenden Inhalt befüllt:

#!/bin/sh

# Change this to where you keep your virtual mail logfiles.
errorlog=/home/vmail/logs/error.log

# Change this to where you keep your virtual mail users' homedirs.
basedir=/home/vmail

# Change this to where you would like deleted homedirs to reside.
trashbase=/home/vmail-deleted


if [ ! -e "$trashbase" ]; then
    echo "trashbase '$trashbase' does not exist; bailing out." >> $errorlog
    exit 1
fi

if [ `echo $1 | fgrep '..'` ]; then
    echo "First argument contained a double-dot sequence; bailing out." >> $errorlog
    exit 1
fi

subdir=`echo "$1" | sed 's/@.*//'`

homedir="${basedir}/${subdir}"
trashdir="${trashbase}/`date +%F_%T`_${subdir}"

parent=`dirname "$trashdir"`
if [ ! -d "$parent" ]; then
    if [ -e "$parent" ]; then
        echo "Strainge - directory '$parent' exists, but is not a directory." >> $errorlog
        echo "Bailing out." >> $basedir/logs/error.log
        exit 1
    else
        mkdir -p "$parent"
        if [ $? -ne 0 ]; then
            echo "mkdir -p '$parent' returned non-zero; bailing out." >> $errorlog
            exit 1
        fi
    fi
fi

if [ ! -e "$homedir" ]; then
    echo "homedir '$homedir' does not exist; nothing to do." >> $errorlog
    exit 1
fi
if [ -e "$trashdir" ]; then
    echo "homedir '$trashdir' already exists; bailing out." >> $errorlog
    exit 1
fi

mv $homedir $trashdir

exit $?

Das Skript noch ausführbar machen und Benutzer ändern:

sudo chmod a+x /usr/local/bin/postfixadmin-homedir-postdeletion.sh
sudo chown root:vmail /usr/local/bin/postfixadmin-homedir-postdeletion.sh

Das fertige Skript wird dann im ursprünglichen Skript postfixadmin-mailbox-postdeletion.sh aufgerufen:

sudo nano /usr/local/bin/postfixadmin-mailbox-postdeletion.sh

Dazum am Ende der Datei anstelle von exit $? folgende Zeilen einfügen:

if [ $? -ne 0 ]; then
    echo "mv $maildir $trashdir returned non-zero; bailing out."
    exit 1
fi

# delete home directory
`dirname "$0"`/postfixadmin-homedir-postdeletion.sh `basename "$1"`
exit $?

Fetchmail

Daemon deaktivieren

In der Datei /etc/default/fetchmail folgende Zeile anpassen:

sudo vi /etc/default/fetchmail
START_DAEMON=no

Danach fetchmail stoppen:

sudo /etc/init.d/fetchmail stop

Abhängigkeiten

sudo apt-get update
sudo apt-get install -y liblockfile-simple-perl

Script fetchmail.pl

Fertiges Script von /<document root>/ADDITIONS/ nach /usr/local/bin/ kopieren:

sudo cp /var/www/postfixadmin/ADDITIONS/fetchmail.pl /usr/local/bin/
sudo chown root:vmail /usr/local/bin/fetchmail.pl
sudo chmod 750 /usr/local/bin/fetchmail.pl

In der Datei fetchmail.pl folgende Werte anpassen:

sudo nano /usr/local/bin/fetchmail.pl
# database backend
$db_type = 'mysql';
# host name
$db_host="10.0.0.120";
# database name
$db_name="postfix";
# database username
$db_username="postfix";
# database password
$db_password="<password>";

Lock-Datei anlegen

sudo -u vmail mkdir /home/vmail/fetchmail/
sudo -u vmail touch /home/vmail/fetchmail/fetchmail-all.lock
sudo nano /usr/local/bin/fetchmail.pl

Pfad zur Lock-Datei von

$run_dir="/var/run/fetchmail";

nach

$run_dir="/home/vmail/fetchmail";

ändern, da /var/run/ bei jedem Neustart geleert wird.

Cronjob anlegen

sudo -i
crontab -e
*/1 * * * * sudo -H -u vmail /usr/local/bin/fetchmail.pl > /dev/null 2&>1

Probleme

Invalid query: FUNCTION postfix.FROM_BASE64 does not exist

Bei Verwendung von PHP 5.5 muss in der Datei <document root>/model/PFAHandler.php folgende Zeile (ca. Zeile 572) von

$base64_decode = "FROM_BASE64(###KEY###)";

auf

$base64_decode = "###KEY###";

ausgebessert werden.

Fetchmail funktioniert nicht

Im Script fetchmail.pl ist in der folgenden Zeile ein Fehler:

} elsif($db_type eq "mysql") {
        $sql_cond = "active = 't' AND unix_timestamp(now())-unix_timestamp(date)";
}

't' muss auf 1 geändert werden:

} elsif($db_type eq "mysql") {
        $sql_cond = "active = 1 AND unix_timestamp(now())-unix_timestamp(date)";
}

Links

http://postfixadmin.sourceforge.net/

https://blog.unterhaltungsbox.com/mailserver-mit-postfix-dovecot-postfixadmin-und-mysql/

https://www.nesono.com/book/export/html/224

http://www.bunzel.net/2012/07/30/postfixadmin-aufsetzen/

https://wiki.archlinux.org/index.php/Virtual_user_mail_system

https://wiki.easycow.de/index.php?title=Fetchmail&redirect=no


Zurück zu Mailserver einrichten