Mailserver From Scratch (Debian 8)

Mailserver From Scratch

Nach bald zwei Jahren, wenig freier Zeit, viel Unentschlossenheit und den üblichen Dramen, die einem das Leben um die Ohren wirft, revanchiere ich mich mit einer Neuauflage zum „Mailserver Artikel“.

Es mag einiges noch unaufgeräumt wirken sein, vergebt mir, die nächsten Zeilen habe ich spontan und in sehr kurzer Zeit geschrieben. Ich bin mir sicher, dass sich die Struktur noch verändert. :-)

An dieser Stelle möchte ich auch einfach mal vielen, vielen Dank sagen. Vielen Dank an euch, die Community, die ihr mir so unglaublich viel Feedback gegeben- und garantiert auch in vieler Hinsicht belehrt habt.
Das betrifft jeden einzelnen Artikel, den ich in den letzten Monaten, fast schon Jahren, geschrieben habe.

Der Geschmack, der ersten von Spenden finanzierten Pizza. Daran erinnere ich mich besonders gerne zurück, glaube ich… :-)

Zurück zum Thema.

Einige Eckdaten des Beispielsystems:

  • Debian Jessie (8.0)
  • Es genügt schon ein Single-Core System mit etwa 1GB RAM, lediglich ClamAV ist etwas hungriger nach Resourcen.
  • Viel wichtiger ist einem Mailserver ausreichende Disk-Leistung. Aber auch erst dann, wenn es ernst wird; und das kann dauern.

Ein Server sollte seinen RAM belegen, denkt daran.

Einige Versionen aus dem Debian Jessie Repository:

  • Nginx 1.6.2 – Der Webserver, der über HTTPS angesprochen werden soll.
  • MySQL 5.5.43 – Eine Datenbank dient der gesamten Mailbox-Verwaltung. Eine weitere Datenbank wird von Roundcube verwendet.
  • PHP 5.6.7 – Die Webanwendungen Roundcube und ViMbAdmin arbeiten mit dem PHP-Intepreter zusammen.
  • Postfix 2.11 – Der MTA: Zuständig für den Transport von Nachrichten.
  • Amavis 2.10.1 – Amavis dient als Content-Filtern und signiert die Nachrichten nach DKIM.
    -> ClamAV 0.98.6 – Prüft Nachrichten auf schädlichen Inhalt.
    -> Spamassassin 3.4.0 – Ein erprobter Spamfilter.

Anwendungen externer Quellen, die Versionen variieren.

  • Dovecot 2.2.x – Der MDA, IMAP- und POP3-Server Dovecot zeugt von höchster Stabilität. In stetiger Entwicklung, daher Installation aus offiziellem Repository.
  • Roundcube 1.1.x – Unterstützt den gesamten Dovecot Umfang
  • ViMbAdmin 3, sollte nicht mehr als Fork von Postfixadmin betrachtet werden, dient aber ebenso zur Vewaltung der und Mailboxen.

Variablen im Artikel

  • Als Hostnamen verwende ich in diesem Artikel mail.domain.tld.
  • Die primäre Maildomäne wird domain.tld lauten.
  • Platzhalter der primären IP, unter der mein Mailserver extern erreichbar ist, verwende ich 1.2.3.4.
  • Passwörter lauten immer changeme.

Im Schnelldurchlauf: Funktionsweise und Vorwort

Annehmen wird Postfix Mails von nicht-autentifizierten Sendern auf Port 25. Vorgeschaltet ist Postscreen, ein Prozess, welcher entscheidet, ob es sich beim Sender um einen „Zombie“ handelt. Zombies können u.a. Spambots sein, die sich an keine/wenige Regeln halten und sich schon beim verbinden auf einfachster Ebene verdächtig anstellen. Auch übernimmt es die Aufgabe, eine IP gegen Blacklists zu prüfen. Postscreen ist in hohem Maße effizient und extrem simpel. Es ist in seiner Fähigkeit so beschränkt, dass es gültige Verbindungen an einen dafür vorgesehenen SMTP-Dienst durchreichen muss, um sie weiter zu verarbeiten.

Auf Port 587, gedacht zur authentifizierten Nachrichtenübertragung („Submission“), arbeitet kein Postscreen Prozess. Postscreen würde Verbindungen von dynamischen Anschlüssen (etwa DSL, Cable) sofort abstrafen und unterbinden.

Beide SMTP-Dienste reichen empfangene Nachrichten an Amavis weiter. Amavis fungiert als SMTP-Proxy. Nachrichten nicht-authentifizierter Benutzer werden Amavis auf Port 10024 erreichen, alle weiteren wiederum auf Port 10025. Amavis wird angewiesen, Nachrichten auf Port 10025 als „von seinem System stammend“ zu behandeln („originating“). Auch werden lediglich solche Nachrichten DKIM-signiert.

Entscheidet sich Amavis dafür, die Nachricht anzunehmen, wird sie nach Bearbeitung in beiden Fällen auf Port 10035 Postfix zurückgeführt.

Postfix wird die Transportregeln nach weiterem Vorgehen befragen und womöglich LMTP verwenden, um Dovecot die Nachricht final zu übermitteln. Die LMTP-Verbindung wird verschlüsselt (Achtung: Funktioniert nicht mit Dovecot aus dem Debian <= Jessie Repository. Unter anderem daher wird Dovecot aus dem offiziellen Dovecot Repository installiert.). LTMP versteht sich als relativ simple Ableitung des SMTP-Protokolls und wird hauptsächlich zu diesem Zweck verwendet. Es ähnelt als Abkömmling - logischerweise - stark dem SMTP. Dovecot verwendet in nachstehender Konfiguration das Maildir-Format. Layout- und Namespace-Separator lauten „/“, hauptsächlich um höchste ACL-Kompatibilität zu erreichen. Benutzernamen mit dem Satzzeichen „.“ stehen aus Erfahrung im Konflikt.
Das Hauptverzeichnis für virtuell geroutete Nachrichten lautet /var/vmail. Die weitere Struktur wird unterteilt in Domäne/Benutzer/, das „Maildir“ des Benutzers zuletzt im Unterordner „Maildir“ abgelegt. Für den Benutzer user1@domain1.tld ergibt so die Ordnerstruktur /var/vmail/domain1/user1/Maildir oder einfacher: ~/Maildir.
Dovecot stellt Postfix verschiedene Dienste zur Verfügung. Postfix ist unter anderem nicht in der Lage – und möchte auch nicht in der Lage sein -, Absender zu authentifizieren. Es greift auf einen Socket zurück, den Dovecot mit Hilfe des SASL-Mechanismus bereitstellt.

Was fehlt? …und warum?
Wo ist das Greylisting? Wo sind die Scripts, um Spam anzulernen?
Der ein oder andere könnte meine Meinung zum Greylisting bereits kennen. Wer es möchte, kann es einbinden.
Ich bin der Meinung, dass 99% der durch Greylisting abgestraften Mailserver zu Unrecht (temporär) blockiert werden. Ein kompromittierter E-Mail Account, etwa von Google Mail, wird sich an Greylisting nicht stören. Google Server versenden nach einem Fehlversuch erwartungsgemäß ein zweites mal.
Echte Spambots/Zombies werden wesentlich (!) performanter durch Postscreen ausgeschlossen. Hierbei wird auch kein temporärer Fehlercode missbraucht und die Zustellung nicht verzögert.
Das größte Übel: Ein fehlkonfigurierter Absender, der keinen zweiten Zustellversuch unternimmt und die Nachricht als unzustellbar zurück sendet.

Auch das Anlernen von Spam sehe ich zwiespältig. Einen Spamfilter vernünftig anzulernen, ist viel schwieriger als mancher es glauben mag. Zu schnell und unüberlegt bringen wir ihm bei, wie das Filtern nicht funktioniert. :-) Die größte Schuld an „false-positives“ tragen genau diese Lehrversuche.
Kompromittierte Mail-Accounts stellen hier wieder ein großes Problem dar. Ein vertrauter Server versendet authentifizierten Spam. Spamfilter werden der Tatsache, dass der Benutzer authentifizert ist, eine viel höheren Bedeutung zusprechen als der Tatsache, dass 2-3 mal ein dubioses Wort im Text zu finden ist. Hier zu filtern ist ein Drahtseilakt.
Spamfilter sind heutzutage sehr effizient. Zusammen mit Postscreen filtern sie die üblichen Verdächtigen bravorös aus.

Noch einmal kurz und knapp, wie konfiguriere ich meinen Client?
IMAP – Mit STARTTLS auf Port 143, im SSL Wrapper auf Port 993
SMTP – Mit STARTTLS auf Port 587, Port 25 wird als Client bitte nie verwendet.

Inhaltsverzeichnis

1. First things first
2. Webserver
2.1 Webanwendungen
3. Mailserver
3.1 Postfix
3.2 Dovecot
3.3 Content-Filter
4. Dienste neustarten

1. First things first

Nachdem das Debian Jessie System frisch aufgesetzt wurde, vergewissert euch noch einmal, dass die Grundkonfiguration stimmt.

timedatectl set-timezone Europe/Berlin
hostnamectl set-hostname mail.domain.tld

Bitte nehmt Abstand davon, einen Hostnamen domain.tld zu verwenden. domain.tld alleine ist kein Hostname.
Wählt einen FQDN, der sich aus Hostnamen und Domäne zusammensetzt.
Ich gehe in diesem Artikel von einem Server aus, der sich lediglich im öffentlichen Netz bewegt. Ein interner Name kommt daher nicht in Frage.

Die Datei /etc/hosts sollte mindestens Folgendem entsprechen:

127.0.0.1 localhost
1.2.3.4 mail.domain.tld mail
# ...

Im Terminal teste ich die korrekte Einrichtung:

# hostname -a
mail
# hostname -d
domain.tld
# hostname -f
mail.domain.tld

Warum ist der Hostname bei einem Mailsystem so wichtig?
Zwar wird der Hostname auch in diesem Artikel gezielt noch einmal in der Postfix-Konfiguration gesetzt.
Es ist dennoch wichtig, dass alle Komponenten im System den korrekten Namen kennen und tragen. Mailserver verwenden strikte Regelwerke, das ist dem hohen Spamaufkommen geschuldet. Das Mindeste, das wir tun können, um diese Kontrollen zu bestehen, ist uns an die Standards zu halten, also RFC-konform zu sein.
RFC-Konformität bedeutet unter anderem, dass unser Mailserver beim Verbindungsaufbau, einen FQDN nennt (Postfix: „myhostname“), der zu seiner IP auflöst und vice versa:

# Server A, mail.domain.tld (1.2.3.4), verbindet sich mit Server B, mail.example.com (2.3.4.5):
> HELO mail.domain.tld
# Interne Prüfung durch mail.example.com: Löst 1.2.3.4 nach mail.domain.tld auf (rDNS)? Löst mail.domain.tld nach 1.2.3.4 auf? Wenn ja, weiter machen…
< HELO mail.example.com ...

Daher bitte unbedingt einen korrekten Reverse-DNS Eintrag vorhalten!
Die meisten Benutzer werden heute einen (virtuellen) Server angemietet haben. Der ISP hält dafür in 99% aller Fälle eine Möglichkeit bereit, einen solchen Eintrag für die entsprechende IP eigenständig zu setzen. Diese Konfiguration ist nicht Bestandteil des lokalen Systems.

2. Webserver

In den ersten Schritten werden folgende Anwendungen installiert und weitesgehend konfiguriert:

  • Nginx (HTTPS)
  • PHP5
  • MySQL

Die Anwendungen werden mit einem Einzeiler installiert:

apt-get -y install nginx-full php-auth-sasl php-http-request php-mail php-mail-mime php-mail-mimedecode php-net-dime php-net-smtp php-net-socket php-net-url php-pear php-soap php5 php5-cli php5-common php5-curl php5-fpm php5-gd php5-imap php-apc php5-intl php5-mcrypt php5-mysql libawl-php php5-xmlrpc mysql-client mysql-server ca-certificates
Bitte vergebt während der Installation ein sicheres MySQL „root“ Kennwort.

Die Mailboxverwaltung sollte über HTTPS erfolgen, daher erstelle ich vorab ein selbst-signiertes Zertifikat in /etc/ssl, das den Namen des FQDN trägt. Der Befehl kann 1:1 so kopiert werden, der Hostname wird automatisch ermittelt:

openssl req -new -newkey rsa:4096 -sha256 -days 1095 -nodes -x509 -subj "/C=DE/ST=STATE/L=CITY/O=MAIL/CN=`hostname -f`" -keyout /etc/ssl/`hostname -f`.key  -out /etc/ssl/`hostname -f`.cer

Der Key wird im Anschluss vor unbefugtem Zugriff geschützt:

chmod 600 /etc/ssl/`hostname -f`.key
Wer im Besitz eines Zertifikats ist, darf das Zertifikat jetzt als /etc/ssl/mail.domain.tld.cer ablegen, den Key analog dazu als /etc/ssl/mail.domain.tld.key

Bitte Folgendes nur bei einem selbst-signiertem Zertifikat ausführen, um dem Zertifikat zu vertrauen:

cp /etc/ssl/`hostname -f`.cer /usr/local/share/ca-certificates/
update-ca-certificates

Einige Anwendungen verweigern den Dienst, wenn das Zertifikat selbst-signiert und nicht vertrauenswürdig ist. Das betrifft unter anderem Roundcube und die IMAP-Schnittstelle neuerer PHP Versionen.

PHP sollte nun unsere Zeitzone kennenlernen, dazu bitt die entsprechende Konfiguration öffnen:

nano /etc/php5/fpm/php.ini

Die relevante Zeile wird editiert:

date.timezone = Europe/Berlin

Den Dienst im Anschluss neuladen:

systemctl reload php5-fpm.service

Nun endlich kann die Nginx Site-Konfiguration erstellt und aktiviert werden.

nano /etc/nginx/sites-available/mailserver

Der Inhalt im Folgenden.
Bitte ändert die Werte für server_name, ssl_certificate und ssl_certificate_key entsprechend eurer Konfiguration ab.

server {
	server_name mail.domain.tld;
	listen 443 ssl;
	listen [::]:443 ssl;
	ssl on;
	ssl_certificate         /etc/ssl/mail.domain.tld.cer;
	ssl_certificate_key     /etc/ssl/mail.domain.tld.key;
	# Einige Optionen nach Bettercrypto
	ssl_prefer_server_ciphers on;
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	ssl_ciphers 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA';
	add_header Strict-Transport-Security max-age=15768000;
	ssl_session_cache shared:SSL:5m;
	ssl_session_timeout 30m;
	client_max_body_size 0;
	root /var/www/html;
	index index.html index.htm index.php;
	location / {
		try_files $uri $uri/ index.php;
	}
	# Zugriff auf Roundcube Logs, sollte von außerhalb nicht möglich sein
	location ~ ^/webmail/logs/ {
		deny all;
	}
	location ~ \.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_read_timeout 630;
		fastcgi_keep_conn on;
		# Dient ViMbAdmin, da Nginx keine htaccess-Datei einlesen wird
		fastcgi_param APP_ENV production;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
	}
	# Können sensible Daten enthalten, Nginx verwertet sie nicht
	location ~ /\.ht {
		deny all;
	}
	location = /favicon.ico {
		log_not_found off;
		access_log off;
	}
	# Keine Notwendigkeit
	location = /robots.txt {
		deny all;
		log_not_found off;
		access_log off;
	}
	location /admin {
		# Rewrite fix für ViMbAdmin
		try_files $uri $uri/ /admin/index.php?$args;
	}
}

Die Site-Konfiguration wird im Nginx Server aktiviert und der Dienst neugeladen:

ln -s /etc/nginx/sites-available/mailserver /etc/nginx/sites-enabled/
systemctl reload nginx.service

Zwei Datenbanken werden im nächsten Schritt angelegt. Im selben Schritt wird jeweils ein Benutzer das Recht erhalten, in jeweiliger Datenbank zu arbeiten.

changeme bitte in beiden Befehlen durch ein sicheres Kennwort ersetzen!
# ViMbAdmin: Datenbankname vimbadmin, Username vimbadmin
mysql --defaults-file=/etc/mysql/debian.cnf -e "CREATE DATABASE vimbadmin; GRANT ALL ON vimbadmin.* TO 'vimbadmin'@'localhost' IDENTIFIED BY 'changeme'; FLUSH PRIVILEGES;"
# Roundcube: Datenbankname roundcube, Username roundcube
mysql --defaults-file=/etc/mysql/debian.cnf -e "CREATE DATABASE roundcube; GRANT ALL ON roundcube.* TO 'roundcube'@'localhost' IDENTIFIED BY 'changeme'; FLUSH PRIVILEGES;"

2.1. Webanwendungen

Nachdem der Webserver vorbereitet ist, kann mit der Installation der Webanwendungen Roundcube und ViMbAdmin begonnen werden.

Die Abhängigkeiten vorab installieren:

apt-get install -y git curl

Mit cURL wird in einem späteren Schritt der PHP-Composer heruntergeladen, git ist eine direkte Abhängigkeit dessen.

Roundcube nun in einem Schritt herunterladen und entpacken. Anschließend wird der Ordner in webmail umbenannt und die Rechte werden angepasst:

cd /var/www/html
wget --content-disposition -O - http://sourceforge.net/projects/roundcubemail/files/latest/download | tar xfvz -
mv roundcubemail-* webmail

Eine Konfigurationsdatei für Roundcube wird angelegt:

nano /var/www/html/webmail/config/config.inc.php

Der Inhalt, dessen Werte für db_dsnw, default_host und smtp_server angepasst werden müssen.
Hinweis: Der Pfad db_dsnw folgt dem Muster schema://username:password@host/database.

<?php
$config = array();
$config['db_dsnw'] = 'mysql://roundcube:changeme@localhost/roundcube';
/* Auch lokal wird mit TLS gearbeitet (Stichwort: Sniffer) 
Der FQDN sollte "localhost" vorgezogen werden (Zertifikatsvalidierung) */
$config['default_host'] = 'tls://mail.domain.tld';
$config['smtp_server'] = 'tls://mail.domain.tld';
$config['smtp_port'] = 587;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['support_url'] = '';
$config['product_name'] = $_SERVER['HTTP_HOST'];
/* Roundcube erhält die Möglichkeit, ACLs und Sieve Filter durch Plugins zu verwalten. */
$config['plugins'] = array(
	'acl',
	'managesieve',
);
$config['login_autocomplete'] = 2;
$config['imap_cache'] = 'apc';
$config['username_domain'] = '%d';
$config['default_list_mode'] = 'threads';
$config['preview_pane'] = true;
/* Da ein selbst-signiertes Zertifikat verwendet wird, gestaltet sich
die Zertifikatsvalidierung weniger restriktiv */
$config['imap_conn_options'] = array(
    'ssl' => array(
      'allow_self_signed' => true,
      'verify_peer'       => false,
      'verify_peer_name'  => false,
    ),
);
$config['smtp_conn_options'] = array(
   'ssl'         => array(
      'allow_self_signed' => true,
      'verify_peer'       => false,
      'verify_peer_name'  => false,
   ),
);

Die Datenbank im nächsten Schritt initialisieren:

mysql --defaults-file=/etc/mysql/debian.cnf roundcube < /var/www/html/webmail/SQL/mysql.initial.sql

Abschließend den Eigentümer des Webroots rekursiv auf „www-data“ setzen:

chown -R www-data: /var/www/html

Nun zu ViMbAdmin, das sich im Gegensatz zu Roundcube mit dem PHP Composer installiert.

Den Composer daher vorab installieren und die ausführbare Datei composer.phar nach /usr/local/bin/ verschieben:

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

Im Anschluss startet die Installation des Paketes ViMbAdmin durch Composer:

composer create-project opensolutions/vimbadmin /srv/vimbadmin -s dev -n --keep-vcs

Nach erfolgreicher Installation, werden noch die Rechte für die Unterverzeichnisse var/ sowie public/ an den Webdienst angepasst:

chown -R www-data: /srv/vimbadmin/{public,var}

Zuletzt eine symbolische Verknüpfung einrichten, um mit dem Browser später das Panel via URL „https://mail.domain.tld/admin“ zu erreichen:

ln -s /srv/vimbadmin/public/ /var/www/html/admin

Eine Beispielkonfiguration bringt ViMbAdmin gleich mit. An ihr kann sich orientiert werden:

cp /srv/vimbadmin/application/configs/application.ini.dist /srv/vimbadmin/application/configs/application.ini
nano /srv/vimbadmin/application/configs/application.ini

Wichtige Punkte, die unbedingt zu ändern sind, habe ich zusammengefasst. Bitte lest die Datei aufmerksam durch.

;; Die sontigen MySQL-Parameter wie Datenbankname und Benutzer (vimbadmin) stimmen bereits überein, daher brauche ich nur noch das Kennwort durch das vorab festgelegte zu ersetzen
resources.doctrine2.connection.options.password = 'changeme'
;; Entspricht dem späteren vmail-Benutzer, dem stellvertretend alle Mailverzeichnisse "gehören"
defaults.mailbox.uid = 5000
defaults.mailbox.gid = 5000
;; Das Maildir wird im Dovecot-Format festgehalten
defaults.mailbox.maildir = "maildir:/var/vmail/%d/%u/Maildir:LAYOUT=fs"
defaults.mailbox.homedir = "/var/vmail/%d/%u"
;; Einige Details, der Transport sollte per Standard lmtps sein, mit Zeiger auf den passenden Socket
defaults.domain.transport = "lmtps:unix:private/dovecot-lmtp"
;; Erlaubt das endgültige Löschen von Mailboxen vom Dateisystem
mailbox_deletion_fs_enabled = true
;; Den stärksten Hash-Algorithmus bietet Dovecot durch "doveadm"
defaults.mailbox.password_scheme = "dovecot:SHA512-CRYPT"
defaults.mailbox.dovecot_pw_binary = "/usr/bin/doveadm pw"
;; Hierbei handelt es sich um die Informationen der Willkommensmail.
;; "mail.%d" (= "mail.domain.tld") trifft für diesen Artikel zu, sollte dem eigenen Hostnamen nach angepasst werden.
server.smtp.host    = "mail.%d"
server.smtp.port    = "587"
server.smtp.crypt   = "TLS"
;; POP3 wird in diesem Artikel nicht verwendet/konfiguriert
server.pop3.enabled = 0
;; Wieder verwende ich "mail.%d"
server.imap.host  = "mail.%d"
server.imap.port  = "143"
server.imap.crypt = "TLS"
;; Der Webmailer Roundcube ist unter URL/webmail zu erreichen, bitte an den Hostnamen anpassen
server.webmail.host  = "https://mail.%d/webmail"

Das Archiv-Verzeichnis bitte jetzt erstellen, die Rechte müssen nicht verändert werden (siehe weiter unten zu „Cron“):

mkdir /srv/archives

Es befinden sich neben Parametern wie „Default Quota“, die nach eigenem Ermessen verändert werden können, auch noch Angaben zur Identität des Dienstes am Ende der Konfigurationsdatei. Diese Daten sollten selbstverständlich ebenfalls angepasst werden. Bequemen Menschen steht es frei, mit „sed“ den Namen „example.com“ reihenweise zu ersetzen:

sed -i "s/example.com/domain.tld/g" /srv/vimbadmin/application/configs/application.ini

Damit die Datenbank initialisiert werden kann, benötigt ViMbAdmin noch eine rudimentäre Datei /srv/vimbadmin/public/.htaccess, die der Beispieldatei /srv/vimbadmin/public/.htaccess.dist entsprechen darf:

cp /srv/vimbadmin/public/.htaccess.dist /srv/vimbadmin/public/.htaccess
Nginx liest keine solchen Dateien. Jedoch wurde in der Site-Konfiguration bereits die Umgebungsvariable „APPLICATION_ENV“ auf „production“ gesetzt.

Die Einrichtung der Datenbank kann nun beginnen:

cd /srv/vimbadmin/
./bin/doctrine2-cli.php orm:schema-tool:create

Das Tool beendet seinen Dienst etwa mit folgenden Informationen:

ATTENTION: This operation should not be executed in a production environment.
Creating database schema...
Database schema created successfully!

Noch einmal wird die Konfigurationsdatei ViMbAdmins geöffnet, um letzte Informationen einpflegen zu können.

nano /srv/vimbadmin/application/configs/application.ini

Parallel in einem Browser die URL https://mail.domain.tld/admin aufrufen und den Anweisungen nach die drei fehlenden Parameter für das Salting in der geöffneten Datei ergänzen.

Nach dem Hinzufügen des administrativen Accounts, wurde ViMbAdmin in Hinsicht seiner Fähigkeit als Webanwendung erfolgreich installiert und konfiguriert.

Cron wird abschließend noch angewiesen, die Archiv- und Lösch-Funktion ViMbAdmins zu automatisieren. Hierbei handelt es sich um Funktionen, die „root“ ausführen muss.
Einzig die Aufgabe des Löschens, könnte dem Benutzer „vmail“ zugeordnet werden, das nur als Hinweis.

crontab -e

An das Ende der Datei einzufügen:

# Die 10. Minute jeder 2. Stunde
10 */2 * * * /srv/vimbadmin/bin/vimbtool.php -a archive.cli-archive-pendings
# Die 30. Minute jeder 2. Stunde
30 */2 * * * /srv/vimbadmin/bin/vimbtool.php -a archive.cli-restore-pendings
# Die 50. Minute jeder 2. Stunde
50 */2 * * * /srv/vimbadmin/bin/vimbtool.php -a archive.cli-delete-pendings
# 3:15 AM
15 3 * * * /srv/vimbadmin/bin/vimbtool.php -a mailbox.cli-delete-pending

3. Mailserver

3.1 Postfix

Postfix gibt sich in seinen Abhängigkeiten bescheiden:

apt-get install postfix-mysql postfix-pcre postfix
Während der Installation wird um den „server configuration type“ gebeten. Die Auswahl ist spielt keine Rolle, da die Konfiguration im Nachhinein überschrieben wird.

Zu Beginn erstelle ich das Verzeichnis /etc/postfix/mysql/, in welchem diverse SQL-Queries gespeichert werden, mit Hilfe derer Postfix ausfindig macht, welche Domänen wie behandelt werden und ob angefragte Domänen/Mailboxen dem System überhaupt angehören. Im Prinzip fragt Postfix an dieser Stelle ab, was wir vorher durch ViMbAdmin in die Datenbank einpflegen.

mkdir /etc/postfix/mysql/

Innerhalb dieses Ordners werden vier Dateien anglegt:

  • postfix-mysql-virtual_alias_maps.cf
  • postfix-mysql-virtual_domains_maps.cf
  • postfix-mysql-virtual_mailbox_maps.cf
  • postfix-mysql-virtual_transport_maps.cf
In jeder der folgenden Dateien wird der das Kennwort changeme bitte durch das MySQL-Kennwort des Benutzers der Datenbank „vimbadmin“ ersetzt!

/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf

user = vimbadmin
password = changeme
hosts = 127.0.0.1
dbname = vimbadmin
query = SELECT goto FROM alias WHERE address = '%s' AND active = '1'

/etc/postfix/mysql/postfix-mysql-virtual_domains_maps.cf

user = vimbadmin
password = changeme
hosts = 127.0.0.1
dbname = vimbadmin
query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = '0' AND active = '1'

/etc/postfix/mysql/postfix-mysql-virtual_mailbox_maps.cf

user = vimbadmin
password = changeme
hosts = 127.0.0.1
dbname = vimbadmin
table = mailbox
select_field = maildir
where_field = username

/etc/postfix/mysql/postfix-mysql-virtual_transport_maps.cf

user = vimbadmin
password = changeme
hosts = 127.0.0.1
dbname = vimbadmin
table = domain
select_field = transport
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

Das Passwort kann ebenso im Nachgang mit Hilfe von „sed“ ersetzt werden:

sed -i 's/changeme/passwort/g' /etc/postfix/mysql/postfix-mysql-virtual_*

Konfigurationsdateien mit sensiblen Informationen, sollten vor unbefugtem Zugriff geschützt werden:

chown -R root:postfix /etc/postfix/mysql
chmod 750 /etc/postfix/mysql/
chmod 640 /etc/postfix/mysql/*

Nun zur Konfiguration des Postfix Servers.
Im ersten Schritt wird eine vorherige Konfiguration gelöscht und eine neue erstellt:

rm /etc/postfix/main.cf
nano /etc/postfix/main.cf

Es folgt ein vorrangig in englischer Sprache kommentierter Inhalt. Die „Restrictions“ habe ich kurzerhand übersetzt.

# SMTPd greeting banner: You MUST specify $myhostname at the start of the text. This is required by the SMTP protocol.
smtpd_banner = $myhostname

# Disable local biff service
biff = no

# Do not append the string $mydomain to -locally- submitted email.
append_dot_mydomain = no

# Readme directory
readme_directory = /usr/share/doc/postfix

# HTML directory
html_directory = /usr/share/doc/postfix/html

# Certificates
smtpd_tls_cert_file = /etc/ssl/mail.domain.tld.cer
smtpd_tls_key_file = /etc/ssl/mail.domain.tld.key

# Opportunistic TLS. TLS auth only.
smtpd_tls_security_level=may
smtpd_tls_auth_only=yes

# TLS session cache for SMTPd
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# Disallow SSLv2 and SSLv3, only accept secure ciphers
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_ciphers=high

# Log TLS handling
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1

# Delay reject until RCPT TO
smtpd_delay_reject = yes

# Enable elliptic curve cryptography, "ultra" needs more cpu time
smtpd_tls_eecdh_grade = strong

# Sender, recipient, client and data restrictions
# !! non-FQDN HELOs are rejected on Port 25 only, see master.cf

# Auth. Benutzer dürfen auch innerhalb der "mynetworks" nur von den Adressen senden, die ihnen zugehörig sind.
smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch,
# Erst jetzt werden "mynetworks" zugelassen
# Unauth. Benutzer wie der Cron-Dienst können so weiterhin Mails versenden, etwa
# als cron@fqdn
   permit_mynetworks,
# Anderen unauth. Benutzern das Benutzen jeder Adresse verbieten.
   reject_sender_login_mismatch,
# Alle auth. jetzt zulassen.
   permit_sasl_authenticated,
# Nicht im System vorhandene Absender jetzt ablehnen
   reject_unlisted_sender,
# Ablehnen, wenn die Sender-Domäne nicht existiert
   reject_unknown_sender_domain

# Akzeptiere alle Empfänger, die ein authentifizierter Absender oder ein Absender aus "mynetworks" angibt
smtpd_recipient_restrictions = permit_sasl_authenticated,
   permit_mynetworks,
# Schnittstelle zu Dovecot, um die Quota live zu überprüfen (verhindert Bounces)
   check_policy_service unix:private/quota-status,
# Ablehnen, wenn der HELO FQDN nicht aufzulösen ist
   reject_unknown_helo_hostname,
# Ablehnen, wenn KEIN PTR zu dieser IP existiert
# Verhindert nicht, dass ein FALSCHER PTR abgelehnt wird!
# Hierfür würde "reject_unknown_client_hostname" verwendet.
   reject_unknown_reverse_client_hostname,
# Kein offenes Relay
   reject_unauth_destination

# Unauth. Benutzer dürfen ihre Befehle nicht "pipen"
smtpd_data_restrictions =
   reject_unauth_pipelining,
   permit

# Eine Art Tabelle mit vorhanden Identitäten und ihren Zugehörigkeiten
smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf

# Certificates
smtp_tls_cert_file = /etc/ssl/mail.domain.tld.cer
smtp_tls_key_file = /etc/ssl/mail.domain.tld.key

# Opportunistic TLS. Use TLS if this is supported by the remote SMTP server, otherwise use plaintext.
smtp_tls_security_level=may

# TLS session cache for SMTP
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# A custom list with secure ciphers.
tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

# Use the FQDN for the local hostname!
myhostname = mail.domain.tld

# Alias maps and database for -local- delivery only
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# The domain name that locally-posted mail appears to come from, and that locally posted mail is delivered to.
myorigin = mail.domain.tld

# The list of domains that are delivered via the -local- mail delivery transport. No external domains like "domain.tld" belong here! "mail.domain.tld" is fine.
mydestination = mail.domain.tld, localhost

# We lookup MX records to send non-local mail, so this stays empty
relayhost =

# Trusted SMTP clients with more privileges. Trusted clients can relay mail.
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

# The maximal size of any -local- individual mailbox
mailbox_size_limit = 0

# The maximal size of any -virtual- individual mailbox
virtual_mailbox_limit = 0

# Handle Postfix-style extensions
recipient_delimiter = +

# The network interface addresses that this mail system receives mail on.
inet_interfaces = all

# Specifies what protocols Postfix will use when it makes or accepts network connections, and also controls what DNS lookups Postfix will use when it makes network connections.
inet_protocols = ipv4

# VRFY command is not really needed anymore
disable_vrfy_command = yes

# Please say hello first...
smtpd_helo_required = yes

# The SASL plug-in type that the Postfix SMTP server should use for authentication.
smtpd_sasl_type=dovecot

# Where to passthrough our authentication information for the above plug-in
smtpd_sasl_path=private/auth_dovecot

# Enable SASL authentication in the Postfix SMTP server.
smtpd_sasl_auth_enable = yes

# Report the SASL authenticated user name in the smtpd Received message header.
smtpd_sasl_authenticated_header = yes

# Have Postfix advertise AUTH support in a non-standard way.
broken_sasl_auth_clients = yes

# The lookup tables that the proxymap server is allowed to access for the read-only service.
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps

## Virtual transport configuration
# A prefix that the virtual delivery agent prepends to all pathname results from $virtual_mailbox_maps
virtual_mailbox_base = /

# THIS contains a list of domains we are the final destination for (unlike "mydestination").
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_domains_maps.cf

# Alias specific mail addresses or domains to other local or remote address.
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf

# Specify a left-hand side of "@domain.tld" to match any user in the specified domain
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_mailbox_maps.cf

# The minimum user ID value that the virtual delivery agent accepts
virtual_minimum_uid = 5000

# We use "vmail" user with UID/GID 5000 to lookup tables
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

# The default mail delivery transport and next-hop destination for final delivery to domains listed with "virtual_mailbox_domains"
virtual_transport = lmtps:unix:private/dovecot-lmtp

transport_maps = mysql:/etc/postfix/mysql/postfix-mysql-virtual_transport_maps.cf

## Queue configuration
# Consider a message as undeliverable, when delivery fails with a temporary error, and the time in the queue has reached this limit.
maximal_queue_lifetime = 1d

# Consider a bounce message as undeliverable, when delivery fails with a temporary error, and the time in the queue has reached this limit.
bounce_queue_lifetime = 1d

# The time between deferred queue scans by the queue manager.
queue_run_delay = 300s

# The maximal/minimal time between attempts to deliver a deferred message.
maximal_backoff_time = 1800s
minimal_backoff_time = 300s

# Maximum mail size (500 MiB)
message_size_limit = 524288000

# This tarpits a client after 3 erroneous commands for 10s
smtpd_soft_error_limit = 3
smtpd_error_sleep_time = 10s
smtpd_hard_error_limit = ${stress?1}${stress:5}

postscreen_access_list = permit_mynetworks

# Drop connections from blacklisted servers with a 521 reply
postscreen_blacklist_action = drop

# Clean Postscreen cache after 24h
postscreen_cache_cleanup_interval = 24h

postscreen_dnsbl_ttl = 5m
postscreen_dnsbl_threshold = 8
postscreen_dnsbl_action = enforce
postscreen_dnsbl_sites =
  b.barracudacentral.org=127.0.0.2*7
  dnsbl.inps.de=127.0.0.2*7
  bl.mailspike.net=127.0.0.2*5
  bl.mailspike.net=127.0.0.[10;11;12]*4
  dnsbl.sorbs.net=127.0.0.10*8
  dnsbl.sorbs.net=127.0.0.5*6
  dnsbl.sorbs.net=127.0.0.7*3
  dnsbl.sorbs.net=127.0.0.8*2
  dnsbl.sorbs.net=127.0.0.6*2
  dnsbl.sorbs.net=127.0.0.9*2
  zen.spamhaus.org=127.0.0.[10;11]*8
  zen.spamhaus.org=127.0.0.[4..7]*6
  zen.spamhaus.org=127.0.0.3*4
  zen.spamhaus.org=127.0.0.2*3
  hostkarma.junkemailfilter.com=127.0.0.2*3
  hostkarma.junkemailfilter.com=127.0.0.4*1
  hostkarma.junkemailfilter.com=127.0.1.2*1
  wl.mailspike.net=127.0.0.[18;19;20]*-2
  hostkarma.junkemailfilter.com=127.0.0.1*-2
postscreen_greet_banner = $smtpd_banner
postscreen_greet_action = enforce
postscreen_greet_wait = 3s
postscreen_greet_ttl = 2d
postscreen_bare_newline_enable = no
postscreen_non_smtp_command_enable = no
postscreen_pipelining_enable = no
postscreen_cache_map = proxy:btree:$data_directory/postscreen_cache
Wieder wird jedes Auftauchen von „mail.domain.tld“ durch den eigenen FQDN ersetzt, wieder kann „sed“ die Aufgabe übernehmen:

sed -i 's/mail.domain.tld/host.example.com/g' /etc/postfix/main.cf
Bitte die Domäne domain.tld nicht unter „mydestination“ aufführen! Ziele, die in „mydestination“ geführt werden, werden von Postfix als „lokal“ behandelt. Ergo wird hierfür nicht der „virtuelle“ Transport mittels Dovecot verwendet.

Nun zu den Diensten, die Postfix bereitstellt. Diese werden mit Hilfe der Datei /etc/postfix/master.cf definiert, die wir ersetzen:

rm /etc/postfix/master.cf
nano /etc/postfix/master.cf

Der Inhalt, wieder weitesgehend kommentiert:

# Postscreen on Port 25/tcp, filters zombies (spam machines) on first level with lowest costs.
smtp      inet  n       -       n       -       1       postscreen

# Postscreen passes sane clients to the real SMTP daemon here.
smtpd      pass  -       -       n       -       -       smtpd
# Reject non-FQDN HELOs on Port 25 (after passing postscreen process)
  -o smtpd_helo_restrictions=permit_mynetworks,reject_non_fqdn_helo_hostname
  -o smtpd_proxy_filter=127.0.0.1:10024
  -o smtpd_client_connection_count_limit=10
  -o smtpd_proxy_options=speed_adjust

# For mail submitting users. Authenticated clients and known networks only.
submission inet n       -       -       -       -       smtpd
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_proxy_filter=127.0.0.1:10025
  -o smtpd_client_connection_count_limit=10
  -o smtpd_proxy_options=speed_adjust

# Handles TLS connections for postscreen to make them readable
tlsproxy  unix  -       -       n       -       0       tlsproxy
# This implements an ad-hoc DNS white/blacklist lookup service
dnsblog   unix  -       -       n       -       0       dnsblog

pickup    fifo  n       -       -       60      1       pickup
cleanup   unix  n       -       -       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
tlsmgr    unix  -       -       -       1000?   1       tlsmgr
rewrite   unix  -       -       -       -       -       trivial-rewrite
bounce    unix  -       -       -       -       0       bounce
defer     unix  -       -       -       -       0       bounce
trace     unix  -       -       -       -       0       bounce
verify    unix  -       -       -       -       1       verify
flush     unix  n       -       -       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       -       -       -       smtp
relay     unix  -       -       -       -       -       smtp
showq     unix  n       -       -       -       -       showq
error     unix  -       -       -       -       -       error
retry     unix  -       -       -       -       -       error
discard   unix  -       -       -       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       -       -       -       lmtp
anvil     unix  -       -       -       -       1       anvil
scache    unix  -       -       -       -       1       scache

# LMTP with STARTTLS support, needs newer Dovecot versions
lmtps     unix  -       -       -       -       -       lmtp
  -o lmtp_use_tls=yes
  -o lmtp_tls_loglevel=1
  -o lmtp_tls_CAfile=/etc/ssl/certs/ca-certificates.crt
  -o lmtp_enforce_tls=yes
  -o lmtp_tls_mandatory_protocols=!SSLv2,!SSLv3
  -o lmtp_tls_protocols=!SSLv2,!SSLv3
  -o lmtp_tls_mandatory_ciphers=high
  -o lmtp_tls_ciphers=high
  -o lmtp_send_xforward_command=yes
  -o lmtp_tls_security_level=encrypt
  -o lmtp_tls_note_starttls_offer=yes

# Amavis reinjection, maximal 5 smtpd Prozesse, muss den Amavis Prozessen entsprechen!
127.0.0.1:10035 inet    n       -       -       -       5       smtpd
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o receive_override_options=no_unknown_recipient_checks

In dieser Konfigurationsdatei muss nichts weiter angepasst werden.

3.2 Dovecot

Wie zu Beginn erwähnt, erfolgt die Installation aus dem offiziellen Repository Dovecots. Dieses wird zuerst eingebunden und der entsprechende Key installiert:

echo 'deb http://xi.rename-it.nl/debian/ stable-auto/dovecot-2.2 main' > /etc/apt/sources.list.d/dovecot.list
apt-get update -y
apt-get install --force-yes debian-dovecot-auto-keyring

Die Installation beginnt:

apt-get install dovecot-common dovecot-core dovecot-imapd dovecot-lmtpd dovecot-managesieved dovecot-sieve dovecot-mysql

Dovecot wird angewiesen, einen Benutzer „vmail“ mit der UID und GID 5000 zu verwenden. Dieser Benutzer muss noch angelegt werden, ebenso das Heimverzeichnis:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/vmail
mkdir /var/vmail
chown -R vmail: /var/vmail/

Eine Konfigurationsdatei wird gelöscht und neu erstellt:

rm /etc/dovecot/dovecot.conf
nano /etc/dovecot/dovecot.conf

Der Inhalt:

auth_mechanisms = plain login
disable_plaintext_auth = yes
login_log_format_elements = "user=<%u> method=%m rip=%r lip=%l mpid=%e %c %k"
mail_home = /var/vmail/%d/%n
mail_location = maildir:~/Maildir:LAYOUT=fs
mail_uid = vmail
mail_gid = vmail
# notify wird von mail_log benötigt. mail_log informiert in diesem Fall über DELETE und EXPUNGE (weiter unten)
mail_plugins = quota acl mail_log notify
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
ssl_protocols = !SSLv3 !SSLv2
ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA
log_timestamp = "%Y-%m-%d %H:%M:%S "
passdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
# Der "namespace separator" sollte "/" lauten, da es zusammen mit der ACL zu Konflikten käme, wenn der Benutzername das Zeichen "." enthält.
namespace inbox {
  inbox = yes
  location =
  separator = /
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
    mailbox "Deleted Messages" {
      special_use = \Trash
    }
    mailbox "Gelöschte Objekte" {
      special_use = \Trash
    }
    mailbox "Papierkorb" {
      special_use = \Trash
    }
  mailbox Archive {
    auto = subscribe
    special_use = \Archive
  }
    mailbox Archiv {
      special_use = \Archive
    }
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
    mailbox "Sent Messages" {
      special_use = \Sent
    }
    mailbox "Gesendet" {
      special_use = \Sent
    }
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
    mailbox Entwürfe {
      special_use = \Drafts
    }
  mailbox Junk {
    auto = subscribe
    special_use = \Junk
  }
  prefix =
}
# Dieser Namespace wird für die ACL Erweiterung benötigt.
# Freigegebene Ordner erscheinen automatisch in der Ordnerliste.
namespace {
    type = shared
    separator = /
    prefix = Shared/%%u/
    location = maildir:%%h/Maildir:LAYOUT=fs:INDEXPVT=~/Maildir/Shared/%%u
    subscriptions = yes
    list = yes
}
protocols = imap sieve lmtp
service dict {
  unix_listener dict {
    mode = 0660
    user = vmail
    group = vmail
  }
}
service auth {
  unix_listener /var/spool/postfix/private/auth_dovecot {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-master {
    mode = 0600
    user = vmail
  }
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }
  user = root
}
service managesieve-login {
  inet_listener sieve {
    port = 4190
  }
  service_count = 1
  process_min_avail = 2
  vsz_limit = 128M
}
service managesieve {
  process_limit = 256
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }
  user = vmail
}
listen = *
ssl_cert = </etc/ssl/mail.domain.tld.cer
ssl_key = </etc/ssl/mail.domain.tld.key
userdb {
  args = /etc/dovecot/dovecot-mysql.conf
  driver = sql
}
protocol imap {
  mail_plugins = quota imap_quota imap_acl acl mail_log notify
}
protocol lmtp {
  mail_plugins = quota sieve acl notify
  auth_socket_path = /var/run/dovecot/auth-master
  postmaster_address = postmaster@domain.tld
}
protocol sieve {
  managesieve_logout_format = bytes=%i/%o
}
protocol lda {
  mail_plugins = sieve quota acl notify
  postmaster_address = postmaster@domain.tld
}
plugin {
  mail_log_events = delete undelete expunge
# Um quasi-öffentliche Ordner für authentifizierte Benutzer via ACL zu erstellen
  acl_anyone = allow
# Wird automatisch verwaltet und beinhaltet eine Übersicht der Freigaben
  acl_shared_dict = file:/var/vmail/shared-mailboxes.db
# In jeder Mailbox wird von Dovecot eine Datei gepflegt, die die Freigaben regelt
  acl = vfile
  quota = maildir:User quota
# Die Ordner Trash und Sent erhalten +10% auf die Quota
  quota_rule = Trash:storage=+10%%
  quota_rule = Sent:storage=+10%%
# Eigene Sieve Filter liegen im Heimverzeichnis
  sieve = ~/sieve/dovecot.sieve
  sieve_dir = ~/sieve
# Der globale Filter außerhalb
  sieve_before = /var/vmail/before.sieve
  sieve_max_script_size = 1M
  sieve_quota_max_scripts = 0
  sieve_quota_max_storage = 0
# Auch dann weitermachen, wenn die Quota nicht ermittelt werden kann
# Gilt für den von Dovecot bereitgestellten Postfix policy service
  quota_status_success = DUNNO
  quota_status_nouser = DUNNO
  quota_status_overquota = "552 5.2.2 Mailbox is over quota"
}
service quota-status {
  executable = quota-status -p postfix
  unix_listener /var/spool/postfix/private/quota-status {
   group = postfix
   mode = 0660
   user = postfix
  }
  client_limit = 1
}
Neben mail.domain.tld bitte auch beide Postmaster-Adressen anpassen.

Wie auch Postfix, erhält Dovecot Anweisungen, wie es auf die MySQL-Datenbank zugreifen kann und an welcher Stelle es die notwendigen Daten erhällt.

nano /etc/dovecot/dovecot-mysql.conf
driver = mysql
connect = "host=localhost dbname=vimbadmin user=vimbadmin password=changeme"
default_pass_scheme = SHA512-CRYPT
password_query = SELECT username as user, password as password, \
        homedir AS home, \
        maildir AS mail, uid, gid, \
        concat('*:bytes=', quota) as quota_rule \
        FROM mailbox WHERE username = '%Lu' AND active = '1' \
        AND ( access_restriction = 'ALL' OR LOCATE( '%Us', access_restriction ) > 0 )
user_query = SELECT homedir AS home, \
        maildir AS mail, uid, gid, \
        concat('*:bytes=', quota) as quota_rule \
        FROM mailbox WHERE username = '%u'
iterate_query = SELECT username FROM mailbox;
changeme bitte durch das MySQL-Kennwort des Benutzer vimbadmin ersetzen.

Die Datei wird wieder vor unbefugtem Zugriff geschützt:

chown root:vmail /etc/dovecot/dovecot-mysql.conf
chmod 640 /etc/dovecot/dovecot-mysql.conf

Die weiteren Konfigurationsdateien innerhalb des Dovecot-Verzeichnisses werden nicht gelesen, können jedoch bestehen bleiben. Ein Löschen lohnt sich nicht, da sie durch „dpkg“ bei einem Upgrade neu erstellt würden.

Eine Datei „/var/vmail/before.sieve“ existiert als globales Sieve-Script, das erstellt werden kann, aber nicht muss.
Häufig wird solch ein Script verwendet, um als Spam markierte Nachrichten in den dafür vorgesehenen Ordner „Junk“ zu verschieben, etwa:

require "fileinto";
if header :contains "X-Spam-Flag" "YES" {
  fileinto "Junk";
}

Von Benutzern durch einen Client erzeugte Scripts sind sofort lauffähig. Unser globales Script muss jedoch zur Ausführung kompiliert und berechtigt werden:

# sievec erstellt eine neue Datei before.svbin
sievec /var/vmail/before.sieve
# Beide Dateien möchten wir vmail zuweisen
chown vmail: /var/vmail/before.*

3.3 Content-Filter

Die Abhängigkeiten zu Beginn. Dieses mal mit etwas Abwechslung: Das „non-free“ Repository muss aktiviert werden, um auch Anhänge filtern zu können, die mit dem unfreien Werkzeug „rar“ gepackt wurden.

apt-get install zip rar unrar unzip p7zip-full amavisd-new clamav-daemon spamassassin

Ich starte mit der Anpassung des Amavis Filters.
Änderungen in der Datei /etc/amavis/conf.d/50-user überschreiben vorhandene Parameter, daher bitte nur in dieser Datei arbeiten.

nano /etc/amavis/conf.d/50-user

Der nächste Abschnitt dient als Vorlage einer gesamten Datei 50-user.

Bitte die Vorlage gründlich durchlesen und ergänzen/anpassen
use strict;

# Maximale Anzahl an Prozessen, die Amavis vorhält.
# Siehe auch Anmerkung in master.cf im Listener für Reinjection
$max_servers = 5;

# Amavis wird mitgeteilt, wie auf die MySQL-Datenbank zugegriffen werden kann.
# "changeme" bitte anpassen
@lookup_sql_dsn = (
    ['DBI:mysql:database=vimbadmin;host=127.0.0.1;port=3306',
     'vimbadmin',
     'changeme']);

# Hierdurch ermittelt Amavis die lokalen Domänen
$sql_select_policy = 'SELECT domain FROM domain WHERE CONCAT("@",domain) IN (%k)';

# Ein Listener für die Herkunft "external" sowie "submission"
$inet_socket_port = [10024,10025];

# Mails werden auf Port 10035 zurückgeführt
$forward_method = 'smtp:[127.0.0.1]:10035';
$notify_method  = 'smtp:[127.0.0.1]:10035';

# Listener :10025 bekommt eine eigene Policy
$interface_policy{'10025'} = 'SUBMISSION';

$policy_bank{'SUBMISSION'} = {
        # Diese Mails kommen von einem vertrauten System
        originating => 1,
        # 7-bit Kodierung erzwingen, damit ein späteres Kodieren die DKIM-Signatur nicht zerstört
        smtpd_discard_ehlo_keywords => ['8BITMIME'],
        # Viren auch von auth. Sendern ablehnen
        final_virus_destiny => D_REJECT,
        final_bad_header_destiny => D_PASS,
        final_spam_destiny => D_PASS,
        terminate_dsn_on_notify_success => 0,
        warnbadhsender => 1,
};

# "mail.domain.tld" bitte anpassen
$myhostname = "mail.domain.tld";

# Wer wird über Viren, Spam und "bad header mails" informiert?
# Den Benutzer "postmaster" bitte nachträglich in ViMbAdmin erstellen (Alias möglich)
$virus_admin = "postmaster\@$mydomain";
$spam_admin = "postmaster\@$mydomain";
$banned_quarantine_to = "postmaster\@$mydomain";
$bad_header_quarantine_to = "postmaster\@$mydomain";

# DKIM kann verifiziert werden.
$enable_dkim_verification = 1;

# AR-Header darf gesetzt werden
$allowed_added_header_fields{lc('Authentication-Results')} = 1;

# DKIM-Signatur
# Gilt nur, wenn "originating = 1", ergo für die SUBMISSION policy bank
# "default" ist hierbei der Selector
# "domain.tld" als Domäne bitte anpassen
# "enable_dkim_signing" nur "1" setzen, wenn Mails wirklich signiert werden sollen.
# "/var/lib/amavis/db/dkim_domain.tld.key" sollte ebenso dem Namen der Domäne angepasst werden.
# Die TTL beträgt im Beispiel 7 Tage
# relaxed/relaxed beschreibt die Header/Body canonicalization, relaxed ist weniger restriktiv

$enable_dkim_signing = 1;
dkim_key('domain.tld', 'default', '/var/lib/amavis/db/dkim_domain.tld.key');
@dkim_signature_options_bysender_maps = (
    { '.' =>
        {
                ttl => 7*24*3600,
                c => 'relaxed/relaxed'
        }
    }
);

# Viren- und Spamfilter ACL; werden automatisch ermittelt
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);

#------------ Do not modify anything below this line -------------
1;  # ensure a defined return

Der private Schlüssel für die DKIM-Signatur wird nun erstellt. Ein sicherer Schlüssel ist 2048 Bits lang:
Schon in der Amavis-Konfiguration sollte der Name des Schlüssels /var/lib/amavis/db/dkim_domain.tld.key angepasst worden sein.
Für diesen Artikel behalte ich den Namen bei.

amavisd-new genrsa /var/lib/amavis/db/dkim_domain.tld.key 2048

Nachdem der Schlüssel geschrieben wurde, kann der notwendige Parameter für die DNS-Zone ausgelesen werden:

amavisd-new showkey domain.tld

Die Ausgabe sollte dem DNS-Server zugeführt werden.
Bevor der DNS-Server nicht angepasst wurde, sollten DKIM-Signaturen gemieden werden.
Zwar würden signierte Nachrichten nicht abgelehnt werden. Dennoch sollte sich an die Spielregeln gehalten werden.
Generell ist die Notwendigkeit von SPF- und DKIM-Records umstritten. Administratoren tendieren dazu, das Vorhandensein positiv anzurechnen, etwa wenige (Zehntel)punkte im Spamfilter abzuziehen. Aber die wenigsten Systeme strafen ein Fehlen ab. Selbst fehlerhafte Records unterbinden selten die Annahme jener Nachrichten. Das hat durchaus seine Gründe, etwa ist ein SPF-Record das Sorgenkind des Forwardings. Aber auch da steht die Methode des Forwardings im Vordergrund und begründet die nächste Diskussion…

Ein System, das zu restriktiv filtert, möchte keiner gerne verwenden. So sehr sich der Administrator auch wehrt, wird er sich dem Druck der Anwender beugen müssen.

Um Amavis die Verwendung des Virenscanners ClamAV zu gestatten, bedarf es letzten Anpassungen:

# User clamav der Gruppe amavis hinzufügen
adduser clamav amavis
# Gestatte Gruppen, denen clamav zugehört, das Scannen
# ACHTUNG, Ab 0.99.2 startet ClamAV mit diesem Parameter nicht mehr, da er entfernt wurde. Vielen Dank für den Hinweis!
sed -i 's/AllowSupplementaryGroups false/AllowSupplementaryGroups true/g' /etc/clamav/clamd.conf

4. Dienste neustarten

Spätestens jetzt sollten wir alle Dienste einmal neustarten.

systemctl restart {dovecot,postfix,amavis,spamassassin,clamav-daemon,nginx,php5-fpm,mysql}

Bewundert nun euer Werk unter den Adressen https://mail.domain.tld/webmail und https://mail.domain.tld/admin!

Gebt nicht auf, wenn es mal klemmt. Wenn ihr auf Probleme stößt, können wir uns austauschen und den Fehler finden.
Natürlich setzt der Artikel einiges an Verständnis voraus, aber irgendwo hat jeder mal angefangen.

306 Antworten auf “Mailserver From Scratch (Debian 8)

  1. Max Maier

    Ist es möglich, wenn ich nach dieser Anleitung den Mailserver erstellt habe Debian 8 ohne Probleme auf 9 zu updaten und welche Dateien muss ich abändern?

    Danke schon mal für eure Vorschläge.

    LG

    1. Mad

      Wie zwei Kommentare vorher von mir geschrieben:

      „Gestern habe ich dann den Schritt gewagt ein Upgrade auf Debian 9 zu machen: was soll ich sagen -> lief nahezu perfekt durch. Lediglich das php-pdo Paket musste nachinstalliert werden. Der Server funktioniert einwandfrei, und ich habe endlich meinen Seelenfrieden. :)“

      Gruss Mad

  2. Thomas L.

    Hallo,
    erstmal Danke für die Super Anleitung. Ich als Linux Neuling konnte alles problemlos ohne Fehler installieren.
    Jetzt nachdem ich allerdings zwei Fehler:
    1.beim Einrichten von IMAP in Outlook:
    An Posteingangsserver anmelden (IMAP): Die Verbindung wurde unerwartet vom Server beendet. Möglicherweise liegen Serverprobleme oder Netzwerkprobleme vor, oder das Zeitlimit wurde überschritten.

    Die Testmail konnte allerdings gesendet werden, also scheint SMTP zu funktionieren

    2. Nachdem ich mich in WebMail erfolgreich eingeloggt habe kommt:
    Serverfehler: SELECT: Internal error occurred. Refer to server log for more information.
    in der /var/www/html/webmail/log/error steht:
    [23-Aug-2017 18:19:41 Europe/Berlin] ERROR: BYE \“Internal error occured. Refer to server log for more information.\“ (6)
    [23-Aug-2017 18:19:41 +0200]: PHP Error: Unable to connect to managesieve on localhost:4190 in /var/www/html/webmail/plugins/managesieve/lib/Roundcube/rcube_sieve_engine.php on line 216 (GET /webmail/?_task=settings&_action=plugin.managesieve)
    [23-Aug-2017 18:19:41 Europe/Berlin] ERROR: Not currently in AUTHORISATION state (1)
    [23-Aug-2017 18:19:41 Europe/Berlin] ERROR: Not currently connected (1)

    Ich vermute es liegt an einer Einrichtung. Aber…

    Vielen Dank

  3. Mad

    Ich wollte mich nurnoch mal kurz zu Wort melden.

    Da mein Anliegen seinerzeit, den Mailserver direkt auf Debian9-Testing aufzusetzen, leider nicht funktionierte, lief mein Mailserver auf Debian 8 aber dank dieser sehr guten Anleitung einwandfrei. Selbst das „Problem“ von mehreren Domains lässt sich durch einfache Anpassung in der /etc/amavis/conf.d/50-user lösen.

    Gestern habe ich dann den Schritt gewagt ein Upgrade auf Debian 9 zu machen: was soll ich sagen -> lief nahezu perfekt durch. Lediglich das php-pdo Paket musste nachinstalliert werden. Der Server funktioniert einwandfrei, und ich habe endlich meinen Seelenfrieden. :)

    Danke nochmal der tollen Anleitung hier.

    Gruss Mad

  4. Uli

    Hallo Andre‘,

    danke für das großartige Howto jedoch macht mir dovecot Probleme -es fehlt eine w permission für /srv
    Error: Namespace “: stat(/srv/vmail/xxxx.de/info/mail) failed: Permission denied (euid=2000() egid=2000() missing +x perm: /srv, we’re not in group 0(root), dir owned by 0:0 mode=0770)
    /srv hat root:root
    /srv/vmail hat vmail:vmail

    Relay access denied; from= to= proto=ESMTP helo=
    Jun 26 11:25:30 r2 postfix/smtpd[24371]: disconnect from mx2.mail.org

    Wie muss ich hier die Rechte richtig setzen ?

    Gruss Uli

  5. Deffo

    Hi,
    vielen Dank für dieses wunderbare Tutorial!
    Mit dieser Hilfe habe ich meinen ersten Mailserver erfolgreich aufsetzen können :D

    Eine Anregung für alle die, die wie ich in einer LAB Umgebung zu Testzwecken einen Mailserver aufsetzen.
    Wenn die domain keine TLD ist, sondern wie bei mir xy.lab verweigert ViMbAdmin das Anlegen des Admin Accounts komplett.
    die domain kann allerdings unter: /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Validate
    per Editor hinzugefügt werden.

    Anschließend funktioniert das Anlegen des Accounts problemlos.

    Eine Bitte hätte ich dennoch, der Part mit DKIM ist mir noch nicht so klar.
    Währe es möglich auf die Integradtion im DNS Server einzugehen?
    Vielen Dank und Grüße

  6. Ralf Eßer

    Guten Tag Zusammen und vielen Dank für diese Anleitung!
    Ich habe die Installation nun fast beendet, Kopfschmerzen bereitet mir

    „amavisd-new showkey domain.tld

    Die Ausgabe sollte dem DNS-Server zugeführt werden.“

    Ich habe mittels Putty und SSH alles gemacht, allerdings stelle ich gerade fest, copy und paste nach Putty ist ja einfach, aber kann mir jemand einen Hinweis geben wie ich den Inhalt des Keys am einfachsten in die Zwischenablage bekomme und ggf. wie genau der TXT Eintrag im DNS aussehen sollte? Denn das ist mir noch etwas unklar.
    Danke!

    1. Ralf Eßer

      OK, ich habe sowieso erst einmal dkim ausgeschaltet.
      Beim testen jetzt habe ich allerdings ein klitzekleines Problem.
      Bereich Admin, bisher keine Fehler, Bereich webmail, in ein Postfach eingeloggt, Testemail geschrieben.
      Klicke ich in roundcube auf senden erhalte ich „SMTP Fehler (454): Die Authentisierung ist fehlgeschlagen.“
      Schaue ich in /var/www/html/webmail/logs/error dann steht da nicht viel an Ergänzung.
      Error: Invalid response code received from server (454) in /var/…/rcube.php on line 1712 (POST/webmail/?_task=mail&unlock=…..)
      Bin jetzt noch mal alles Punkt für Punkt durchgegangen, die Dienste noch einmal neu gestartet. Wo sollte ich suchen?
      Noch einmal vielen Dank!

  7. saulgodman

    Hallo,

    jemand spontan eine Idee? Musste von php5.6 auf php7.0 umsteigen. Jetzt hab ich ein problem mit open_basdir find aber keine lösung :(

    „Warning: is_readable(): open_basedir restriction in effect. File(/usr/share/php//srv/vimbadmin/application/../library/ViMbAdmin/Resource/Auth.php) is not within the allowed path(s): (/usr/share/nginx/mail/:/tmp/:/usr/share/nginx/mail/admin/:/srv/vimbadmin/) in /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Loader.php on line 186
    …..“

    „Fatal error: Uncaught Zend_Session_Exception: Session must be started before any output has been sent to the browser; output started in /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Loader.php/186 in /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Session.php:456 Stack trace
    …..“

    Danke :)

  8. Raphael

    hi!

    ich hab Eure Config verwendet und sie funktioniert soweit ganz gut.

    Ich kann aktuell nur keine Emails von einer bestimmten Domain aus USA empfangen.

    Ich bekomme da folgende Meldung :

    hostname postfix/smtpd[5965]: warning: hostname XXXX does not resolve to address AAAA.BBBB.CCCC.DDDD

    Wenn ich auf diese IP-Adresse einen nslookup durchführe, erhalte ich keinen explizite FQDN zurück, sondern nur einen Verweis auf die allgemeine Domain.

    Was kann ich tun ?

    Es betrifft eine dieser „Spam-Überprüfungen“ ?

    smtpd_recipient_restrictions = permit_mynetworks,
    permit_sasl_authenticated,
    reject_invalid_hostname,
    reject_non_fqdn_hostname,
    reject_unknown_recipient_domain,
    reject_non_fqdn_recipient,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain,
    reject_unknown_recipient_domain,
    check_recipient_access mysql:/etc/postfix/mysql-virtual_recipient.cf,
    reject_unauth_destination,
    reject_rbl_client ix.dnsbl.manitu.net,
    reject_rbl_client sbl.spamhaus.org,
    reject_rbl_client cbl.abuseat.org,
    reject_rbl_client dul.dnsbl.sorbs.net,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client psbl.surriel.com,
    reject_rbl_client noptr.spamrats.com

    Danke und Grüße,
    Raphael

  9. Norbert

    Hallo,

    auch von mir Danke für die Mühe, hat auch alles geklappt, habe nur noch eine kurze Anmerkung und Frage.

    Anmerkung:
    Warum nicht auch den Server mit anderen Mailserver per TLS reden lassen?
    Also:
    smtp_tls_CApath = /etc/ssl/certs
    smtp_tls_security_level = may
    smtp_tls_loglevel = 1
    smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_scache

    Ich verwende ein Letsencrypt Zertifikat dennoch ist die lokale Meldung:
    postfix/lmtp[13922]: Untrusted TLS connection established to mailserver.tld[private/dovecot-lmtp]: TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)

    Auch wenn ich die Letsencrypt Chain als CAFile angebe hilft es nicht.

    Auch sind alle Verbindungen die „reinkommen“ Untrusted, gibt es da eine Best-Practice für die TLS Konfiguration?

    Ich weiß, ist mehr Schönheit als wirklich ein „Problem“, da die TLS Verbindung ja besteht.

    Grüße,

    Norbert

  10. Cengiz

    Einwandfreies Tutorial, alles hat auf Anhieb geklappt. :-)

    Nun erhalte ich beim Aufruf von aptitude udpate allerdings folgenden Fehler für das dovecot-Paket

    W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://xi.rename-it.nl stable-auto/dovecot-2.2 Release: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY BC64CF5F03A2E7AE

    W: Failed to fetch http://xi.rename-it.nl/debian/dists/stable-auto/dovecot-2.2/Release:
    W: Some index files failed to download. They have been ignored, or old ones used instead.

    Versuche über apt-key den oben genannten PUBKEY zu installieren schlagen allerdings fehl. Weiß jemand Rat?

    Danke!

  11. mad

    moin moin,

    erstmal danke für die tolle anleitung.
    und gleich ne kurze frage…

    wie verhält sich die config bei zwei domains auf dem server? reicht ein CNAME entry oder muß man anderweitig handgreiflich werden?

    danke & mfg

    1. mad

      meine vorherige frage hat sich bereits erledigt…
      leider ergibt sich ein anderes problem für mich -> diene anleitung funktioniert leider aktuell (noch) nicht für debian 9 (stretch). schade, aber da muss ich wohl noch etwas geduld haben.

      mfg

      1. joas

        Hallo,
        habe ebenfalls Debian 9 „Stretch“, mit dieser Anleitung funktioniert es ziemlich gut.
        Was funktioniert denn genau bei dir nicht?
        Fehlermeldung?

        Gruß joas

        1. mad

          hallo und danke der schnellen antwort.

          es hapert schon an diversen paketen wie zb php5, welche fehlen. AFAIK ist php5 nicht mehr in stretch vorhanden, und es kann nicht gewiss gesagt werden, ob es vllt noch kommt. ich möchte das system ungern um irgendwelche ports erweitern, also gibt es irgendwelche alternativen…?

          wie hat du die geschichte unter deb 9 (ohne fremdpakete) zu laufen gebracht?

          mfg

          1. mad

            Paketlisten werden gelesen… Fertig
            Abhängigkeitsbaum wird aufgebaut.
            Statusinformationen werden eingelesen…. Fertig
            Paket mysql-client ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.
            Doch die folgenden Pakete ersetzen es:
            mariadb-client-10.1

            Paket php5 ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.

            Paket php5-gd ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.

            Paket php5-cli ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.

            Paket php5-common ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.

            Paket php5-mcrypt ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.

            Paket php5-mysql ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.

            Paket mysql-server ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.
            Doch die folgenden Pakete ersetzen es:
            mariadb-server-10.1

            Paket php5-curl ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.

            Paket php-apc ist nicht verfügbar, wird aber von einem anderen Paket
            referenziert. Das kann heißen, dass das Paket fehlt, dass es abgelöst
            wurde oder nur aus einer anderen Quelle verfügbar ist.

            E: Paket php-mail-mimedecode kann nicht gefunden werden.
            E: Für Paket »php5« existiert kein Installationskandidat.
            E: Für Paket »php5-cli« existiert kein Installationskandidat.
            E: Für Paket »php5-common« existiert kein Installationskandidat.
            E: Für Paket »php5-curl« existiert kein Installationskandidat.
            E: Paket php5-fpm kann nicht gefunden werden.
            E: Für Paket »php5-gd« existiert kein Installationskandidat.
            E: Paket php5-imap kann nicht gefunden werden.
            E: Für Paket »php-apc« existiert kein Installationskandidat.
            E: Paket php5-intl kann nicht gefunden werden.
            E: Für Paket »php5-mcrypt« existiert kein Installationskandidat.
            E: Für Paket »php5-mysql« existiert kein Installationskandidat.
            E: Paket php5-xmlrpc kann nicht gefunden werden.
            E: Für Paket »mysql-client« existiert kein Installationskandidat.
            E: Für Paket »mysql-server« existiert kein Installationskandidat.

            1. mad

              so, mit etwas mühe und einigen anpassungen läuft der nginx mit ViMbAdmin auf php7 unter stretch. das eigentliche problem ist aber, dass eben viele pakete in stretch ersetzt worden sind, so gibt es halt kein mysql-* mehr sondern das paket mariadb, was aber bei mir noch nicht zum stillstand führte. dovecot zb ist in aktueller version direkt in den repos enthalten…

              aber leider „amavisd-new“ nicht (kein maintainer). ein „von hand bauen“ bringt leider nichts, da sämtliche paket-abhängigkeiten zu fuss installiert werden müssen, und die doku drückt sich da leider sehr technisch aus.

              ergo: ab hier ist erstmal schicht im schacht…schade…

              mfg

  12. joas

    vielen Dank für die ausführliche Anleitung =)
    eine Frage bezüglich des Spamfilters, was ist mit den Paketen „razor“ und „pyzor“?
    Sollte man nicht mitinstallieren?

  13. Uli

    Hallo,

    erstmal Danke für dieses sehr verständliche Tutorial. Dennoch habe ich wohl irgendwo einen blöden Fehler gemacht , welchen ich einfach nicht finde. Rufe ich https://domain.tld/admin bzw. /webmail auf erhalte ich von nginx einen 403 forbidden Error.

    Anbei mal die config für den webserver

    server_name mail1.domain.tld;
    listen 443 ssl;
    listen [::]:443 ssl;
    ssl on;
    ssl_certificate /etc/ssl/mail1.doamin.tld.cer;
    ssl_certificate_key /etc/ssl/mail1.domain.tld.key;
    # Einige Optionen nach Bettercrypto
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ‚EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA‘;
    add_header Strict-Transport-Security max-age=15768000;
    ssl_session_cache shared:SSL:5m;
    ssl_session_timeout 30m;
    client_max_body_size 20;
    root /var/www/html/webserver;
    index index.html index.htm index.php;
    location / {
    try_files $uri $uri/ index.php;
    }
    # Zugriff auf Roundcube Logs, sollte von außerhalb nicht möglich sein
    location ~ ^/webmail/logs/ {
    deny all;
    }
    location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_read_timeout 630;
    fastcgi_keep_conn on;
    # Dient ViMbAdmin, da Nginx keine htaccess-Datei einlesen wird
    fastcgi_param APP_ENV production;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
    # Können sensible Daten enthalten, Nginx verwertet sie nicht
    location ~ /\.ht {
    deny all;
    }
    location = /favicon.ico {
    log_not_found off;
    access_log off;
    }
    # Keine Notwendigkeit
    location = /robots.txt {
    deny all;
    log_not_found off;
    access_log off;
    }
    location /admin {
    # Rewrite fix für ViMbAdmin
    try_files $uri $uri/ /admin/index.php?$args;
    }
    }

    Was habe ich da falsch gemacht?

    Danke

  14. Richard

    Vielen Dank für das tolle Tutorial! Habe jetzt 2 Mail Server nach deinem Tutorial aufgesetzt und beide laufen problemlos.

    Ich hätte jetzt noch gerne eingebaut, dass Mails an bestimmte Adressen, über einen anderen Mailserver als relay verschickt werden. Hier stecke ich allerdings fest, weil ich nicht weiß wie ich die entsprechende transport map einrichten kann, da diese ja aus der Vimbadmin Datenbank abgefragt wird.

    Hättest du hier vielleicht einen Tipp für mich?

    Beste Grüße,

    Richard

  15. Andreas

    Bei mir taucht immer ein Fehler auf von anvil. Es scheint mit dem ulimit zu tun zu haben.

    dovecot: managesieve-login: Error: read(anvil) failed: EOF
    dovecot: auth: Error: read(anvil-auth-penalty) failed: EOF

    Sonst geht alles. Hab diesen guide jetzt schon zum zweiten mal benutzt und bin sehr zufrieden.

  16. Dennis

    Erst einmal vielen Dank für die tolle Anleitung! Mein Mailserver läuft. Ich benötige jedoch noch, um Mails in unser CMD einzubinden POP3. Wie ist das nun nachträglich einzurichten?

  17. Tim

    Ein Traum einer Anleitung! Vielen Dank fürs teilen!

    Evtl. kannst du bei der Installation des ClamAV noch einen Hinweis geben, dass dieser über FreshClam erst die DB aktualisieren muss, was eine Weile dauern kann. Ich war da zu schnell und bekam „*** Unchecked ***“ Emails und der daemon-Dienst wollte wegen fehlendem Daily-Verzeichnis nicht starten.
    Ich hab den FreshClam Dienst erst einmal beendet, per „freshclam“ die Viren-DB manuell aktualisiert und den Dienst sowie clamav-daemon und amavis neu gestartet, dann gings. Erledigt sich sonst in den nächsten 10 Minuten.

    Grüße,
    Tim

    1. Christoph

      Hallo – Ich hätte die Kommentare zuerst lesen sollen. Ich hatte das selbe Problem mit freshclam und ich habe das genauso gelöst wie Tim: clamav-freshclam gestoppt, „freshclam“ manuell gestartet und danach clamav-freshclam und clamav-daemon wieder gestartet.

      Falls jemand in den Kommentaren nach Fehlermeldungen sucht:
      in /var/log/syslog:
      (!)connect to /var/run/clamav/clamd.ctl failed, attempt #1: Can’t connect to a UNIX socket /var/run/clamav/clamd.ctl: No such file or directory

      Ausgabe von /etc/init.d/clamav-daemon status :
      ConditionPathExistsGlob=/var/lib/clamav/daily.{c[vl]d,inc} was not met

      Evtl ist das ja ein Bug in der aktuellen Version. Der manuelle freshclam-Aufruf dauert keine Sekunde.

  18. Christian

    Hi,
    mein nach diesem Tutorial aufgesetzter Mailserver läuft immer noch, ich hab allerdings seit einiger Zeit ein kleines Issue dem ich nicht auf die Schliche komme. Vielleicht hat jemand eine Idee: Ein Benutzer bekommt regelmäßig E-Mails doppelt oder mehrfach. Allerdings erst wenn er sie löscht. Also er löscht eine E-Mail und sie ist kurz drauf wieder da. Er löscht sie nochmal und kurz drauf ist sie wieder da. Das sind „interne“ E-Mails (von der gleichen Domain – meinem Server), aber auch externe, zum Beispiel Mails von eBay usw. Im Log haben diese E-Mails die gleiche Message ID, ich bin daher relativ sicher, dass die E-Mails nicht tatsächlich mehrfach zugestellt werden. Er verwendet die GMail App auf einem Android Tablet, und hin und wieder Thunderbird auf einem Notebook. Seine Internetverbindung ist etwas instabil und manchmal langsam, kann also sein, dass da diverse Verbindungsabbrüche im Spiel sind. Ich vermute ja Dovecot als die Komponente die hier doppelt produziert, hab aber keinen Plan wie ich hier weitersuchen kann. Die Logs ergeben keine brauchbaren Infos.

    Hatte das schon mal jemand, fällt jemandem eine Lösung oder ein Ansatz wie ich weitersuchen kann dazu ein?

  19. Adam

    Hallo!

    Wirklich ein tolles Tutorial. Ich habe es mit LDAP implementiert und es läuft (immerhin ;-)) mal im Test (für Produktion traue ich mich noch nicht) auf einer Subdomain.

    Was mir aufgefallen ist: in den Mail-Headern wird nie Spam erwähnt… funktioniert der SPAM Filter denn dann nicht, und wie kann ich ihn „einschalten“?

    Auch wäre noch die Frage, wie ich LDAP statt MySQL bei Amavis einsetzen kann:

    # Amavis wird mitgeteilt, wie auf die MySQL-Datenbank zugegriffen werden kann.
    # „changeme“ bitte anpassen
    @lookup_sql_dsn = (
    [‚DBI:mysql:database=vimbadmin;host=127.0.0.1;port=3306‘,
    ‚vimbadmin‘,
    ‚changeme‘]);

    # Hierdurch ermittelt Amavis die lokalen Domänen
    $sql_select_policy = ‚SELECT domain FROM domain WHERE CONCAT(„@“,domain) IN (%k)‘;

    Google hat mir da leider gar nicht geholfen und ich habe die beiden Zeilen erst einmal gelöscht.

    Danke und viele Grüße!

  20. Daniel

    Die Anleitung ist auch noch im November 2016 nach ein paar Minor Versionssprüngen von Debian Jessie aktuell und gültig.
    Der Mailserver funktioniert tadellos…

    Andere Frage:
    Hat jemand von Euch Erfahrungen in der Installation von Z-Push in Kombination mit Dovecot? Ich bekomme die Konfiguration einfach nicht hin. Z-Push ist außerhalb der Zarafa Groupware Lösung wenig dokumentiert und noch weniger in Kombination mit Dovecot UND Nginx.

    Nach ersten Checks von meiner Seite aus sind wohl alle notwendigen PHP-Pakete für Z-Push durch die obige Anleitung schon vorhanden.
    Die Herausforderung für mich stellt aber zum Einen das Deaktivieren von einigen PHP-Flags in Nginx dar:

    php_flag magic_quotes_gpc muss auf off
    php_flag register_globals miss auf off
    php_flag magic_quotes_runtime muss auf off
    php_flag short_open_tag muss auf on

    Zum Anderen die Konfig von Z-Push selbst mit dem Dovecot IMAP Backend in der für Z-Push vorgesehenen Konfig Datei. Welches ist hier die beste Kombination? Host = localhost, Port = 993 und /tls/nocert-validation?

    Kann jemand helfen?

    Danke und viele Grüße
    Daniel

    1. Daniel

      Habe Z-Push selbst zum Laufen bekommen.
      Allerdings musste ich dazu auf Apache als Webserver umsteigen. Mit nginx wollte es bei mir einfach nicht funktionieren.
      Die apache Konfig für ViMbAdmin und roundcube ist sehr gut auf deren WiKi Seiten dokumentiert.

      Für Z-Push gibt es auch einige gute HowTo’s im Netz zu finden (bspw. http://gergernaut.de/z-push-mit-imap-anbindung/).

      Achtet zusätzlich noch darauf darauf, dass ihr in der config.php des IMAP Backends die Variable define(‚IMAP_FOLDER_CONFIGURED‘, true); setzt.
      Sonst hagelt es im Log Fehlermeldungen, dass die IMAP Ordnerstruktur für Z-Push nicht konfiguriert ist.

      Viele Grüße
      Daniel

  21. Thorsten

    Hey, ich habe das ganze mal realisiert und funktioniert auch tadellos.
    Es gibt allerdings ein Problem, welches ich zu lösen versuche und nicht durchsteige. :)
    Wieso kann man sich per SMTP nur mit der E-Mail Adresse als Nutzer anmelden und nicht mit dem „Namen“.
    In der vimbadmin mysql db (mailbox) steht als Username auch die Mailadresse.
    Ist es irgendwie möglich das zu ändern?

  22. Charly

    hallo an @alle
    kann mir jemand erklären wie ich Roundcube & ViMbAdmin aktualisieren kann?
    Da ich mich mit git, curl, Composer nicht so super gut auskenne, möchte ich auf sicher gehen, das ich nichts falsche mache.

  23. Martin .J.

    Hallo André
    Vielen dank für dein Anleitung. Alles lief soweit alles super. Nur habe ich folgendes Problem.
    Ich habe im ViMbAdmin eine meiner Mailbox gelöscht, und wollte diese wieder mit dem gleichen Namen erstellen. ViMbAdmin meldet mir jetzt aber „Mailbox already exists for „martin@meineadresse.com“

    Ein Verzeichniss „/var/vmail/meineadresse.com/martin“ existiert gar nicht mehr, jedoch in der mysql (mysql> show columns from mailbox;) finde ich doch noch auf position 5 einen Eintag „martin@meineadresse.com“
    im mysql finde ich auf
    1 | postmaster@meineadresse.com ……
    2 | hostmaster@meineadresse.com ……
    4 | admin@meineadresse.com ……
    5 | martin@meineadresse.com ……

    Wieso löschte ViMbAdmin nicht komplett alles, wenn ich eine Adresse löschen möchte?
    In den Logs habe ich nach fehler gesucht, aber keine passende Einträge gefunden die hier helfen können.

    Kenn mich leider mit denn mysql Befehlen nicht so supi aus. Kann mir jemand Helfen das zu berichtigen?

    mfg Martin

  24. Martin

    Hallo zusammen,

    zunächst einmal vielen Dank für das tolle Tutorial:-)

    Leider habe ich (auch nach dem 2 Versuch) das Problem, dass, sobald ich mich versuche mich mit meinem Benutzer (oder x-beliebigen) bei Roundcube anzumelden, ich immer die Fehlermeldung „Verbindung zum Speicherserver fehlgeschlagen“.

    Hat hier jemand eine konstruktive Idee, wo ich den Hebel ansetzen kann?

    Vielen Dank im Voraus
    M

    1. Benedikt

      Hey,
      sie dir doch mal dein Syslog an.
      ich hatte das selbe Problem bei mir, der user vmail hatte nicht das Recht den Ordner des neuen Nutzers anzulegen. Ein chown -R vmail:vmail hat die lösung gebracht.

      LG

  25. Daniel Klötzsch

    Super Tut, super erklärt und durchgängig logisch!!!

    Dake dafür!!!

    Hat jemand von euch auch das Problem, das die Filer nicht angelegt werden können?
    Es kommt immer folgende Fehlermeldung:

    mail dovecot: managesieve(123@123.de): Error: sieve: file storage: mkdir_parents_chgrp(/srv/vmail/123.de/damian73/sieve/tmp) failed: Permission denied (euid=5000(vmail) egid=5000(vmail) missing +w perm: /srv, dir owned by 0:0 mode=0755)

    Der Fehler ist, das in „/srv/vmail/…“ gesucht wird ind nicht in „/var/vmail/“ finde aber in den Configs nichts dazu passendes.

    Kann jemand helfen?

    Grüße

    1. Nils

      Die Frage ist schon etwas älter, aber falls noch jemand das Problem hat:
      In der Datei /srv/vimbadmin/application/configs/application.ini gibt es die Einträge zur default-Mailbox, die müssen so aussehen:
      defaults.mailbox.maildir = „maildir:/var/vmail/%d/%u/mail:LAYOUT=fs“
      defaults.mailbox.homedir = „/var/vmail/%d/%u“

      WICHTIG: Die Einstellung muss VOR dem Anlegen der ersten Mailadresse geändert werden. Ansonsten stehen die Pfade verkehrt in der Datenbank. Wer weiss was er tut, kann das natürlich direkt dort ändern.

  26. Torben

    Sehr schöne Anleitung. Ich würde an deiner Stelle ein Javascript einbauen, wo oben eine Textbox mit dem Domainnamen ist. So kann für alle Configs direkt die richtige Domain angezeigt werden.
    ( also mail.domain.tld wird überall dann mail.meineseite.de ) Optimal direkt mit random passwort welches oben Gobal angezeigt wird.

  27. Marcus S.

    Vielen Dank für die ausführliche Anleitung.

    leider hab ich ein Problem mit Dovecot…
    Der Dienst lässt sich einfach nicht starten.

    der einzige Fehler, den ich finden kann ist folgender in syslog

    systemd[61527]: Failed at step NAMESPACE spawning /usr/sbin/dovecot: Permission denied
    systemd[1]: dovecot.service: control process exited, code=exited status=226
    systemd[1]: Unit dovecot.service entered failed state.

    Eine Idee was ich übersehen habe?

  28. PC-Opa

    Hallo André,

    der neue Mailserver mit dieser Konfiguration läuft super.

    Leider gelingt es mir nicht, von anderen Servern mit PHPMailer oder sSMTP darüber Mails zu versenden (SMTPauth=true; Port=587; Security=tls).
    Was muss ich an der Konfiguration dafür ändern?

    1. Jonas

      Kann es sein, dass du den Parameter „mynetworks“ in der main.cf noch anpassen musst?

      # Trusted SMTP clients with more privileges. Trusted clients can relay mail.
      mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/21

      Du musst natürlich deine IP oder Bereich mit Subnetzmaske angeben.

      1. PC-Opa

        Hallo Jonas,

        habe ich gemacht, ohne verändertem Ergebnis:
        Connection: opening to mail.serverdomain.tld:587, timeout=300, options=array ( )
        Connection: opened
        SERVER -> CLIENT: 220 mail.serverdomain.tld
        CLIENT -> SERVER: EHLO XXX.XXX.XXX.XXX
        SERVER -> CLIENT: 250-mail.serverdomain.tld 250-PIPELINING 250-SIZE 524288000 250-ETRN 250-STARTTLS 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
        CLIENT -> SERVER: STARTTLS
        SERVER -> CLIENT: 220 2.0.0 Ready to start TLS
        CLIENT -> SERVER: EHLO XXX.XXX.XXX.XXX
        SERVER -> CLIENT: 250-mail.serverdomain.tld 250-PIPELINING 250-SIZE 524288000 250-ETRN 250-AUTH PLAIN LOGIN 250-AUTH=PLAIN LOGIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN
        CLIENT -> SERVER: MAIL FROM:
        SERVER -> CLIENT: 250 2.1.0 Ok
        CLIENT -> SERVER: RCPT TO:
        SERVER -> CLIENT: 554 5.7.1 : Client host rejected: Access denied
        SMTP ERROR: RCPT TO command failed: 554 5.7.1 : Client host rejected: Access denied
        CLIENT -> SERVER: QUIT
        SERVER -> CLIENT: 221 2.0.0 Bye
        Connection: closed
        SMTP Error: The following recipients failed: XXX@XXXXX.XXX: : Client host rejected: Access denied

        Eine andere Idee?

      2. mike

        Hi Jonas,

        ich kann leider auch keine Verbindung zu 587 aufmachen, von extern. Es klappt super vom localhost aber von keinem anderen Rechner. So meine Vermutung ist das er nur von einer bestimmten IP Range Verbindungen annimmt. Ich hab das auch ohne FW getestet bin mir also relativ sicher das meine Annahme stimmt, die Frage ist nur wo kann ich das einstellen das er auch von ausserhalb Verbindungen auf 587 annimt.

        Dank und Gruß
        MIke

        1. mike

          Hi Jonas,

          Ich hatte gerade ein Gespräch mit meinem Router und es stellt sich heraus das es bei Telekom Routern eine Email Schutzfunktion gibt. Nachdem ich meinen Server als zulässigen SMTP Server in die Liste eingetragen hatte lief alles wie geschmiert.
          Danke für das tolle Tutorial!

          Beste Grüße
          Mike

          1. Andreas

            haha oh man. Danke für den Hinweis. Habe auf Telekom Hybrid mit LTE Empfang umgestellt… und vor meine AVM Fritzbox 7490 noch den Speedport im Dachboden geklatscht… seit 10 Tagen kann ich meinen SMTP Server nicht mehr erreichen… scheiß speeedport ;-) meinen Mailserverr der Liste hinzugefügt und es geht wieder, oh man,

  29. Marco

    Hallo André

    Dein HowTo läuft bei mir soweit Einwandfrei
    Auch https://mail.domain.tld/webmail und https://mail.domain.tld/admin fünktioniert Einwandfrei.
    Jedoch möchte (habe) ich nun mein MX-Record auf mx1.domain.tld geändert auch alles im Postfix & Dovecot. Der DNS sollte passen. Im Roundcube kann ich E-Mails senden und Empfangen, jedoch Thunderbird verweigert mir die Verbindung zu mx1.domain.tld. Aus denn Logs bekomme ich nicht viel, jedoch via Telnet erhalte ich folgendes:

    telnet mx1.domain.tld 587
    Trying x7x.2×9.xx.1xx…
    Connected to mx1.domain.tld.
    Escape character is ‚^]‘.
    220 mx1.domain.tld
    EHLO mail.mailserver.de
    250-mx1.domain.tld
    250-PIPELINING
    250-SIZE 524288000
    250-ETRN
    250-STARTTLS
    250-ENHANCEDSTATUSCODES
    250-8BITMIME
    250 DSN
    MAIL FROM:
    250 2.1.0 Ok
    RCPT TO:
    554 5.7.1 : Client host rejected: Access denied

    Mein Ziel ist, das ich mich via mail.domain.tld ins Webmail und Admin einloggen kann, aber der die Mails sollten aber via mx1.domain.tld laufen.
    Hast du mir vielleicht einen anhaltspunkt?

  30. helt

    dovecot ist in jessie in jetzt 2.2.13 – Das reicht scheinbar nicht (Hast du ja geschrieben, aber die Angabe ganz zu Beginn ist dann doch etwas irreführend („Dovecot 2.2.*x* – Der MDA, IMAP- und POP3-Server Dovecot zeugt von höchster Stabilität. In stetiger Entwicklung, daher Installation aus offiziellem Repository.“)

    Mit jessie-backports allerdings kommt man auch ohne einen unbekannten key akzeptieren zu müssen an dovecot 2.2.24. Das müsste ja prinzipiell reichen, denn im May 2015, also du den Artikel geschrieben hast, war vermutlich v.2.2.18 o.ä aktuell.

    *habs so probiert und es hat funktioniert*

    Hier das snippet, um dovecot aus den jessie-backports zu installieren…


    touch /etc/apt/sources.list.d/jessie-backports.list
    echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/apt/sources.list.d/jessie-backports.list
    apt-get update
    apt-get -t jessie-backports install dovecot-common dovecot-core dovecot-imapd dovecot-lmtpd dovecot-managesieved dovecot-sieve dovecot-mysql

  31. Jonas

    Hey,

    ich habe einen Mailserver nach der Anleitung gebaut, funktioniert echt super, vielen Dank.
    Ich suche allerdings noch nach einer Möglichkeit bestimmte eMail Adressen/Domains zu Whitelisten.

    Wie geht man da am besten vor?
    Danke und viele Grüße
    Jonas

  32. PC-Opa

    Wow!!!

    Schon nach der Wheezy-Anleitung hatte ich meinen ersten Mailserver gebaut, jetzt ging es mit diesem Tutorial in weniger als 3 Stunden – und es funktioniert.

    Vielen Dank

  33. saulgodman

    dovecot: imap(mail@mail.com): Error: User initialization failed: Namespace “: mkdir(/srv/vmail/mail.com/mail/mail) failed: Permission denied (euid=5000(vmail) egid=5000(vmail) missing +w perm: /srv, dir owned by 0:0 mode=0755)

    Jemand eine lösung hab alles nach derAnleitung hier gemacht und hab an keiner stelle diesen Pfad zum einstellen gefunden!

    /srv/vmail/…

    bei mir gibts nur /var/vmail/

  34. Masin

    Dank der netten Leute in irc://freenode.net/#letsencrypt habe ich jetzt auch eine funktionierende Konfiguration für Zertifikate von Let’s Encrypt für Dovecot, die ich hier gern teilen möchte.

    $config[‚imap_conn_options‘] = array(
    ’ssl‘ => array(
    ‚allow_self_signed‘ => false,
    ‚verify_peer‘ => true,
    ‚verify_depth‘ => 3,
    ‚verify_peer_name‘ => true,
    ‚peer_name‘ => ‚mail.domain.tld‘,
    ‚cafile‘ => ‚/etc/ssl/certs/ca-certificates.crt‘,
    ‚SNI_enabled‘ => true,
    ),
    );
    Analog smtp_conn_options.

    1. saulgodman

      Hast du dafür eine lösung ich versuche auch mit Letsencrypt den Mail server zum laufen zubekommen.

      Beim login über roundcube kommt dann der fehler hier

      Jul 22 16:35:27 Debian-82-jessie-64-minimal dovecot: master: Dovecot v2.2.devel (d81a83b) starting up for imap, sieve, lmtp (core dumps disabled)
      Jul 22 16:35:27 Debian-82-jessie-64-minimal dovecot: managesieve-login: Fatal: Couldn’t parse private ssl_key: error:0906D06C:PEM routines:PEM_read_bio:no start line: Expecting: ANY PRIVATE KEY
      Jul 22 16:35:27 Debian-82-jessie-64-minimal dovecot: managesieve-login: Fatal: Couldn’t parse private ssl_key: error:0906D06C:PEM routines:PEM_read_bio:no start line: Expecting: ANY PRIVATE KEY
      Jul 22 16:35:27 Debian-82-jessie-64-minimal dovecot: master: Error: service(managesieve-login): command startup failed, throttling for 2 secs

  35. Max

    Hallo,

    ich würde gerne name-„string“@fomain.tld nutzen können. Ich habe dafür in der main.cf folgendes eingetragen:
    recipient_delimiter = + eingetragen. In der /etc/amavis/conf.d/20-debian_defaults: $recipient_delimiter = ‚-‚;. In den Logs sehe ich aber immer folgendes:
    Jun 17 15:48:04 mail postfix/lmtp[3354]: 08B6862869: to=, relay=mail.domain.tld[private/dovecot-lmtp], delay=2.4, delays=0.32/0.21/0.77/1.1, dsn=5.1.1, status=bounced (host mail.domain.tld[private/dovecot-lmtp] said: 550 5.1.1 User doesn’t exist: name-„string“@domain.tld (in reply to RCPT TO command))

    Kann da jemand helfen?

  36. DUSTY

    Hallo,

    vorab danke für das tolle Tutorial !

    Kann man mittlerweile aus den offizielen Jessy Repos upgraden oder gibt es dort immernoch kein LMTP ?
    Ich bekomme nämlich seit längerer Zeit angezeigt das die Dovecot Pakete bei jedem Upgrade zurückgehalten werden und das nervt langsam ein wenig ^^

    Danke und schöne Grüße

  37. Florian

    Hi!

    Danke für die tolle Anleitung.
    Gibt es eine Möglichkeit, die Konfiguration so anzupassen, dass Push-Nachrichten für Smartphones möglich sind?
    Z.B.: http://mishmashmoo.com.au/blog/?p=208
    Kann ich das Paket einfach so installieren?

    Was müsste an deiner Konfiguration ausserdem angepasst werden, dass bei STARTTLS nur SSL verwendet werden darf, bzw. über STARTTLS nur verschlüsselte Kommunikation erfolgen darf?

    Danke für deine Antwort.

  38. Thomas

    Super Anleitung, vielen Dank!
    Wenn ich jett mehrere Domains einrichte und für diese Domains auch (letsencrypt) Zertifikate habe, an welcher Stelle binde ich die ein?
    Vielen Dank!

  39. Dennis Cramer

    Erstmal vielen Dank für dieses Tutorial.
    Ich bin grade bei der Planung eines Mailservers, dass mit verschiedenen LXD-Containern realisiert wird (Mailserver, Sogo, Datenbank, Mailadmin). Ich möchte dabei nicht auf eine Fertiglösung setzen, sondern zumindest ein Stück weit die Materie selbst verstehen, wenn ich den Mailserver aufbaue.

    Gibt es bald eine Neuauflage deines „Mailserver from Scratch“ Tutorials, vielleicht mit neuer Software (Sogo, fuglu) ?

  40. j4mb4l4j4

    Ubuntu 16.04 mit PHP7: Läuft mit der Installation astrein.

    Solltet Ihr folgenden Fehler beim Roundcube bekommen:
    „FastCGI sent in stderr: „PHP message: PHP Warning: Declaration of rcmail::get_instance($env = “) should be compatible with rcube::get_instance($mode = 0, $env = “) in /var/www/MAILSERVER/webmail/program/include/rcmail.php on line 30″ while reading response header from upstream, client: 185.39.223.5, server: MAILSERVER, request: „GET /webmail/?_task=login HTTP/1.1“, upstream: „fastcgi://unix:/var/run/php/php7.0-fpm.sock:“, host: „MAILSERVER“

    Müsst Ihr die aktuelle Roundcube Version aus dem GIT verwenden, da PHP7 im Stable Branch noch Fehler dropped.

    https://github.com/roundcube/roundcubemail

    @Andre: Der Artikel ist noch aktuell oder ?
    machst du hier auch noch ein Changelog ?

    BTW: Bin seid Jahren Admin und hab bisher keine bessere Anleitung gefunden die auch endlich mal funktioniert.

    1. Thomas

      Hallo!

      Ich kann das leider nicht bestätigen.
      Das heißt, ich hatte schon während der Installation Probleme im Zusammenhang mit PHP7, deshalb habe ich jetzt PHP5 + PHP7 installiert.
      Wenn ich aber in der Konfiguration von Nginx auf PHP7 FPM Sock umstelle, dann startet weder ViMbAdmin noch Roundcube.

      Sind noch weitere Änderungen notwendig, damit ViMbAdmin und Roundcube mit PHP7 funktionieren?

      THX

  41. Jochen

    Hallo zusammen,

    erst mal schönen Dank für das Tutorial! Leider habe ich Probleme mit ViMbAdmin. im Prinzip ging die Installation problemlos. Leider bekomme ich nur eine halb aufgebaute Seite. Ich verwende statt Nginx Apache.
    Im ErrorLog erhalte ich folgende Fehlermeldung:

    [Wed Apr 20 18:55:59.859139 2016] [:error] [pid 3439] [client xxx.xxx.xxx.xxx:5242] PHP Fatal error: Uncaught exception ‚Zend_Controller_Response_Exception‘ with message ‚Cannot send headers; headers already sent in , line 0‘ in /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Response/Abstract.php:323\nStack trace:\n#0 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Response/Abstract.php(341): Zend_Controller_Response_Abstract->canSendHeaders(true)\n#1 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Response/Abstract.php(768): Zend_Controller_Response_Abstract->sendHeaders()\n#2 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Front.php(992): Zend_Controller_Response_Abstract->sendResponse()\n#3 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application/Bootstrap/Bootstrap.php(105): Zend_Controller_Front->dispatch()\n#4 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application.php(384): Zend_Application_Bootstrap_Bootstrap->run()\n#5 /srv/vimbadmin/public/index.php(34): Zend_ in /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Response/Abstract.php on line 323, referer: https://mail.meineDomain/admin/public/index.php/auth/login

    Laut ViMbAdmin Mailingliste soll es ein Konfigfehler in der htaccess oder irgendwo in einer ApacheKonfig sein…

    /srv/vimbadmin/public/.htaccess:

    SetEnv APPLICATION_ENV production

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ – [NC,L]
    RewriteRule ^.*$ /admin/index.php [NC,L]

    /etc/apache2/sites-available/myconfig.config:

    ServerName mail.meineDomain.de
    Redirect permanent / https://mail.meineDomain.de/

    SSLEngine on
    SSLCertificateFile /etc/ssl/mail.meinedomain.de.cer
    SSLCertificateKeyFile /etc/ssl/mail.meinedomain.de.key
    # Intermediate Zertifikat
    # SSLCertificateChainFile /etc/ssl/sub.class1.server.sha2.ca.pem
    # Root Zertifikat
    # SSLCACertificateFile /etc/ssl/ca.pem

    ServerName mail.einedomain.de
    CustomLog ${APACHE_LOG_DIR}/mail.meinedomain.de_access.log combined
    ErrorLog ${APACHE_LOG_DIR}/mail.meinedomain.de_error.log
    DocumentRoot /var/www/mail.meinedomain.de/htdocs/

    HostnameLookups Off
    UseCanonicalName Off
    ServerSignature Off
    #Header always set Strict-Transport-Security „max-age=10886400“

    Alias /vimbadmin /srv/vimbadmin/public

    SSLRequireSSL
    Options FollowSymLinks
    AllowOverride FileInfo Indexes Limit

    Require all granted
    DirectoryIndex index.php index.html index.htm

    Hat da möglicherweise jemand eine Idee.. sehe langsam vor lauter Bäumen den Wald nicht mehr :-(
    Danke

  42. Jörg Esser

    In der man Page zu update-ca-certificates steht das die Zertifikate mit .crt enden müssen sonst werden sie nicht eingebunden.
    Also habe ich das Zertifikat wie folgt erstellt.
    openssl req -new -newkey rsa:4096 -sha256 -days 1095 -nodes -x509 -subj „/C=DE/ST=STATE/L=CITY/O=MAIL/CN=`hostname -f`“ -keyout /etc/ssl/`hostname -f`.key -out /etc/ssl/`hostname -f`.crt

    Dann kopiert

    cp /etc/ssl/`hostname -f`.crt /usr/local/share/ca-certificates/

    und nun wird auch das Zertifikat geaddet…

    update-ca-certificates
    Updating certificates in /etc/ssl/certs… 1 added, 0 removed; done.
    Running hooks in /etc/ca-certificates/update.d….done.

    Bis dahin erstmal vielen Dank!

  43. André

    Hallo,

    super Anleitung. Tolles Projekt. Was ich leider nicht hinbekomme:

    Wo kann ich die erlaubte Größe von 2MB des Anhanges in Roundcube vergrößern? Wenn ich google frage kommen Hinweise auf postfix oder php.ini aber finde nichts in roundcube – oder hab es übersehen?!

    Vielen Dank für ein Hinweis! Alles Gute
    André

    1. Stefan Meier

      Hallo André!

      Am Beispiel für 10MB funktioniert das folgendermaßen:

      Erstelle im Roundcube-Verzeichnis die Datei „.user.ini“ mit folgendem Inhalt:
      upload_max_filesize=10M
      post_max_size=10M

      In der nginx-Konfiguration mit dem Serverblock für Roundcube ist noch folgender Parameter hinzuzufügen:
      client_max_body_size 10M;

      Anschließend die Webserver-Dienste neu starten:
      systemctl restart {nginx,php5-fpm}

      Der Postfix-Parameter „message_size_limit“ (siehe Anleitung) muss natürlich >= 10MB gesetzt sein, sonst meckert wiederum Postfix.
      Ich habe die genannten Parameter mit einer 9,9997MB großen Datei ohne Probleme getestet. Die Werte post_max_size & client_max_body_size dürfen auch mind. 1MB höher gewählt werden als das eigentlich gewünschte Limit für die Uploads um längere Texte und ggf. eingebettete Bilder zu erlauben.

      Gruß
      Stefan

  44. Alex

    Hallo,

    vielen Dank für den Beitrag. Mailserver läuft :-)

    Ich musste lediglich für ViMbAdmin einen „Virtual Host“ bei nginX einrichten. Das ist hier aber ganz gut beschrieben, auch für andere Webserver: https://github.com/opensolutions/ViMbAdmin/wiki

    Dann hatte ich das Problem „“503 5.5.1 Error: authentication not enabled” das liegt laut diesem Beitrag an einem Typo in einer Standardkonfiguration. Demnach musste ich „smtp_sasl_auth_enable = yes“ hinzufügen. Siehe auch:
    http://serverfault.com/questions/712903/503-5-5-1-error-authentication-not-enabled-when-trying-to-connect-to-my-postf

    Auch ein guter Tipp danach bei bspw. mxtoolbox checken, ob alles korrekt eingerichtet wurde.

    Danke und Grüße,
    Alex

  45. Karsten

    Hi, ich frage mich gerade, was der Unterschied sein wird zwischen einem nach diesem Howto aufgesetzten Mailserver und einem per MailCow installierten.
    Wäre schön, wenn es dazu mal einen Blog-Post geben würde.

    1. TiggaStyle

      Die MailCow hat noch ein paar andere Funktionen zum einrichten neuer Benutzer und Backup z.B.

      Aber es wäre toll wenn SoGo bald fertig wird und oder es dann eine Anleitung gibt für menschen die Nginx über easyengine installiert haben.

  46. bs

    Hallo Andre,

    vielen Danke für das Tutorial. Ich bin deinen Anleitungen strikt gefolgt, nur jetzt habe ich folgende Fehlermeldungen:

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Auf der Vimb-Web:
    ViMbAdmin_Exception
    File
    /srv/vimbadmin/library/ViMbAdmin/Dovecot.php
    Line
    57
    Message
    Error executing Dovecot password command: /usr/bin/doveadm pw -s ‚SHA512-CRYPT#md5.salted‘ -u ‚bs@zs-engineering.de‘ -p ‚passwd‘
    Code
    0
    Trace

    #0 /srv/vimbadmin/vendor/opensolutions/oss-framework/src/OSS/Auth/Password.php(90): ViMbAdmin_Dovecot::password(‚SHA512-CRYPT#md…‘, ‚passwd‘, ‚bs@zs-engine…‘)
    #1 /srv/vimbadmin/application/controllers/MailboxController.php(317): OSS_Auth_Password::hash(‚passwd‘, Array)
    #2 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Action.php(516): MailboxController->addAction()
    #3 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch(‚addAction‘)
    #4 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
    #5 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application/Bootstrap/Bootstrap.php(105): Zend_Controller_Front->dispatch()
    #6 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application.php(384): Zend_Application_Bootstrap_Bootstrap->run()
    #7 /srv/vimbadmin/public/index.php(34): Zend_Application->run()
    #8 {main}
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Im syslog:

    Mar 31 13:18:43 mail dovecot: imap-login: Error: SSL: Stacked error: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca: SSL alert number 48
    Mar 31 13:18:43 mail dovecot: imap-login: Disconnected (no auth attempts in 0 secs): user=, rip=xx.xxx.xx.xx, lip=xx.xxx.xx.xxx, TLS: SSL_read() failed: Unknown error, TLS v1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Kannst du mir explizit erklären, wie ich diese Fehler beheben kann?

    Vielen Danke im Voraus.

  47. Oliver

    Hallo zusammen,

    ich hoffe es kann mir jemand bei meinem Problem weiterhelfen, das wäre echt super super nett!

    Und zwar habe ich Postfixadmin, Postfix und Dovecot mit MySQL nach dieser Anleitung installiert:

    https://www.debinux.de/2013/10/mailserv … ment-56038

    Dort wird auch angegeben wie man eine Allgemeine Quota installieren kann, jedoch würde ich nun via Postfixadmin einzelnen Usern verschiedene Quotas zuteilen. Ich habe mehrere Stunden und Tage damit verbracht Anleitungen aus dem Internet zu nutzen, jedoch hat nichts davon bisher geklappt … Entweder ich konnte mich nicht mehr einloggen, oder ich konnte mich einloggen und die Quota wurde nicht in die Datenbank geschrieben.

    Evtl. kann jemand hier mir einen Tipp geben oder mir eine kurze Anleitung schreiben, was ich tuen muss damit es funktioniert, das wäre echt klasse!

    Ich bräuchte daher evlt. eine kurze Anleitung was ich wo einstellen muss. Meine Config steht in der der dovecot.conf, so wie auch in dem beigefügten Link beschrieben ist mein Dovecot Server installiert, daher müsste ich nur wissen wie ich die Quota Einstellungen entsprechend umstelle, damit diese in die Datenbank geschrieben werden und auch mit Postfixadmin änderbar sind. Sowie das die Quota per IMAP übertragen wird. (das ist ja jetzt schon der Fall!)

    Ich hoffe auf eine kurze Antwort! Vielen Lieben Dank!

    Mit freundlichen Grüßen,

    Oliver

  48. Oliver

    Hallo,

    hat jemand eine gute Anleitung um Postfixadmin und Dovecot auf die Quota umzustellen. Damit ich die Quota per Postfixadmin für jeden User setzen kann? Ich habe schon viele verschiedene Anleitungen gefunden nur diese habe nicht so richtig funktioniert. Hat jemand hier evtl. eine kurze Anleitung für mich oder einen kurzen Tipp? Das wäre echt super!

    Oder kann ich die SQL Abfragen die hier erwähnt werden auch für Postfixadmin nutzen?

    Ich denke und hoffe es kann mir jemand kurzfristig helfen!

    Gruß,

    Olli

  49. Markus F.

    Sehr schöne Anleitung. Habe das ganze 1:1 auf einem Ubuntu 14.04 (trusty) realisiert. Man muss allerdings Dovecot >= 2.2.16 für den STARTTLS Support aus einem alternativen Repository installieren. V2.2.9 aus der offiziellen stable Quelle reicht nicht.

  50. Ulrich

    Hallo,

    vielen Dank für die Anleitung. Für alle, die bei der Installation von VimBeAdmin mit Composer Probleme haben:
    Smarty (eine Template Engine) lässt sich nicht (mehr) installieren, da die URL „nur“ mit http anstelle mit https beginnt. In dem Moment, in dem ihr die rote Fehlermeldung bekommt, könnt ihr folgendes machen:
    – wechselt in das Verzeichnis /srv/vimbadmin mit „cd /srv/vimbadmin“
    – öffnet die composer.json in /srv/vimbadmin mit „nano composer.json“ oder mit „vi composer.json“
    – tragt direkt unter ‚“license“: „GPL-3.0+“,‘ folgendes ein:

    „config“ : {
    „secure-http“ : false
    },

    – Das Komma hinter der letzen geschweiften Klammer nicht vergessen! Danach die Datei speichern und schließen.
    – da ihr euch noch immer im Verzeichnis /srv/vimbadmin befindet, könnt ihr direkt von dort aus die Installation von VimBeAdmin mit „composer update“ aktualisieren.

    Die Installation sollte direkt an der abgebrochenen Stelle fortsetzen. Nach erfolgreichem Abschluss der Installation einfach mit der Anleitung dieser Webseite fortfahren!

    Viel Glück!

    1. Daniel

      Tipp:
      Die Anführungszeichen werden leider auf dieser Seite falsch dargestellt. Nehmt euch am besten die anderen Einträge zur Hilfe, sonst gibts Fehler;)

      MfG
      Daniel

  51. Stefan Meier

    Danke für die hervorragende Vorlage!

    Meine Frage:
    Welche Plugins sind bei dovecot für POP3 einzutragen bzw. überflüssig?

    Meine Konfiguration umfasst bislang:
    ————————-…————————-
    protocol pop3 {
    pop3_uidl_format = %08Xu%08Xv
    mail_plugins = acl mail_log notify
    }
    ————————-…————————-

    Quota dürfte ja überflüssig sein, da POP3 keine Daten hinzufügt – nur löscht, bei ACL bin ich mir nicht sicher…
    Was brauche ich da _wirklich_?

  52. k1

    Hallo,

    danke nochmal für die Super Anleitung.

    hab jetzt alles nochmal neu aufgesetzt und jetzt läufts…. bitte mal meinen Spam löschen *facepalm*
    Der Fehler lag wahrscheinlich in einem vergessenen wert den ich zwar später gesetzt hatte aber das ganze zusammenspiel schon so verwurschtelt war das es eben nicht lief…
    ich tippe auf “ defaults.mailbox.maildir “ den hatte ich vergessen zu ändern, hab das korrigiert aber wie wir sehen ohne erfolg…

    danke nochmal
    gruß Mirko

  53. k1

    bin hier am verzweifeln

    bekomme keine mails raus

    amavis ärgert mich …

    mail.log ->

    !)rw_loop: leaving rw loop, no progress, last event (select) 35.035 s ago
    Mar 7 22:55:47 mail amavis[11217]: (11217-01) (!)Fyec_qoLEftU FWD from -> , 451 4.5.0 From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01
    Mar 7 22:55:48 mail amavis[11217]: (11217-01) Blocked MTA-BLOCKED {TempFailedInternal}, SUBMISSION LOCAL [62.146.106.29]:37905 [79.238.98.141] -> , Message-ID: , mail_id: Fyec_qoLEftU, Hits: -0.018, size: 362286, 46277 ms
    Mar 7 22:55:49 mail amavis[11218]: (11218-01) Negative SMTP response to data-dot (): 451 4.5.0 id=11217-01 – Temporary MTA failure on relaying, From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01, dt: 44194.5 ms
    Mar 7 22:55:49 mail amavis[11218]: (11218-01) (!)L2dVQl4AIzbh FWD from -> , BODY=8BITMIME 451 4.5.0 from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11217-01 – Temporary MTA failure on relaying, From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01
    Mar 7 22:55:49 mail amavis[11218]: (11218-01) Blocked MTA-BLOCKED {TempFailedInternal}, SUBMISSION LOCAL [62.146.106.29]:37905 [79.238.98.141] -> , Message-ID: , mail_id: L2dVQl4AIzbh, Hits: -0.018, size: 362018, 51638 ms
    Mar 7 22:55:49 mail amavis[11221]: (11221-01) Negative SMTP response to data-dot (): 451 4.5.0 id=11218-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11217-01 – Temporary MTA failure on relaying, From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01, dt: 51499.7 ms
    Mar 7 22:55:49 mail amavis[11221]: (11221-01) (!)wMH7JmvNDz2m FWD from -> , BODY=8BITMIME 451 4.5.0 from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11218-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11217-01 – Temporary MTA failure on relaying, From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01
    Mar 7 22:55:49 mail amavis[11221]: (11221-01) Blocked MTA-BLOCKED {TempFailedInternal}, SUBMISSION LOCAL [62.146.106.29]:37905 [79.238.98.141] -> , Message-ID: , mail_id: wMH7JmvNDz2m, Hits: -0.018, size: 361750, 58810 ms
    Mar 7 22:55:49 mail amavis[11220]: (11220-01) Negative SMTP response to data-dot (): 451 4.5.0 id=11221-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11218-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11217-01 – Temporary MTA failure on relaying, From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01, dt: 58749.9 ms
    Mar 7 22:55:49 mail amavis[11220]: (11220-01) (!)7YvhGHhKSL3K FWD from -> , BODY=8BITMIME 451 4.5.0 from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11221-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11218-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11217-01 – Temporary MTA failure on relaying, From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01
    Mar 7 22:55:49 mail amavis[11220]: (11220-01) Blocked MTA-BLOCKED {TempFailedInternal}, SUBMISSION LOCAL [62.146.106.29]:37905 [79.238.98.141] -> , Message-ID: , mail_id: 7YvhGHhKSL3K, Hits: -0.018, size: 361482, 66244 ms
    Mar 7 22:55:49 mail amavis[11216]: (11216-01) Negative SMTP response to data-dot (): 451 4.5.0 id=11220-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11221-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11218-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11217-01 – Temporary MTA failure on relaying, From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01, dt: 65861.6 ms
    Mar 7 22:55:49 mail amavis[11216]: (11216-01) (!)vkwaICgyLxBl FWD from -> , BODY=8BITMIME 451 4.5.0 from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11220-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11221-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11218-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11217-01 – Temporary MTA failure on relaying, From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01
    Mar 7 22:55:49 mail amavis[11216]: (11216-01) Blocked MTA-BLOCKED {TempFailedInbound}, [62.146.106.29]:37905 [79.238.98.141] -> , Message-ID: , mail_id: vkwaICgyLxBl, Hits: -0.018, size: 361208, 87016 ms
    Mar 7 22:55:49 mail postfix/smtpd[11608]: proxy-reject: END-OF-MESSAGE: 451 4.5.0 id=11216-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11220-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11221-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11218-01 – Temporary MTA failure on relaying, from MTA(smtp:[127.0.0.1]:10025): 451 4.5.0 id=11217-01 – Temporary MTA failure on relaying, From MTA() during fwd-connect (No greeting, dt: 35.769 s): id=11217-01; from= to= proto=ESMTP helo=
    Mar 7 22:55:49 mail postfix/smtpd[11608]: disconnect from smtp03.udag.de[62.146.106.29]
    Mar 7 22:55:49 mail postfix/postscreen[11599]: CONNECT from [62.146.106.29]:38149 to [84.200.12.174]:25

    main.cf domian.tld hab ich zurück geändert :P ->

    # SMTPd greeting banner: You MUST specify $myhostname at the start of the text. This is required by the SMTP protocol.
    smtpd_banner = $myhostname

    # Disable local biff service
    biff = no

    # Do not append the string $mydomain to -locally- submitted email.
    append_dot_mydomain = no

    # Readme directory
    readme_directory = /usr/share/doc/postfix

    # HTML directory
    html_directory = /usr/share/doc/postfix/html

    # Certificates
    smtpd_tls_cert_file = /etc/ssl/mail.domain.tld.cer
    smtpd_tls_key_file = /etc/ssl/mail.domain.tld.key

    # Opportunistic TLS. TLS auth only.
    smtpd_tls_security_level=may
    smtpd_tls_auth_only=yes

    # TLS session cache for SMTPd
    smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

    # Disallow SSLv2 and SSLv3, only accept secure ciphers
    smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
    smtpd_tls_mandatory_ciphers=high

    # Log TLS handling
    smtpd_tls_loglevel = 1
    smtp_tls_loglevel = 1

    # Delay reject until RCPT TO
    smtpd_delay_reject = yes

    # Enable elliptic curve cryptography, „ultra“ needs more cpu time
    smtpd_tls_eecdh_grade = strong

    # Sender, recipient, client and data restrictions
    # !! non-FQDN HELOs are rejected on Port 25 only, see master.cf

    # Auth. Benutzer dürfen auch innerhalb der „mynetworks“ nur von den Adressen senden, die ihnen zugehörig sind.
    smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch,
    # Erst jetzt werden „mynetworks“ zugelassen
    # Unauth. Benutzer wie der Cron-Dienst können so weiterhin Mails versenden, etwa
    # als cron@fqdn
    permit_mynetworks,
    # Anderen unauth. Benutzern das Benutzen jeder Adresse verbieten.
    reject_sender_login_mismatch,
    # Alle auth. jetzt zulassen.
    permit_sasl_authenticated,
    # Nicht im System vorhandene Absender jetzt ablehnen
    reject_unlisted_sender,
    # Ablehnen, wenn die Sender-Domäne nicht existiert
    reject_unknown_sender_domain

    # Akzeptiere alle Empfänger, die ein authentifizierter Absender oder ein Absender aus „mynetworks“ angibt
    smtpd_recipient_restrictions = permit_sasl_authenticated,
    permit_mynetworks,
    # Schnittstelle zu Dovecot, um die Quota live zu überprüfen (verhindert Bounces)
    check_policy_service unix:private/quota-status,
    # Ablehnen, wenn der HELO FQDN nicht aufzulösen ist
    reject_unknown_helo_hostname,
    # Ablehnen, wenn KEIN PTR zu dieser IP existiert
    # Verhindert nicht, dass ein FALSCHER PTR abgelehnt wird!
    # Hierfür würde „reject_unknown_client_hostname“ verwendet.
    reject_unknown_reverse_client_hostname,
    # Kein offenes Relay
    reject_unauth_destination

    # Unauth. Benutzer dürfen ihre Befehle nicht „pipen“
    smtpd_data_restrictions =
    reject_unauth_pipelining,
    permit

    # Eine Art Tabelle mit vorhanden Identitäten und ihren Zugehörigkeiten
    smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf

    # Certificates
    smtp_tls_cert_file = /etc/ssl/mail.domain.tld.cer
    smtp_tls_key_file = /etc/ssl/mail.domain.tld.key

    # Opportunistic TLS. Use TLS if this is supported by the remote SMTP server, otherwise use plaintext.
    smtp_tls_security_level=may

    # TLS session cache for SMTP
    smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

    # A custom list with secure ciphers.
    tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

    # Use the FQDN for the local hostname!
    myhostname = mail.domain.tld

    # Alias maps and database for -local- delivery only
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases

    # The domain name that locally-posted mail appears to come from, and that locally posted mail is delivered to.
    myorigin = mail.domain.tld

    # The list of domains that are delivered via the -local- mail delivery transport. No external domains like „domain.tld“ belong here! „mail.domain.tld“ is fine.
    mydestination = mail.domain.tld, localhost

    # We lookup MX records to send non-local mail, so this stays empty
    relayhost =

    # Trusted SMTP clients with more privileges. Trusted clients can relay mail.
    mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

    # The maximal size of any -local- individual mailbox
    mailbox_size_limit = 0

    # The maximal size of any -virtual- individual mailbox
    virtual_mailbox_limit = 0

    # Handle Postfix-style extensions
    recipient_delimiter = +

    # The network interface addresses that this mail system receives mail on.
    inet_interfaces = all

    # Specifies what protocols Postfix will use when it makes or accepts network connections, and also controls what DNS lookups Postfix will use when it makes network connections.
    inet_protocols = ipv4

    # VRFY command is not really needed anymore
    disable_vrfy_command = yes

    # Please say hello first…
    smtpd_helo_required = yes

    # The SASL plug-in type that the Postfix SMTP server should use for authentication.
    smtpd_sasl_type=dovecot

    # Where to passthrough our authentication information for the above plug-in
    smtpd_sasl_path=private/auth_dovecot

    # Enable SASL authentication in the Postfix SMTP server.
    smtpd_sasl_auth_enable = yes

    # Report the SASL authenticated user name in the smtpd Received message header.
    smtpd_sasl_authenticated_header = yes

    # Have Postfix advertise AUTH support in a non-standard way.
    broken_sasl_auth_clients = yes

    # The lookup tables that the proxymap server is allowed to access for the read-only service.
    proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps

    ## Virtual transport configuration
    # A prefix that the virtual delivery agent prepends to all pathname results from $virtual_mailbox_maps
    virtual_mailbox_base = /

    # THIS contains a list of domains we are the final destination for (unlike „mydestination“).
    virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_domains_maps.cf

    # Alias specific mail addresses or domains to other local or remote address.
    virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_alias_maps.cf

    # Specify a left-hand side of „@domain.tld“ to match any user in the specified domain
    virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/postfix-mysql-virtual_mailbox_maps.cf

    # The minimum user ID value that the virtual delivery agent accepts
    virtual_minimum_uid = 5000

    # We use „vmail“ user with UID/GID 5000 to lookup tables
    virtual_uid_maps = static:5000
    virtual_gid_maps = static:5000

    # The default mail delivery transport and next-hop destination for final delivery to domains listed with „virtual_mailbox_domains“
    virtual_transport = lmtps:unix:private/dovecot-lmtp

    transport_maps = mysql:/etc/postfix/mysql/postfix-mysql-virtual_transport_maps.cf

    ## Queue configuration
    # Consider a message as undeliverable, when delivery fails with a temporary error, and the time in the queue has reached this limit.
    maximal_queue_lifetime = 1d

    # Consider a bounce message as undeliverable, when delivery fails with a temporary error, and the time in the queue has reached this limit.
    bounce_queue_lifetime = 1d

    # The time between deferred queue scans by the queue manager.
    queue_run_delay = 300s

    # The maximal/minimal time between attempts to deliver a deferred message.
    maximal_backoff_time = 1800s
    minimal_backoff_time = 300s

    # Maximum mail size (500 MiB)
    message_size_limit = 524288000

    # This tarpits a client after 3 erroneous commands for 10s
    smtpd_soft_error_limit = 3
    smtpd_error_sleep_time = 10s
    smtpd_hard_error_limit = ${stress?1}${stress:5}

    postscreen_access_list = permit_mynetworks

    # Drop connections from blacklisted servers with a 521 reply
    postscreen_blacklist_action = drop

    # Clean Postscreen cache after 24h
    postscreen_cache_cleanup_interval = 24h

    postscreen_dnsbl_ttl = 5m
    postscreen_dnsbl_threshold = 8
    postscreen_dnsbl_action = enforce
    postscreen_dnsbl_sites =
    b.barracudacentral.org=127.0.0.2*7
    dnsbl.inps.de=127.0.0.2*7
    bl.mailspike.net=127.0.0.2*5
    bl.mailspike.net=127.0.0.[10;11;12]*4
    dnsbl.sorbs.net=127.0.0.10*8
    dnsbl.sorbs.net=127.0.0.5*6
    dnsbl.sorbs.net=127.0.0.7*3
    dnsbl.sorbs.net=127.0.0.8*2
    dnsbl.sorbs.net=127.0.0.6*2
    dnsbl.sorbs.net=127.0.0.9*2
    zen.spamhaus.org=127.0.0.[10;11]*8
    zen.spamhaus.org=127.0.0.[4..7]*6
    zen.spamhaus.org=127.0.0.3*4
    zen.spamhaus.org=127.0.0.2*3
    hostkarma.junkemailfilter.com=127.0.0.2*3
    hostkarma.junkemailfilter.com=127.0.0.4*1
    hostkarma.junkemailfilter.com=127.0.1.2*1
    wl.mailspike.net=127.0.0.[18;19;20]*-2
    hostkarma.junkemailfilter.com=127.0.0.1*-2
    postscreen_greet_banner = $smtpd_banner
    postscreen_greet_action = enforce
    postscreen_greet_wait = 3s
    postscreen_greet_ttl = 2d
    postscreen_bare_newline_enable = no
    postscreen_non_smtp_command_enable = no
    postscreen_pipelining_enable = no
    postscreen_cache_map = proxy:btree:$data_directory/postscreen_cache

    master.cf -> # Postscreen on Port 25/tcp, filters zombies (spam machines) on first level with lowest costs.
    smtp inet n – n – 1 postscreen

    # Postscreen passes sane clients to the real SMTP daemon here.
    smtpd pass – – n – – smtpd
    # Reject non-FQDN HELOs on Port 25 (after passing postscreen process)
    -o smtpd_helo_restrictions=permit_mynetworks,reject_non_fqdn_helo_hostname
    -o smtpd_proxy_filter=127.0.0.1:10024
    -o smtpd_client_connection_count_limit=10
    -o smtpd_proxy_options=speed_adjust

    # For mail submitting users. Authenticated clients and known networks only.
    submission inet n – – – – smtpd
    -o smtpd_client_restrictions=permit_sasl_authenticated,reject
    -o smtpd_proxy_filter=127.0.0.1:10025
    -o smtpd_client_connection_count_limit=10
    -o smtpd_proxy_options=speed_adjust

    # Handles TLS connections for postscreen to make them readable
    tlsproxy unix – – n – 0 tlsproxy
    # This implements an ad-hoc DNS white/blacklist lookup service
    dnsblog unix – – n – 0 dnsblog

    pickup fifo n – – 60 1 pickup
    cleanup unix n – – – 0 cleanup
    qmgr fifo n – n 300 1 qmgr
    tlsmgr unix – – – 1000? 1 tlsmgr
    rewrite unix – – – – – trivial-rewrite
    bounce unix – – – – 0 bounce
    defer unix – – – – 0 bounce
    trace unix – – – – 0 bounce
    verify unix – – – – 1 verify
    flush unix n – – 1000? 0 flush
    proxymap unix – – n – – proxymap
    proxywrite unix – – n – 1 proxymap
    smtp unix – – – – – smtp
    relay unix – – – – – smtp
    showq unix n – – – – showq
    error unix – – – – – error
    retry unix – – – – – error
    discard unix – – – – – discard
    local unix – n n – – local
    virtual unix – n n – – virtual
    lmtp unix – – – – – lmtp
    anvil unix – – – – 1 anvil
    scache unix – – – – 1 scache

    # LMTP with STARTTLS support, needs newer Dovecot versions
    lmtps unix – – – – – lmtp
    -o lmtp_use_tls=yes
    -o lmtp_tls_loglevel=1
    -o lmtp_tls_CAfile=/etc/ssl/certs/ca-certificates.crt
    -o lmtp_enforce_tls=yes
    -o lmtp_tls_mandatory_protocols=!SSLv2,!SSLv3
    -o lmtp_tls_protocols=!SSLv2,!SSLv3
    -o lmtp_tls_mandatory_ciphers=high
    -o lmtp_tls_ciphers=high
    -o lmtp_send_xforward_command=yes
    -o lmtp_tls_security_level=encrypt
    -o lmtp_tls_note_starttls_offer=yes

    # Amavis reinjection, maximal 5 smtpd Prozesse, muss den Amavis Prozessen entsprechen!
    127.0.0.1:10035 inet n – – – 5 smtpd
    -o smtpd_authorized_xforward_hosts=127.0.0.0/8
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=
    -o mynetworks=127.0.0.0/8
    -o receive_override_options=no_unknown_recipient_checks

    irritierend ist allerdings

    WARNING: Your ClamAV installation is OUTDATED!
    WARNING: Local version: 0.99 Recommended version: 0.99.1

    packetverwaltung stallt aber nur die 0.99 bereit … ja auch im update

  54. Thomas

    Hallo!

    Vielen Dank für diese sehr gute Anleitung.
    Ich habe den Mailserver eingerichtet, allerdings mit 2 Abweichungen vom hier vorgestellten Setup:
    1. Die Datenbank läuft auf einem dedizierten Server
    2. Der FQDN ist ungleich dem DNS

    Die erste Modifikation ist unkritisch, soweit ich das beurteilen kann: alle Anwendungszugriffe von „roundcube“ und „ViMbAdmin“ funktionieren.
    Was Probleme bereitet ist die zweite Modifikation.
    Dies hängt damit zusammen, dass ich unsicher bin, womit mail.domain.tld in den diversen Konfig-Dateien ersetzt werden muss: FQDN (=mailserver.local.net) oder DNS (mail.domain.de)?

    Ich habe folgende Dateien bisher identifiiziert, wo diese Konfiguration relevant ist:
    /var/www/html/webmail/config/config.inc.php
    /etc/postfix/main.cf
    /etc/dovecot/dovecot.conf
    /etc/amavis/conf.d/50-user

    Ich wäre für jeden Hinweis dankbar, der erklärt, welcher Wert in welcher Konfig-Datei zu setzen ist.

    THX

  55. Moe

    Vielen Dank es läuft alles!
    Gab ein kleines Problem mit dem Composer der irgend eine Datei nicht via https laden konnte, hab einfach in der Konfiguration Secure-HTTP auf false gesetzt für den Download und danach wieder geändert

    1. Jürgen

      Hallo, bin auch bei der Installation hängen geblieben, da der Composer eine Datei (Smarty/Smarty) nicht laden konnte via HTTPS. Wie kann ich Composer denn Konfiguieren? Welche Datei ist dafür zuständig?
      Würde mich über eine Antwort freuen.
      Jürgen

      1. Torsten

        Keine Ahnung wie der Composer Konfiguriert werden kann, aber eine andere Lösung.

        Nach dem Abbruch des Composers
        apt-get install subversion
        cd /srv/vimbadmin
        nano composer.json
        ändere
        „url“: „http://smarty-php.googlecode.com/svn/“,
        nach
        „url“: „https://smarty-php.googlecode.com/svn/“,
        composer create-project

  56. Gößler

    Vielen Dank für das Tutorial.
    Es hat eigentlich alles Perfekt funkioniert, nur hab ich ein Problem ;)
    Wenn ich Thunderbird starte mit einem Imap Account der ein paar unterordner hat (8 stück verschachtelt) muss ich jeden Ordner anklicken damit dieser Syncronisiert wird.

    Und im mail.log steht folgendes:
    #Thunderbird beendet
    Mar 1 05:17:19 mail dovecot: imap(user@email.tld): Logged out in=230 out=1017
    Mar 1 05:17:19 mail dovecot: imap(user@email.tld): Logged out in=122 out=604
    Mar 1 05:17:19 mail dovecot: imap(user@email.tld): Logged out in=297 out=1354
    Mar 1 05:17:19 mail dovecot: imap(user@email.tld): Logged out in=224 out=22584
    Mar 1 05:17:19 mail dovecot: imap(user@email.tld): Logged out in=262 out=2543
    Mar 1 05:17:19 mail dovecot: imap(user@email.tld): Logged out in=263 out=1111
    Mar 1 05:17:19 mail dovecot: imap(user@email.tld): Logged out in=132 out=610
    #Thunderbird gestartet und die Ordner durchgeklickt
    Mar 1 05:17:25 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5829, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:25 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5830, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:25 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5831, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:26 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5833, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:31 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5836, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:31 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5837, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:32 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5839, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:33 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5841, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:34 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5844, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:34 mail dovecot: imap-login: Login: user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, mpid=5845, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:35 mail dovecot: imap-login: Maximum number of connections from user+IP exceeded (mail_max_userip_connections=10): user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Mar 1 05:17:35 mail dovecot: imap-login: Maximum number of connections from user+IP exceeded (mail_max_userip_connections=10): user=, method=PLAIN, rip=user.IP.Adress, lip=server.Ip.Adress.im.nat, TLS, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)

    Ist das normal ?

    danke und lg

  57. Gast-ohne-nerven

    Vielleicht bringt mich hier jemand auf die richtige Lösung…

    ich habe das Problem das ich seit kurzem wenn ich eine neue E-Mail über Vimbadmin anlege kein Passwort gesetzt wird.
    Dieses Problem kann ich derzeit nur lösen in dem ich selbst in die Datenbank reingehe und das Passwort über update mailbox set … blablabla

    ich hab schon alle Passwörter durch geguckt und überall ist das richtige gesetzt die Verschlüsslungen sind ebenfalls überall gleich… ich bin am verzweifeln…

    1. Gast-ohne-nerven

      so hab mein Problem selbst gelöst :)
      ich hatte in meiner php.ini Datei exec in den disable_functions … somit konnte er es nicht ausführen… danach hatte ich noch ein Problem mit den rechten was klar war weil ich das so oft umher gezogen habe das diese nicht mehr passen konnten…

    2. Faxe

      Ich hab seit kurzem ein ähnliches Problem.
      Ich kann mich per Vimbadmin nicht mehr anmelden. Meine Benutzer haben Passwörter, Anmeldung per Roundcube und IMAP Client klappt, nur die Anmeldung an Vimbadmin klappt nicht. Vielleicht hängen diese Probleme zusammen?

  58. Tom

    Hat sich zwischenzeitlich bei ViMbAdmin etwas geändert? Habe die Anleitung auf einem frischen System abgearbeitet aber die Anforderung bricht ab. Im Log steht:

    16/02/26 15:50:39 [error] 11165#0: *36 FastCGI sent in stderr: „PHP message: PHP Warning: require_once(/srv/vimbadmin/application/../vendor/autoload.php): failed to open stream: Permission denied in /srv/vimbadmin/public/index.php on line 12
    PHP message: PHP Fatal error: require_once(): Failed opening required ‚/srv/vimbadmin/application/../vendor/autoload.php‘ (include_path=‘.:/usr/share/php:/usr/share/pear‘) in /srv/vimbadmin/public/index.php on line 12“ while reading response header from upstream, client: , server: , request: „GET /admin/index.php HTTP/1.1“, upstream: „fastcgi://unix:/var/run/php5-fpm.sock:“, host: „“

    Schätze da müssen Zugriffsrechte angepasst werden, aber welche (v.a. da das ja scheinbar bei vielen anderen ohne Änderung funktioniert)?

  59. punktundaus

    Hallo, Anleitung ist super aber 2 Problemchen habe ich da doch:

    1.) Unter Jessie lassen sich die MySQL User so wie oben angegeben nicht erstellen (ok manuell erledigt…passt!)
    2.) alles läuft…kann Emails senden aber erhalte keine?

    Jemand ne Idee

  60. Jens

    Super Tutorial! Vielen Dankd dafür. Hat soweit alles funktioniert.
    Jetzt habe ich noch eine Frage: wie lässt sich Amacube (https://github.com/akoeb/amacube) als Roundcube Plugin in dieses Setup integrieren? Das wäre das *Einzige*, was hier noch „fehlen“ würde. Oder gibt es eine gute Alternative zu Amacube?
    Gerade lese ich mich in amavis ein und bin noch nicht ganz dahinter gekommen, wie alles miteinander verbunden ist…

  61. raphih18

    Guten Abend!

    Geniales Tutorial! Sehr schön, übersichtlich & ausführlich.
    Jedoch habe ich ein kleines Problemchen, und zwar:
    Bis zum Browser-Aufruf von VimbAdmin funktioniert alles. Antworten vom Bash genauso wie beim Tutorial beschrieben. Geht es dann jedoch um’s aufrufen der /admin-Seite, bockt mein Server und meint, er könne das Directory nicht finden (man wird auf hostname.tld/admin/auth/login weitergeleitet -> nicht vorhanden)

    Genaue Antwort von Nginx: https://gyazo.com/8738880ff9d0342c7be8d1abf277215e (Bild)
    Eintrag im ServerLog: http://hastebin.com/imarozevex.vbs (Textdatei)

    Ich würde mich gewaltig über eine Antwort freuen, da ich dieses Tutorial gerne vollenden möchte ;)

    Freundliche Grüsse
    raphih18

  62. wiper

    hallo, auch ich bin völlig begeistert von der Anleitung und schaut soweit alles gut aus.
    emails kommen an .. webmail geht, domains einrichten geht, nur komme ich auf die mailbox per imap nicht drauf

    Feb 14 19:01:51 mail dovecot: imap-login: Disconnected (auth failed, 1 attempts in 2 secs): user=, method=PLAIN, rip=::1, lip=::1, TLS, TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)

    thunderbird findet beim einrichten imap 143 TSL passwort, normal, sagt aber dann immer passwort ist falsch

    hab schon die config rauf und runter gelesen .. finde aber den fehler nicht.
    irgendwelche tipps?

    danke!

    1. raphih18

      Guten Abend!

      Geniales Tutorial! Sehr schön, übersichtlich & ausführlich.
      Jedoch habe ich ein kleines Problemchen, und zwar:
      Bis zum Browser-Aufruf von VimbAdmin funktioniert alles. Antworten vom Bash genauso wie beim Tutorial beschrieben. Geht es dann jedoch um’s aufrufen der /admin-Seite, bockt mein Server und meint, er könne das Directory nicht finden (man wird auf hostname.tld/admin/auth/login weitergeleitet -> nicht vorhanden)

      Genaue Antwort von Nginx: https://gyazo.com/8738880ff9d0342c7be8d1abf277215e (Bild)
      Eintrag im ServerLog: http://hastebin.com/imarozevex.vbs (Textdatei)

      Ich würde mich gewaltig über eine Antwort freuen, da ich dieses Tutorial gerne vollenden möchte ;)

      Freundliche Grüsse
      raphih18

    2. Gast-ohne-nerven

      Könntest du bitte mal folgendes überprüfen…

      shell aufrufen

      mysql -u vimbadmin -p
      passwort eingeben für die sql datenbank
      use vimbadmin
      select * from mailbox

      und gucken ob die betroffenen User ein leeres Passwort haben?

  63. mkirbst

    Hallo André !

    Danke für das Tutorial, mal eins von den wenigen, die auf Anhieb funktionieren. Ich hab noch eine kleine Ergänzung: wenn man seinen Benutzern ermöglichen möchte, das Passwort direkt in Roundcube zu ändern, da kann man das ganz leicht erreichen, indem man einfach nur folgendes am Ende der Datei /var/www/html/webmail/config/config.inc.php einfügt:

    $config[‚plugins‘] = array(‚password‘);
    $config[‚password_db_dsn‘] = ‚mysql://vimbadmin:changeme@localhost/vimbadmin‘;
    $config[‚password_query‘] = ‚UPDATE vimbadmin.mailbox SET password = %D WHERE username = %l“@“%d LIMIT 1‘;
    $config[‚password_dovecotpw‘] = ‚/usr/bin/doveadm pw‘;
    $config[‚password_dovecotpw_method‘] = ‚SHA512-CRYPT‘;
    ?>

    Dabei ist changeme natürlich wieder durch das korrekte MySQL-Passwort von vimbadmin zu ersetzen, wie in der Anleitung auch.
    WICHTIG: Die Anführungsstriche bitte durch einfache Hochkommas ersetzen, irgendwie wird das immer umformatiert beim posten.

    Viele Grüße,
    Marcel

    PS:

  64. John Doh!

    Den „smtpd_sasl_authenticated_header“ in der main.cf kann man wohl auf „no“ setzen, ohne dass es beim senden/empfangen Probleme gibt.
    Habe nur ein großes Postfach und alle Adressen in das Postfach geleitet und in meinem Client als Alias eingerichtet.
    Die Adresse von dem Hauptpostfach ist aus „Sicherheitsgründen“ eher kryptisch und wird, wenn „smtpd_sasl_authenticated_header“ auf „yes“ steht, jedoch im Header mitgesendet. (Wenn keiner den Nutzernamen weiß, nützt ihnen auch das Passwort nichts ;), hoffe ich)
    Nach kurzen Recherchen und Tests kann ich allerdings sagen, dass das die Gegenstelle nicht interessiert, ob der Part nun mitgesendet wird, oder nicht. habe das nun seit Dezember am Laufen und konnte keine Probleme feststellen.

    Kann man eventuell auch ins nächste Mailcow Update im Webinterface als optionale Einstellung unter „Privacy“ packen.

  65. frozen

    ./bin/doctrine2-cli.php orm:schema-tool:create

    ATTENTION: This operation should not be executed in a production environment.

    Wenn man deine Anleitung denn Produktiv nutzen will, ist diese Meldung hier ok? :/

  66. Udo Hartmann

    Fetchmail einzubinden war eigentlich straightforward, also
    1. sudo apt-get install fetchmail
    2. sudo nano /etc/defaults/fetchmail
    dort START_DEAMON=no ändern in START_DEAMON=yes
    3. sudo cp /usr/share/doc/fetchmail/examples/fetchmailrc.example /etc/fetchmailrc
    4. sudo nano /etc/fetchmailrc
    Dort die Server mit den entsprechenden Konten eintragen, die abgeholt werden sollen. z.B.:
    poll pop.gmx.net with protocol pop3
    user user1@gmx.net password meinpasswort is lokaleskonto@mydomain here;

    Der Eintrag sollte eigentlich weitgehend selbsterklärend sein. Zum ersten Testen empfiehlt es sich, vor dem Semikolon noch ein keep einzufügen, damit bleiben die abgeholten NAchrichten auf dem Server liegen, falls irgendwo was klemmt…
    Achtung! Wenn fetchmail einmal eine Nachricht erfolgreich abgeholt hat, erkennt es sie als „seen“ und holt sie nicht mehr ab. mit fetchall kann man das aber erzwingen.

    5. Damit fetchmail mit der Arbeit beginnt, noch ein
    sudo systemctl restart fetchmail.service
    und schon sollten die Mails eintrudeln.

  67. Hannes

    Erstmal super für das ausführliche Tutorial.
    Hat nach kurzen anlauf Schwierigkeiten super geklappt. Habe statt der selbst signierten Zertifikate die kostenlosen von „letsencrypt“ verwendet was auch tadellos funktioniert.

    Was mich noch interessiert, hat jemand von euch noch FETCHMAIL integriert? Ich würde gerne meine ganzen alten E-Mail Adressen einsammeln und in meine 2 Useraccounts verteilen.

    Gibts da auch eine schritt für schritt anleitung wie das eingebunden wird ?

    Grüße Hannes

  68. Martin

    Klasse Tutorial!
    Ich bin 1:1 durchgeflogen und fast alles funktioniert auf Anhieb. Das einzige was ich bisher feststellen konnte ist der folgende Logeintrag:
    Dec 7 13:01:58 srv dovecot: imap-login: Error: SSL: Stacked error: error:0608308E:digital envelope routines:EVP_PKEY_get1_EC_KEY:expecting a ec key
    Dec 7 13:01:58 srv dovecot: imap-login: Error: SSL: Stacked error: error:0608308E:digital envelope routines:EVP_PKEY_get1_EC_KEY:expecting a ec key

    Diese Zeilen erhalte ich sobald sich ein Client per IMAP anmelden möchte. Ich kann keinerlei Funktionseinschränkung feststellen, denn die Clients können sich ihre Mails normal abrufen. Allerdings stören mich diese Einträge – blöderweise finde ich nichts vernünftiges zu dieser Problematik. Immer heißt es nur ich solle darauf achten das die Zertifikate mit einer Leerzeile enden – was sie bereits alle tuen.
    Hat hier noch jemand eine Idee?

    Grüße
    Martin

    1. DerGereat

      Beginnt dein privates Zertifikat (/etc/ssl/`hostname -f`.key) nur mit „BEGIN PRIVATE KEY“?

      Es kann sein, dass dovecot „BEGIN RSA PRIVATE KEY“ im privaten Key erwartet.

  69. Tobi

    Hay,

    @Carsten ich habe genau dasselbe Problem, mit apache2 funktioniert auch alles beim anlegen, hab versucht selbst di eProtokollen und die configs (.cf) zu verändern ohne erfolg

    @an alle : Währe es möglich das mir jemand der das vollwertig zum laufen bekommen hat auch vlt die Dateien schicken :)

  70. Carsten

    DANKE für diese super Anleitung.
    Mit Hilfe der Kommentare habe ich diesen Mail-Server in Kombination mit einem Apache2 installieren können.
    In ViMbAdmin komme ich rein und kann dort auch Domains und Mailboxen anlegen. Auch in den Webmailer komme ich rein.
    Nur kann ich leider keine Mails aus dem Webmailer versenden:
    SMTP Fehler (451): Der Empfänger „xxx@domain.de“ konnte nicht gesetzt werden (4.3.0 : Temporary lookup failure)
    Ich habe auch versucht mir eine eMail von aussen zu senden, aber auch das hat leider nicht geklappt.
    Wo kann ich denn ansetzen, damit auch das Mail senden/empfangen klappt?

    Viele Grüße
    Carsten

    1. Daniel Salzner

      Hallo Carsten,

      ich hatte den Fehler auch. Fündig geworden bin ich in /var/log/mail.log. Die Postfix MySQL Config Dateien hatten einen Schreibfehler (in meinem Fall einen Typo beim DB-Usernamen „vimbadmin“). Nach Korrektur und Neustart aller Dienste lief der Mailserver dann auch wie erwartet reibungslos.

      An alle neugierigen Mailserver Admins und die, die es noch werden möchten:
      Auch wenn diese Anleitung schon etwas älter ist, ist sie nach wie vor immer noch für das aktuellste Debian Jessie gültig. Und das auch noch im Monat November 2016.

      Viele Grüße
      Daniel

  71. Phillip S.

    Guter Artikel, alles ausführlich beschrieben. Am Ende der Datei /var/www/html/webmail/config/config.inc.php fehlt ein „?>“ tag, das könnte noch mit da rein.

    Veerschicken von Mails klappt gut, jedoch bekomme ich keine eingehenden Mails

    Anonymous TLS connection established from mailout-apollo.uni-duesseldorf.de[134.99.128.36]: TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)
    NOQUEUE: reject: RCPT from mailout-apollo.uni-duesseldorf.de[134.99.128.36]: 454 4.7.1 (info@XXXXXXXXXX.XXX): Relay access denied; from=(XXXXXX.XXXXXX@uni-duesseldorf.de) to=(info@XXXXXXXXXX.XXX) proto=ESMTP helo=(mailout-apollo.uni-duesseldorf.de)
    disconnect from mailout-apollo.uni-duesseldorf.de[134.99.128.36]

    Probiert von verschiedenen Mailservern, es taucht immer eine Relay access denied Fehlermeldung in den Logs auf. Was muss ich umkonfigurieren damit ich Mails empfangen kann?

  72. Simon Wheeler

    Hallo Andre,

    ich habe mithilfe deiner Anleitung den Mail-Server erfolgreich einrichten können und alles funktioniert soweit einwandfrei. Jetzt will ich aber eine zweite Domain einrichten. Dafür kann ich ja in ViMbAdmin eine neue Domain, Adresse und Alias anlegen. Nach dem Anlegen und Neustart der Postfix, Dovecot,… Dienste und senden einer Testnachricht von meinem Googlemail-Account an die neu angelegte Email kommt diese mit der Meldung zurück, dass der Relay Access verweigert wird.

    Beim Domain Hoster ist für die funktionierende Domain A ein MX-Eintrag definiert. Diesen hab ich auch bei der neuen Domain B eingetragen (MX bei A = mail.domainA.de, MX bei B = mail.domainA.de). Muss ich noch weitere Einstellungen tätigen, damit ich Emails bei der neuen Domain empfangen kann? Login über Roundcube funktioniert für beide Domains.

    1. Christian

      Es reicht, wenn
      DomainB.tld. 86400 IN MX mail.DomainA.tld.
      in der DNS-Zone der DomainB eingetragen ist. Am mailserver selbst muss nichts mehr angepasst werden. Wie schon angemerkt, sollte die DomainB in vimbadmin eingetragen sein.
      evtl. kann man mit einem A-Record noch auf die IP von domainA verweisen (war bei meinem Provider voreingestellt)
      Dauert dann ca. ein Tag bis alle DNS-Server die neue Domain kennen.

  73. Jörg G.

    Hallo Andre,

    danke für das gut kommentierte Tutorial und der schnellen Hilfe per Email. Ich hab dein Wink mit dem Zaunspfahl gleich für ein Betriebssystemwechsel genutzt. Bisher habe ich immer auf Apache gesetzt aber nginx ist irgenwie leichter zu konfigurieren.

    Mein Problem ist noch, dass man das Userpasswort nicht via Roundcube ändern lässt. Im Netz habe ich diverse Anleitungen gefunden, wie man das Passwortplugin aktivieren kann. aber leider komme ich damit noch nicht so zurecht :( Das Passwortplugin wird inzwischen angezeigt aber ich kann das Passwort nicht speichern.

    Mit

    server {
    listen 80;
    listen [::]:80;
    server_name mail.example.com;
    return 301 https://$server_name$request_uri;
    }

    erzwinge ich quasi eine SSL Verschlüsselung für den Roundcube- bzw VimbAdminzugang.

    Gruß

    Jörg

  74. Benni

    Vielen dank für die Anleitung.

    Ich habe den Content Filter mal bisschen getestet und er funktioniert recht gut. Emails werden gelöscht. Jedoch werden die Benutzer nicht darüber benachrichtigt.
    Die Mails wurden erkannt welches man am „/var/log/clamav/clamav.log“ sieht.

    Was mich jedoch nun verwundert, dass es einmal beim eMail-Test von Outlook funktioniert hat mit „Delivery status notification, invalid header section: missing required header field“

    Wenn man das gefixt bekommt, wäre es perfekt.

  75. Dino

    Zunächst einmal einen Großen Dank für diese erstklassige Anleitung. Ich habe mit dieser Anleitung einen gut funktionierenden Mailserver aufgebaut und bin bisher sehr zufrienen.

    Jetzt habe ich eine Frage/Problem:
    Ich versuche den Mailserver als Relay für meinen Webserver (auf einer anderen Maschine) zu nutzen. Das funktoniert per SMTP auch super solange der verwendete Account mit dem Sender (From) übereinstimmt. Sobald ich eine andere Adressen (selbst der gleichen Domain) verwende, kommt folgender Fehler im Log „Sender address rejected: not owned by user“ und die Mail wird nicht versendet.

    Das ist allerdings ein Szenario was am Webserver ständig vorkommt.
    Was muss ich an der Konfiguration ändern, dass ein Accout prinzipiell relayed … egal was kommt?

    Gruß und Danke!

    1. André P. Autor

      Hi,
      am einfachsten ist es, du entfernst aus der main.cf-Datei die Anweisung reject_authenticated_sender_login_mismatch. Alternativ verwendest du -keine- Authentifizierung und fügst deinen Webserver zu „mynetworks“ hinzu. Das ist aber potentiell gefährlich. Nämlich dann, wenn der Webserver (oder eben eine Anwendung darauf) gehackt- und der Mailserver vom Webserver aus als offenes Relay verwendet wird.
      Oder du erstellst dir für die E-Mail Adresse, mit der du dich einloggst jeweils einen Alias. Der Benutzer, auf den ein Alias „zeigt“, darf auch unter diesem Alias E-Mails versenden. Das wäre die sauberste Lösung. :-) Allerdings musst du dann wirklich jeden Absender auch als Alias einbinden.

      Viele Grüße
      André

  76. Sven

    Was wäre die schnellste Variante das ein 2ter Server auch die Mails darüber verschickt?
    Einen Mailaccount anlegen und dann über SMTP senden lassen oder gibt es noch eine schönere Variante?

    VG
    Sven

    1. André P. Autor

      Ja, das ist wohl die sauberste Lösung, wenn von Anwendungen aus Mails versendet werden sollen. Der primäre Mailserver kann auch als „relayhost“ auf dem zweiten Server verwendet werden, allerdings nur nach Authentifizierung. Zu „mynetworks“ siehe meinen Kommentar eine Etage über dir. :-)

  77. Dennis2

    Hallo André

    aus dem nichts taucht auf einmal ein dickes problem auf. Seit gestern, Nov 15 21:39:26, werden alle Nachrichten ‚rejected‘ mit


    Client host rejected: cannot find your reverse hostname

    An der Konfiguration habe ich nichts geändert. Mir fiel es heute auf, da ich täglich newsletter bekomme und diese heute morgen ausblieben. Versenden nach draussen, über den mailserver per desktop client funktioniert. Im mail.log fällt folgendes beim empfangen auf(1. mail von iCloud an mailserver, 2. von web.de an mailserver, 3. von privater Adresse, die bei einem normalen webhost ist, an mailserver):

    Nov 16 14:05:51 mail postfix/postscreen[3593]: CONNECT from [17.158.120.161]:38131 to [1.2.3.4]:25
    Nov 16 14:05:52 mail postfix/dnsblog[3595]: addr 17.158.120.161 listed by domain wl.mailspike.net as 127.0.0.17
    Nov 16 14:05:52 mail postfix/dnsblog[3610]: addr 17.158.120.161 listed by domain hostkarma.junkemailfilter.com as 127.0.0.3
    Nov 16 14:05:52 mail postfix/dnsblog[3610]: addr 17.158.120.161 listed by domain hostkarma.junkemailfilter.com as 127.0.1.1
    Nov 16 14:05:54 mail postfix/postscreen[3593]: PASS NEW [17.158.120.161]:38131
    Nov 16 14:05:54 mail postfix/smtpd[3601]: connect from unknown[17.158.120.161]
    Nov 16 14:05:55 mail postfix/smtpd[3601]: Anonymous TLS connection established from unknown[17.158.120.161]: TLSv1.2 with cipher DHE-RSA-AES128-GCM-SHA256 (128/128 bits)
    Nov 16 14:05:55 mail postfix/smtpd[3601]: NOQUEUE: reject: RCPT from unknown[17.158.120.161]: 450 4.7.1 Client host rejected: cannot find your reverse hostname, [17.158.120.161]; from= to= proto=ESMTP helo=
    Nov 16 14:05:56 mail postfix/smtpd[3601]: disconnect from unknown[17.158.120.161]
    Nov 16 14:09:16 mail postfix/anvil[3573]: statistics: max connection rate 1/60s for (smtpd:66.179.147.181) at Nov 16 14:00:13
    Nov 16 14:09:16 mail postfix/anvil[3573]: statistics: max connection count 1 for (smtpd:66.179.147.181) at Nov 16 14:00:13
    Nov 16 14:09:16 mail postfix/anvil[3573]: statistics: max cache size 1 at Nov 16 14:00:13
    Nov 16 14:09:52 mail postfix/postscreen[3650]: CONNECT from [2xx.2xx.1x.x]:53915 to [1.2.3.4]:25
    Nov 16 14:09:52 mail postfix/dnsblog[3656]: addr 2xx.2xx.1x.x listed by domain wl.mailspike.net as 127.0.0.18
    Nov 16 14:09:52 mail postfix/dnsblog[3654]: addr 2xx.2xx.1x.x listed by domain hostkarma.junkemailfilter.com as 127.0.1.1
    Nov 16 14:09:52 mail postfix/dnsblog[3654]: addr 2xx.2xx.1x.x listed by domain hostkarma.junkemailfilter.com as 127.0.0.5
    Nov 16 14:09:55 mail postfix/postscreen[3650]: PASS NEW [2xx.2xx.1x.x]:53915
    Nov 16 14:09:55 mail postfix/smtpd[3657]: connect from unknown[2xx.2xx.1x.x]
    Nov 16 14:09:55 mail postfix/smtpd[3657]: Anonymous TLS connection established from unknown[2xx.2xx.1x.x]: TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)
    Nov 16 14:09:55 mail postfix/smtpd[3657]: NOQUEUE: reject: RCPT from unknown[2xx.2xx.1x.x]: 450 4.7.1 Client host rejected: cannot find your reverse hostname, [2xx.2xx.1x.x]; from= to= proto=ESMTP helo=
    Nov 16 14:09:55 mail postfix/smtpd[3657]: disconnect from unknown[2xx.2xx.1x.x]
    Nov 16 14:10:01 mail postfix/postscreen[3650]: CONNECT from [1xx.3x.1xx.1xx]:54988 to [1.2.3.4]:25
    Nov 16 14:10:01 mail postfix/postscreen[3650]: PASS OLD [1xx.3x.1xx.1xx]:54988
    Nov 16 14:10:01 mail postfix/smtpd[3657]: connect from unknown[1xx.3x.1xx.1xx]
    Nov 16 14:10:01 mail postfix/smtpd[3657]: Anonymous TLS connection established from unknown[1xx.3x.1xx.1xx]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)
    Nov 16 14:10:01 mail postfix/smtpd[3657]: NOQUEUE: reject: RCPT from unknown[1xx.3x.1xx.1xx]: 450 4.7.1 Client host rejected: cannot find your reverse hostname, [1xx.3x.1xx.1xx]; from= to= proto=ESMTP helo=
    Nov 16 14:10:02 mail postfix/smtpd[3657]: disconnect from unknown[1xx.3x.1xx.1xx]
    

    egal von wo, nichts kommt durch. versenden nach draussen vom desktop client sowie aus roundcube funktioniert und sieht so aus:

    Nov 16 14:23:29 mail postfix/smtpd[3758]: connect from unknown[9x.9x.2xx.1xx] # dies ist meine ip von zuhause)
    Nov 16 14:23:30 mail postfix/smtpd[3758]: Anonymous TLS connection established from unknown[9x.9x.2xx.1xx]: TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)
    Nov 16 14:23:30 mail postfix/smtpd[3758]: NOQUEUE: client=unknown[9x.9x.2xx.1xx], sasl_method=PLAIN, sasl_username=dennis2@kaputtermailserver.de
    Nov 16 14:23:35 mail postfix/smtpd[3767]: connect from localhost[127.0.0.1]
    Nov 16 14:23:35 mail postfix/smtpd[3767]: 6ED9FE85D3F: client=localhost[127.0.0.1], orig_client=unknown[9x.9x.2xx.1xx]
    Nov 16 14:23:35 mail postfix/cleanup[3768]: 6ED9FE85D3F: message-id=
    Nov 16 14:23:35 mail postfix/qmgr[3456]: 6ED9FE85D3F: from=, size=2537, nrcpt=1 (queue active)
    Nov 16 14:23:35 mail amavis[3457]: (03457-01) Passed CLEAN {RelayedOutbound}, SUBMISSION LOCAL [9x.9x.2xx.1xx]:32445 [9x.9x.2xx.1xx]  -&gt; , Message-ID: , mail_id: Y4r5ImvbWB3f, Hits: -0.998, size: 1420, queued_as: 6ED9FE85D3F, dkim_new=default:kaputtermailserver.de, 5026 ms
    Nov 16 14:23:35 mail postfix/smtpd[3758]: proxy-accept: END-OF-MESSAGE: 250 2.0.0 from MTA(smtp:[127.0.0.1]:10035): 250 2.0.0 Ok: queued as 6ED9FE85D3F; from= to= proto=ESMTP helo=
    Nov 16 14:23:35 mail postfix/smtpd[3758]: disconnect from unknown[9x.9x.2xx.1xx]
    

    Vielleicht weisst du wie das passieren konnte und was ich unternehmen kann, um wieder emails empfangen zu können? Ich nehme an, ich könnte in /etc/postfix/main.cf ‚reject_unknown_reverse_client_hostname‘ auskommentieren. Da es aber bisher wunderbar damit geklappt hat, frage ich mich, ob es vielleicht eine andere Lösung gibt.
    Vielen Dank!

  78. Thomas

    Hallo André,

    ersteinmal vielen Dank für die gute ausfürliche Anleitung.

    Ich habe hier ein Problem beim abholen der Mails. Wenn ich dies mit fetchmail mache, landen die Mails nicht in den angelegten User. Kann ich hier überhaupt fetchmail zum abholen einsetzten?

    Gruß Thomas

  79. Maik L.

    Hallo Andre

    Also ich bin noch mal neu angefangen. Habe mein Vserver also noch mal neu aufgespielt mit debian 8. Und habe wieder nginx installiert.

    Folgender Fehler immer noch: https://mail.tt-osl-pokal.de/admin/ Bad Gatway 502

    im Eror log von Nginx steht weiterhin: 2015/11/09 23:40:23 [crit] 7737#7737: *200 connect() to unix:/var/run/php5-fpm.sock failed (13: Permission denied) while connecting to upstream, client: ****, server: mail.tt-osl-pokal.de, request: „GET /admin/ HTTP/1.1“, upstream: „fastcgi://unix:/var/run/php5-fpm.sock:“, host: „mail.tt-osl-pokal.de“

  80. aruka

    Hallo,

    habe den Mailserver eingerichtet und alles funktioniert auch super. Vielen Dank dafür.
    Neben dem Mailserver möchte ich gerne noch owncloud einrichten. Anscheinend vergebe ich aber falsche Rechte und kann die cloud nach der Installation nicht mehr aufrufen. Bekomme dann ständig ein 404 Not Found. Kann mir bitte jemand sagen, wie ich dem owncloud-Ordner die richtigen Rechte vergebe und dann auch eine Subdomain in nginx (cloud.domain.tld) hinzufüge?

    Das ist das einzige Problem, welches ich habe. Ich hoffe, ihr könnt mir helfen.

    Vielen Dank schon mal

  81. Christian

    Hallo Andre,
    ich habe noch eine Frage. Die Installation hat soweit komplett super geklappt.
    Ich kann auch User und Domains anlegen und mich in Roundcube damit einloggen.
    Wenn ich allerdings eine Mail senden will, geht sie nicht raus und ich bekomme im Roundcube
    SMTP Fehler: [451] 4.3.0 Error: queue file write error
    Kannst Du mir sagen, an welchen Stellen ich ansetzen muss?
    Danke Dir.

    1. Christian

      Ergänzung, ich bekomme im Log z.B.
      Nov 4 23:11:29 mail postfix/smtpd[1178]: warning: timeout talking to proxy 127.0.0.1:10025
      Nov 4 23:11:29 mail postfix/smtpd[1178]: proxy-reject: END-OF-MESSAGE: 451 4.3.0 Error: queue file write error;

      Amavis ist jedoch gestartet.

  82. Christian

    Hallo, ich bin relativ weit gekommen in der Anleitung, allerdings startet jetzt mein nginx nicht mehr.
    failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)
    nginx: configuration file /etc/nginx/nginx.conf test failed

    Wo muss ich ansetzen?
    cp /etc/ssl/`hostname -f`.cer /usr/local/share/ca-certificates/
    und update-ca-certificates
    habe ich für mein selbst erstelltes Zertifikat bereits gemacht….

    Vielen Dank.

  83. Dino di Carlo

    Hallo André,

    zunächst vielen Dank für die sensationell gute Anleitung.
    Ich habe alles fast auf Anhieb zum Laufen bekommen. Danke!

    Jetzt habe ich die Herausforderung noch pop3 zum Laufen zu bringen.
    Meine Kunden verwenden neben IMAP leider auch noch POP3.

    Was muss ich denn alles anpassen um POP3 zu ermöglichen. Über „sachdienliche“ Hinweise bin ich sehr dankbar ;-)
    Vermutlich muss die dovecot.conf; aplication.ini angepasst werden, oder?

    Danke im Voraus für Deine Mühe!
    Gruß
    Dino

  84. Der_Dicke82

    Moin,

    nach ein paar kleinen Problemen die ich selbst zu verantworten hatte :-D läuft nun über den Webmailer alles ohne Probleme!

    Der Empfang auf dem Emailclient per imap und pop funktioniert auch, nur der Versand von Emails per smtp klappt nicht.

    Erster versuch auf Port 25
    Zurückgewiesen wegen Spam
    Zweiter versuch auf Port 587
    Zurückgewiesen weil kein FQDN
    Dritter Versuch auf Port 587
    Zurückgewiesen wegen Spam

    Ich werde jetzt mal 24 Stunden warten damit sich postscreen zurücksetzt und dann nochmal probieren.

    Danke aber für das tolle Tutorial!

    Gruß, Stefan

  85. Charly

    Hi André
    Wollte mich herzlich bedanken für die tolle Anleitung. Schade ist nur, dass man ja fast nichts mehr überlegen muss ;-)
    Ist ja alles Fix Fertig… Super!

    Ich wollte noch kurz Fragen betreff Ports. Da ich nur die Ports mit meiner Firewall öffnen will die es auch braucht.
    Port: 25, 443, 143, 587, 993, 4190
    Stimmt das so? Müssen alle diese Ports von aussen Erreichbar sein?
    Das andere ist, habe jetzt ein selbst signiertes Zertifikat. Das Klappt auch. Möchte jetzt dies aber mit einem StartSSL Zertifikat austauschen. Kann ich das Zertifikat einfach nur austauschen?
    Oder wie gehe ich da vor?

    1. Maik L.

      Error log sagt mir:

      2015/10/09 01:25:13 [crit] 21587#0: *13 connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: ******, server: mail.tt-osl-pokal.de, request: „GET /webmail/ HTTP/1.1“, upstream: „fastcgi://unix:/var/run/php5-fpm.sock:“, host: „mail.tt-osl-pokal.de“

      1. André P. Autor

        Hi,
        schast du einmal nach, wie dein Listener heißt? -> cat /etc/php5/fpm/pool.d/www.conf | grep "listen ="

        Anschließend kannst du den ausgegebenen Namen in deiner Nginx-Site verwenden (anstelle von „/var/run/php5-fpm.sock“).

        Eventuell ist auch ein TCP-Listener eingetragen, das wäre merkwürdig aber denkbar. Du verwendest Debian Jessie? PHP5-FPM startet? -> service php5-fpm start

        1. Maik L.

          root@mail:~# cat /etc/php5/fpm/pool.d/www.conf | grep „listen =“
          listen = /var/run/php5-fpm-www.sock

          was soll ich da anderes eingeben ?

          root@mail:~# service php5-fpm status
          ● php5-fpm.service – The PHP FastCGI Process Manager
          Loaded: loaded (/lib/systemd/system/php5-fpm.service; enabled)
          Active: active (running) since Fri 2015-10-09 03:24:41 CEST; 9h ago
          Process: 28484 ExecStartPre=/usr/lib/php5/php5-fpm-checkconf (code=exited, status=0/SUCCESS)
          Main PID: 28491 (php5-fpm)
          Status: „Processes active: 0, idle: 9, Requests: 2, slow: 0, Traffic: 0req/sec“
          CGroup: /system.slice/php5-fpm.service
          ├─28491 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
          ├─28495 php-fpm: pool mailserver
          ├─28496 php-fpm: pool mailserver
          ├─28497 php-fpm: pool mailserver
          ├─28498 php-fpm: pool www
          ├─28499 php-fpm: pool www
          ├─28500 php-fpm: pool www
          ├─28501 php-fpm: pool vserver3010
          ├─28502 php-fpm: pool vserver3010
          └─28503 php-fpm: pool vserver3010

          1. André P. Autor

            Hi Maik,
            in dem Fall „/var/run/php5-fpm-www.sock“.
            1. nano /etc/nginx/sites-available/mailserver
            2. „/var/run/php5-fpm.sock“ durch „/var/run/php5-fpm-www.sock“ ersetzen. :-)
            Anschließend nur Nginx durchstarten: service nginx restart

            1. Maik L.

              jetzt hab ich noch ein weiteres problem weil ich den nginx aupgraden wollte und dabein ist das rausgekommen:

              root@mail:/etc# aptitude install nginx
              The following NEW packages will be installed:
              nginx
              0 packages upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
              Need to get 0 B/486 kB of archives. After unpacking 1212 kB will be used.
              (Reading database … 59546 files and directories currently installed.)
              Preparing to unpack …/nginx_1.9.5-1~jessie_amd64.deb …
              ———————————————————————-

              Thanks for using nginx!

              Please find the official documentation for nginx here:
              * http://nginx.org/en/docs/

              Commercial subscriptions for nginx are available on:
              * http://nginx.com/products/

              ———————————————————————-
              Unpacking nginx (1.9.5-1~jessie) …
              dpkg: error processing archive /var/cache/apt/archives/nginx_1.9.5-1~jessie_amd64.deb (–unpack):
              trying to overwrite ‚/usr/share/nginx/html/index.html‘, which is also in package nginx-common 1.8.0-1~dotdeb+8.2
              dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)
              Errors were encountered while processing:
              /var/cache/apt/archives/nginx_1.9.5-1~jessie_amd64.debE: Sub-process /usr/bin/dpkg returned an error code (1)
              Failed to perform requested operation on package. Trying to recover:

              1. Maik L.

                So jetzt hab ich es soweit hinbekommen das ich nginx wieder hinbekommen habe aber bei der version 1.9.5 gibt es die verzeichnisse sites-avabile und enable nicht mehr stattdessen nur noch conf.d kann ich die seite einfach unter conf.d hinzufügen und alles genau gleich machen ?

              2. Maik L.

                naja bin bis wieder nur bis zum teil gekommen das ich auf die web oberfläche muss und da sagt er mir dann wenn ich nginx neustarte nginx -t
                nginx: [emerg] open() „/etc/nginx/snippets/fastcgi-php.conf“ failed (2: No such file or directory) in /etc/nginx/conf.d/mailserver.conf:26
                nginx: configuration file /etc/nginx/nginx.conf test failed

              3. André P. Autor

                Hi, meine Mail an dich kam gerade wieder zurück (nach 24 Stunden).
                Es liegt genau daran: „/etc/nginx/snippets/fastcgi-php.conf“ failed (2: No such file or directory). Die Datei gibt es in deinem Nginx Paket einfach nicht. Dort sind einige FCGI-relevante Einstellungen drin, die einfach für alle Sites gelten sollen und so schnell eingebunden werden können, ohne jedes mal 20 Zeilen zu kopieren.
                Ich empfehle einfach die Debian-eigene Nginx-Version zu übernehmen oder wenigstens die Datei /etc/nginx/snippets/fastcgi-php.conf an selbige Stelle zu kopieren, damit sie eingebunden werden kann.

              4. Maik L.

                Ich weis nicht ob das weiter hilft habe eine fastcgi_params im haupt Verzeichnis von nginx ist das die selbe Datei ? muss ich das Script nur dahin ändern ?

            2. Maik L.

              Stimmt unter dem Verzeichnis findet man ja auch nix. Aber unter https://mail.tt-osl-pokal.de/webmail/ kommt wieder Bad Gateway Obwoll bei cat /etc/php5/fpm/pool.d/www.conf | grep „listen =“
              listen = /var/run/php5-fpm-www.sock
              das raus kommt und die mailserver.conf datei auch das fastcgi_pass unix:/var/run/php5-fpm-www.sock;
              hat.

              In der Error datei steht wieder das selbe wie beim anfang 2015/10/16 17:42:28 [crit] 27637#27637: *33 connect() to unix:/var/run/php5-fpm-www.sock failed (13: Permission denied) while connecting to upstream, client: *****, server: mail.tt-osl-pokal.de, request: „GET /webmail/ HTTP/1.1“, upstream: „fastcgi://unix:/var/run/php5-fpm-www.sock:“, host: „mail.tt-osl-pokal.de“

              1. Maik L.

                Also um noch mal Konkret zu werden der fehler heist immer noch:

                2015/10/23 02:23:15 [crit] 5810#5810: *4 connect() to unix:/var/run/php5-fpm-mailserver.sock failed (13: Permission denied) while connecting to upstream, client: ****, server: mail.tt-osl-pokal.de, request: „GET /vibadmin/ HTTP/1.1“, upstream: „fastcgi://unix:/var/run/php5-fpm-mailserver.sock:“, host: „mail.tt-osl-pokal.de“

                Nur ich weis nicht was der für eine erlaubnis haben will.

  86. David

    Hi Andre,

    das tutorial hat mir sehr geholfen und der mailserver war recht flott am laufen.
    nun, nach einigen wochen im betrieb habe ich ein problem mit dem adminpanel.

    ich bekomme einen fehler. ich hatte in letzter zeit aber ausser updates nichts weiter gemacht.

    Vielleicht kannst du mir weiterhelfen:

    Die mysql db von vimbadmin sieht ok aus. ich weiss nicht woran es liegt.

    Doctrine\Common\Persistence\Mapping\MappingException
    File
    /srv/vimbadmin/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php
    Line
    86
    Message
    Invalid mapping file ‚Entities.Admin.dcm.xml‘ for class ‚Entities\Admin‘.
    Code
    0
    Trace
    #0 /srv/vimbadmin/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php(117): Doctrine\Common\Persistence\Mapping\MappingException::invalidMappingFile(‚Entities\\Admin‘, ‚Entities.Admin….‘)
    #1 /srv/vimbadmin/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php(58): Doctrine\Common\Persistence\Mapping\Driver\FileDriver->getElement(‚Entities\\Admin‘)
    #2 /srv/vimbadmin/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php(116): Doctrine\ORM\Mapping\Driver\XmlDriver->loadMetadataForClass(‚Entities\\Admin‘, Object(Doctrine\ORM\Mapping\ClassMetadata))
    #3 /srv/vimbadmin/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(332): Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata(Object(Doctrine\ORM\Mapping\ClassMetadata), NULL, false, Array)
    #4 /srv/vimbadmin/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(216): Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata(‚Entities\\Admin‘)
    #5 /srv/vimbadmin/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php(265): Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor(‚Entities\\Admin‘)
    #6 /srv/vimbadmin/vendor/doctrine/orm/lib/Doctrine/ORM/Repository/DefaultRepositoryFactory.php(67): Doctrine\ORM\EntityManager->getClassMetadata(‚Entities\\Admin‘)
    #7 /srv/vimbadmin/vendor/doctrine/orm/lib/Doctrine/ORM/Repository/DefaultRepositoryFactory.php(50): Doctrine\ORM\Repository\DefaultRepositoryFactory->createRepository(Object(Doctrine\ORM\EntityManager), ‚Entities\\Admin‘)
    #8 /srv/vimbadmin/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php(665): Doctrine\ORM\Repository\DefaultRepositoryFactory->getRepository(Object(Doctrine\ORM\EntityManager), ‚\\Entities\\Admin‘)
    #9 /srv/vimbadmin/application/controllers/AuthController.php(52): Doctrine\ORM\EntityManager->getRepository(‚\\Entities\\Admin‘)
    #10 /srv/vimbadmin/vendor/opensolutions/oss-framework/src/OSS/Controller/Trait/Auth.php(99): AuthController->_preLogin()
    #11 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Action.php(516): AuthController->loginAction()
    #12 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch(‚loginAction‘)
    #13 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
    #14 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application/Bootstrap/Bootstrap.php(105): Zend_Controller_Front->dispatch()
    #15 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application.php(384): Zend_Application_Bootstrap_Bootstrap->run()
    #16 /srv/vimbadmin/public/index.php(34): Zend_Application->run()
    #17 {main}

  87. Chris W

    Hi,
    vielen Dank für dieses super geschriebene Howto/Tutorial! Meine Tests mit einem Digitalocean Droplet haben gezeigt, dass die ganz kleine Droplet Variante mit 512MB RAM zu wenig ist, mit 1GB RAM funktionerts. Ich plane meinen Mailserver bei einem anderen Anbieter als KVM basierten virtuellen Server mit 2+ GB RAM laufen zu lassen. Ich schwanke jetzt zwischen SSD oder normaler Platte, das ist natürlich ein preislicher Unterschied. Machts irgendeinen Sinn, für private Zwecke (3-5 Mailboxen mit durchschnittlichem Mailaufkommen) auf SSD Speicher zu setzen?
    Zu Hardware Anforderungen für derartig gestaltete Mailserver findet man interessanterweise fast nichts. Mit jeder Wald und Wiesen Maschine dürfts dem Test nach aber aufgrund von amavis und clamav nicht funktionieren. Hast du, oder jemand der mitliest, einen Rat parat? Was sind die entscheidenden Faktoren bei der Performance? Anzahl der Mailboxen, Anzahl der E-Mails? Sind bei zu kleiner/langsamer Dimensionierung Instabilitäten und Verlust von E-Mails und Daten zu erwarten oder dauern Zustellung und Empfang einfach nur länger? Oder ist das in dieser Größenordnung alles schnurz :D?

    1. André P. Autor

      Hi Chris,
      der Flaschenhals eines Mailservers ist immer die Diskperformance. Allerdings noch nicht bei 3-5 Mailboxen. :-) Woran die meisten sehr sehr günstigen VPS scheitern, wird allerdings – wie du schon gemerkt hast – der Content-Scanner sein (ClamAV, SA etc.). Mit einem GB RAM (oder 1,5), bist du schon sehr gut unterwegs. SSD ist natürlich nie verkehrt, jedoch möchte ich dir da auch nichts vormachen, HDD reicht für deine Belange noch aus. Bis du auf die ersten Grenzen stößst, braucht es schon 50-60 aktiv genutzte Mailboxen – wenn nicht noch mehr.
      Ich habe seit ein paar Monaten mein kleines KVM-Hosting servercow.de am laufen, vielleicht magst du es dir mal anschauen. Individuelle Angebote sind gar kein Problem.

      Beste Grüße und vielen Dank für deine netten Worte,
      André

      1. Chris

        Hi André,
        ist einfach genial wie du dich um deinen Blog kümmerst und auch hier noch Fragen beantwortest, da sitzt das PayPal Passwort gleich ganz locker :).
        servercow.de hab ich mir angesehen, das Angebot finde ich sehr gut – und es könnte hier auf debinux.de meiner Meinung nach viel prominenter beworben werden :D.
        Eine Frage hab ich noch: Gibts bestimmte Gründe warum du fürs „Frontend“ des Mailservers auf nginx setzt? Macht der mit anderen diversen Mailserver bezogenen Webtools (ich hab AfterLogic Webmail Pro im Auge) eine bessere Figur? Oder sinds die üblichen Gründe wie Performance, kleinerer Footprint im System, oder einfach persönliche Neigung zu nginx anstatt Apache?
        Ich arbeite beruflich hauptsächlich mit Apache und bin mit dessen Konfiguration und Features natürlich besser vertraut als mit nginx (wer hat mir die .htaccess geklaut?!?). Für den Mailserver wirds zwar bei nginx bleiben, der hat seine Chance verdient. Sollte ich dennoch mal zum altbewährten Apache wechseln, erwartet mich böses?

        Beste Grüße, Chris

        1. André P. Autor

          Hi Chris,
          zur Zeit komme ich leider nicht soo viel zum Schreiben, wie ich es mir wünschen würde. :-( Aber vielen Dank! :-)
          Du kannst in der mailcow.config von „nginx“ auf „apache2“ umstellen. Ich teste es seit einer Weile immer mit beiden HTTPds. Aber ja, Nginx ist – zugegeben – mein persönlicher Vorzug. :-)
          Servercow möchte ich den Menschen nicht unter die Nase reiben. Ich finde es schön, wenn Leute es weiterempfehlen, weil es ihnen gefällt. So funktioniert das ganz miteinander auch viel besser. Übrigens geht auch viel Zeit in den Support von Servercow. Standardantworten gibt es (fast) gar nicht. :-)

          Viele Grüße
          André

  88. Kai

    Hallo,
    erstaml danke für die Super Anleitung.
    Ich habe ein Problem mit der Anmeldung bei Roundcube.
    Wenn ich mich einloggen möchte bekomme ich immer folgenden Fehler.

    Warning: stream_socket_client(): unable to connect to ssl://webmail.example.com:993 (Verbindungsaufbau abgelehnt) in /var/www/html/webmail/program/lib/Roundcube/rcube_imap_generic.php on line 858
    IMAP Error in /var/www/html/webmail/program/lib/Roundcube/rcube_imap.php (198): Login failed for postmaster@example.com from 192.168.1.1. Could not connect to ssl://webmail.example.com:993: Verbindungsaufbau abgelehnt

    1. André P. Autor

      Hi Kai,
      versuchst du es mal mit „tls://x.y.z“ in der Datei /var/www/html/webmail/config/config.inc.php, wo jetzt noch ssl://x.y.z steht? Der SSL-Listener ist evtl. gar nicht aktiv (Port 993), jedoch IMAP und IMAP nach STARTTLS.

  89. Dennis C.

    Ich bin ratlos….
    Leider ist es mit der angegebenen amavis-config so, dass sämtliche Mails direkt nach „Postmaster“ verschoben werden und nicht etwa als „****SPAM****“ markiert. So ist es gekommen, dass mehrere Rechnungen und andere Mails einfach zu Postmaster geschoben wurden und nicht – ob Spam oder nicht – beim eigentlichen Mailaccount.

    Kann mir jemand helfen?

    1. Dieter Haferkorn

      Hallo,

      könnte man noch zusätzlich erklären welche Eintragungen bei einem sicheren BackupMX erforderlich oder weggelassen werden können? Als Basis dient die komplette obige Installation, jedoch als ‚backup-mx.domain.tld‘.

      MFG

  90. Marcel

    Hallo Andrè,

    Ich habe es rausgefunden, vielleicht kannst du es ja bestätigen. Einfach in Vimbadmin eine Domain anlegen und die DKIM Einstellungen, sowie DNS Einträge anpassen. Schon kann gemailt werden …

    Mit ist beim testen der SPAM Funktion ein Problem aufgefallen, dass du ggf. in deinem Skript anpassen kannst.

    In der Datei /etc/amavis/conf.d/20-debian_defaults sind folgende default-values gesetzt, die du in deiner /etc/amavis/conf.d/50-user nicht anpasst.

    $sa_tag2_level_deflt = 6.31
    $sa_kill_level_deflt = 6.31

    Das führt dazu, dass Spam anhand deines Sievescript unter /var/vmail/before.sieve niemals nach „Junk“ verschoben wird, sonder gleich gelöscht.

    Folgender Eintrag in /etc/amavis/conf.d/50-user löst das Problem:
    $sa_kill_level_deflt = 999

    Kannst du das so bestätigen?

  91. Marcel

    Hallo André,
    Nochmals vielen Dank für dein tolles How-To. Die meisten values und Einstellungen kann ich nachvollziehen und verstehen, sodass das Abarbeiten echt Spaß macht. Besonders gut gefällt mir, dass du einen starken Fokus auf Sicherheit legst!

    Ich habe einen V-Server von netcup erstmal mit seinem default Domainname eingerichtet: v22015092657327610.yourvserver.net
    Sodass theoretisch mit dieser Domain Mails versendet und empfangen werden könnte.

    Wie füge ich nun weitere Domain hinzu, die über diesen Server abgedeckt werden sollen?

  92. Marcel

    Ich musste in /etc/nginx/sites-enabled/mailserver folgendes Eintragen, da ich die URL https://mail.domain.tld/admin nicht öffnen konnte, bzw. nur eine weiße Seite gesehen habe.

    location ~ \.php$ {
    # Prevent Zero-day exploit
    try_files $uri =404;

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    #NOTE: You should have „cgi.fix_pathinfo = 0;“ in php.ini

    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }

  93. Alex

    Hi Andre,

    ich danke dir für das Tutorial – echt super, hat mir gut weitergeholfen!
    Kennst du https://starttls.info? Wenn ich meinen Server nach der Konfiguration in deinem Beitrag teste, werden 2 Warnungen angezeigt:

    – Anonymous Diffie-Hellman is accepted. This is suspectible to Man-in-the-Middle attacks.
    – Weakest accepted cipher: 0.

    Könnte man das noch fixen?
    Danke schonmal & viele Grüsse
    Alex

    1. André P. Autor

      Hi Alex,
      danke!
      Fügst du deiner main.cf einmal Folgendes hinzu? ->

      smtpd_tls_exclude_ciphers = aNULL, DES, RC4, MD5
      smtpd_tls_mandatory_exclude_ciphers = aNULL, DES, RC4, MD5
      

      Das sollte es schon beheben. Kannst du das bestätigen?

      Beste Grüße,
      André

  94. Dennis2

    Hallo André,

    mir ist aufgefallen, dass das versenden einer mail immer mindestens 5 sekunden dauert. der prozess „delivering mail“ alleine dauert schon mindestens 5 sekunden. Hast du eine Ahnung, woran das liegen könnte? Bei meinem eMail account der über einen Webhost läuft, dauert der gesamte prozess des sendens nichtmal 2 sekunden.

    Vielen Dank und beste Grüße,
    Dennis

    1. André P. Autor

      Hi,
      das liegt daran, dass Amavis die Mail „live“ überprüft. Das ist durchaus die bessere Wahl!
      So wird Spam gar nicht erst vom SMTPd angenommen, Postfix sagt dir sozusagen „ich schaue schnell nach, ob es Spam ist“. Ein gewöhnlicher Filter nimmt die Mail erst an (bzw. der SMTPd nimmt sie an) und gibt sie anschließend weiter zur Überprüfung.
      So weißt du auch sofort, ob deine ausgehende Mail als Spam erkannt wird – jedenfalls von deinem eigenen System. :-)

  95. Carsten

    Hallo zusammen,

    kann mir jemand weiterhelfen?

    Ich bin inzwischen etwas ratlos. Ich setze gerade meinen Mailserver nach dieser Anleitung neu auf. Wegen einer unverträglichkeit muss ich dabei aber apache als Webserver nehmen. Nun habe ich ein Problem. Wenn ich das erste mal versuche auf vimbadmin zuzugreifen, bekomme ich die Fehlermeldung „File does not exist: /var/www/html/vimbadmin“ im error.log.

    Ich habe mich bei der Konfig des Apache an den Beitrag von Tantalus gehalten.
    Der vHost in der apache Konfiguration sieht bei mir so aus:

    Servername example.org
    Redirect permanent / https://example.org/

    SSLEngine on
    SSLCertificateFile /etc/ssl/example.de.cer
    SSLCertificateKeyFile /etc/ssl/example.de.key
    # Intermediate Zertifikat
    # SSLCertificateChainFile /etc/ssl/sub…ca.pem
    # Root Zertifikat
    # SSLCACertificateFile /etc/ssl/ca.pem

    Servername example.org
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ErrorLog ${APACHE_LOG_DIR}/error.log
    DocumentRoot /var/www/html

    HostnameLookups Off
    UseCanonicalName Off
    ServerSignature Off
    Header always set Strict-Transport-Security „max-age=10886400“

    SSLRequireSSL
    Options FollowSymLinks
    AllowOverride FileInfo Indexes Limit

    Allow from all
    DirectoryIndex index.php index.html index.htm

    Kann mir bitte jemand weiterhelfen? Ich steh total auf dem Schlauch…

    Grüße

    1. Carsten

      Hallo @all,

      nach endlich vielen Versuchen hab ich es jetzt geschafft die VimbAdmin-Seite zu bekommen. Man muss die RewriteRule in der .htaccess im admin-Verzeichnis von vimbadmin etwas ändern und zwar:

      Diese Zeile auskommentieren oder löschen und durch die zweite Zeile ersetzen:

      #RewriteRule ^.*$ /vimbadmin/index.php [NC,L]
      RewriteRule ^.*$ /admin/index.php [NC,L]

      Dann klappts auch mit dem Apache ;-)

      Grüße

  96. Armin

    Hallo André,

    vielen Dank für diese tolle Anleitung.

    Ich bin gerade dabei einen vServer damit einzurichten, habe aber noch einige Fragen, wie es mit der Absicherung der einzelnen Dienste im Internet aussieht.
    Der vServer soll meine E-Mailserver und mein Webserver werden. Über eine Firewall werden nur die absolut nötigen Ports freigegeben.
    Eigentlich wollte ich außer Postfix, Dovecot, ssh und meiner Website unter Apache keine anderen Dienste von außen zugreifbar haben. Wie sicher ist das denn, den VimbAdmin und Roundcube zusätzlich laufen zu haben? Und was muss ich alles anpassen, um von nginx auf apache zu wechseln?

    Sorry für die teilweise vielleicht etwas „einfachen“ Fragen. Aber ich kenne Vimbadmin, nginx und roundcube noch nicht so gut und will mir keine großen Risiken einfangen. Normalerweise beschränke ich die offenen Ports und laufenden Dienste eines Servers auf das absolut notwendige.

    Vielen Dank nochmal für Deine Mühe.

    Grüße,
    Armin

    1. André P. Autor

      Hi,
      solange du die Dienste und Webanwendungen aktuell hälst, sehe ich kein Problem. ViMbAdmin und Roundcube sollten vor Robots geschützt werden, damit – falls es mal Lücken gibt – keiner so schnell auf die Idee kommt…
      Ansonsten könntest du bestimmte Verzeichnisse auch nur von bestimmten IPs zugreifbar machen (http://httpd.apache.org/docs/2.4/howto/access.html). :-)
      Zu Apache gibt es hier bereits Kommentare, bislang habe ich den Artikel nicht erweitern können, aber das folgt.

      Beste Grüße
      André

  97. Markus Abheiden

    Hi André,

    ich habe ein Deb 8er-System. Auf dem habe ich bisher immer mit deiner alten Anleitung gearbeitet.
    Ich habe nun alles auf diese neue Technik umgestellt, ist das denn besser?
    Bzw. würdest du mir eher zu dieser Technik raten (vimbadmin + nginx und Co.) als zu deiner damaligen welche eine Realisierung über postfixadmin versprach?

    Viele Grüße,
    Markus Abheiden

  98. Stuck

    Hi,
    habe eine Installation nach Ihrer Anleitung gemacht und bekomme beim Versenden einer e-Mail folgenden Fehler:
    ….. dsn=4.4.1, status=deferred (delivery temporarily suspended: connect to ………….[privat/dovecot-lmtp]: No such file or directory).

    Können Sie mir sagen was ev. die Ursache dafür ist? (Habe schon einiges im WEB gefunden, nichts hat gezogen!).
    Vielen Dank
    Stuck

    1. Stuck

      Hallo André,
      vielen Dank für die schnelle Hilfe, war mein Fehler hab ich nicht gesehen!
      Irgendwie bekomme ich aber trotzdem noch keine Verbindung zur Datenbank beim Aufruf von WEBMAIL:
      https://192.168.32.104/webmail
      DATABASE ERROR: CONNECTION FAILED!
      Unable to connect to the database!

      Auch kann ich mir selbst von dem System keine Mail zustellen lassen (echo test | mailx -s test xxxxx), in die „freie Welt“ kann ich mailen und bekomme auch die Begrüßungsmail von Vimbadmin.
      dovecot: lmtp(19494, xxxx@xxxxx): Fatal: setgid(2000 from userdb lookup) failed with euid=5000(vmail), gid=5000(vmail), egid=5000(vmail): Operation not permitted (This binary should probably be called with process group set to 2000 instead of 5000(vmail))
      Jul 31 10:48:54 xxxxxx postfix/lmtp[19491]: 18FC481A0A: to=, relay=xxxxxx[private/dovecot-lmtp], delay=87739, delays=87739/0.06/0.1/0.05, dsn=4.4.2, status=deferred (lost connection with xxxxxx[private/dovecot-lmtp] while sending end of data — message may be sent more than once)

      Hast Du ev. eine Idee was ich hier falsch gemacht haben könnte?
      Gruß
      Stuck

  99. Dennis2

    Guten Abend André,

    ich habe ein weiteres Problem. Login per roundcube ist nicht möglich, folgende Fehlermeldung wird zurückgegeben:

    Connection to storage server failed.

    Im roundcube error log steht folgendes

    [29-Jul-2015 00:40:59 Europe/Berlin] PHP Warning: stream_socket_client(): unable to connect to mail.meinedomain.de:143 (Connection refused) in /var/www/html/webmail/program/lib/Roundcube/rcube_imap_generic.php on line 858
    [29-Jul-2015 00:33:18 +0200]: IMAP Error: Login failed for test@meinedomain.de from 123.45.678.90. Could not connect to mail.meinedomain.de:143: Connection refused in /var/www/html/webmail/program/lib/Roundcube/rcube_imap.php on line 198 (POST /webmail/?_task=login?_task=login&_action=login)

    Am firewall scheint es nicht zu liegen (nutze csf), den habe ich nämlich testweise ausgeschaltet, bekomme aber weiterhin die Meldung \“Connection to storage server failed.\“

    Vielleicht weisst du ja, woran es noch liegen könnte? Viele Grüße

    1. André P. Autor

      Hi Dennis,
      ehrlich gesagt habe ich dennoch die FW im Verdacht. :-)
      Versuchst du es mal über localhost?

      nano /var/www/html/webmail/config/config.inc.php

      Dort:

      $config['default_host'] = 'tls://127.0.0.1';
      $config['smtp_server'] = 'tls://127.0.0.1';

      Hast du Verbindungen von „lo“ freigegeben?
      Viele Grüße
      André

      1. Dennis2

        Danke! Deine Vermutung war richtig. Ich habe mit

        nc -z 127.0.0.1 143; echo $?

        geprüft ob der port offen ist und trotz deaktivierung von csf war er zu.

        Aus irgendeinem Grund haben die Einstellung in csf.conf nicht gegriffen, scheinbar waren andere firewall einstellungen aktiv auf die ich keinen Einfluss nehmen konnte.

        Die Lösung war simpel. Neustart des Servers und jetzt klappt alles wunderbar. Die erste email wurde erfolgreich verschickt und die Antwort problemlos empfangen!

        Vielen Dank und beste Grüße,
        Dennis

  100. Dennis2

    Hallo André

    ich habe vor einigen Monaten dein voriges Mailserver tutorial unter wheezy angewendet und alles hat wunderbar geklappt. Vielen Dank dafür. Heute musste ich den Server mit Jessie neu aufsetzen und habe mich gefreut, eine Neuauflage des Artikels auf deinem Blog zu finden.

    Leider funktioniert es bei mir aber nicht. Ich kann zwar bei ViMbAdmin eine neue domain anlegen, aber sobald ich für diese domain eine Mailbox anlegen möchte, bekomme ich folgende Fehlermeldung:

    ViMbAdmin_Exception

    File
    /srv/vimbadmin/library/ViMbAdmin/Dovecot.php

    Line
    57

    Message
    Error executing Dovecot password command: /usr/bin/doveadm pw -s ‚SHA512-CRYPT‘ -u ‚admin@domain.de‘ -p ‚OdKH5EQXVJgD‘

    Code
    0

    Trace
    #0 /srv/vimbadmin/vendor/opensolutions/oss-framework/src/OSS/Auth/Password.php(90): ViMbAdmin_Dovecot::password('SHA512-CRYPT', 'OdKH5EQXVJgD', 'admin@domain...')
    #1 /srv/vimbadmin/application/controllers/MailboxController.php(317): OSS_Auth_Password::hash('OdKH5EQXVJgD', Array)
    #2 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Action.php(516): MailboxController->addAction()
    #3 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch('addAction')
    #4 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
    #5 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application/Bootstrap/Bootstrap.php(105): Zend_Controller_Front->dispatch()
    #6 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application.php(384): Zend_Application_Bootstrap_Bootstrap->run()
    #7 /srv/vimbadmin/public/index.php(34): Zend_Application->run()
    #8 {main}

    Weisst du zufällig, woran das liegen könnte?

    1. André P. Autor

      Hi,
      führst du einmal diesen Befehl im Terminal aus?

      sudo -u www-data doveadm pw -p 123

      Zudem einmal die Rechte der Datei /etc/dovecot/dovecot.conf checken/anpassen, evtl. ist diese Datei für www-data nicht lesbar:

      chmod 644 /etc/dovecot/dovecot.conf

      Danke für deinen netten Kommentar! :-)

      1. Dennis2

        Hi,

        der Befehl spuckt folgende Fehlermeldung aus:


        doveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf: mailbox Gelöschte Objekte: name isn't valid UTF-8

        Habe mal nachgeschaut und gesehen, dass dort statt ‚ö‘ die Zeichenfolge ‚^ ‚ zu sehen ist. Nachdem ich das ‚ö‘ von ‚gelöschte‘ und das ‚ü‘ von ‚Entwürfe‘ in ‚oe‘ und ‚ue‘ geändert habe, gibt mir dein Befehl folgendes aus:

        {CRAM-MD5}8f48a311793d494b53ad488bb603f93a0457e40fe45cbacb082c0720ceeb1e37

        edit:
        Klasse und jetzt kann ich auch Mailboxen erstellen, ohne dass eine Fehlermeldung kommt! Tausend Dank für Deine schnelle Hilfe:)

  101. Marc Stürmer

    Eine Anmerkung zu DKIM: DKIM ist ja heutzutage Teil des Zoos DKIM, SPF und OpenDMARC. Diese Dienste bauen aufeinander auf.

    DKIM sorgt für eine Signatur jeder ausgehenden Email und kann die Signatur eingehender Emails überprüfen, SPF legt fest, über welche Mailexchanges eine Domain ihre Mails verschickt und OpenDMARC legt dann für externe Hosts eine Richtlinie fest, wie sie mit Mails verfahren sollen, bei denen entweder der Key nicht stimmt oder aber der MX oder beides.

    Die ganze Übung dient genau einer Sache, nämlich, die eigene Domäne für Mailspammer uninteressant zu machen und vor Spammißbrauch durch Dritte zu schützen. Sollte man also blafasel.de haben und ein Spammer verschickt damit Emails, dann kann man damit dafür sorgen, dass ihm das Absetzen seiner Emails deutlich schwerer wird. Das ist dann aber auch schon alles, damit der Schutz der eigenen Domäne vor solchem Mißbrauch wirklich gut greift, müsste es deutlich mehr verbreitet sein, als es eigentlich ist. Wenn man für seine Domäne das implementiert, dann kann man beispielsweise wenn jemand Road Warrior spielt oder einige andere Fälle nutzt, auch mit SPF viel falsch machen – und nein, SRS ist dazu keine Lösung.

    Umgekehrt aber ist der ganze Zoo aber meist denkbar ungeeignet, um Spams sorgfältig zu filtern. Denn die Spammer benutzen entweder Domänen ohne solchen Schutz oder gleich eigene Domänen – und jetzt kommt es – diese Mülldomänen sind oft vorbildlich mit DKIM signiert! DKIM sagt eben nur aus, dass die Email auch wirklich aus dieser Domäne stammt, sagt aber absolut nichts darüber aus, ob diese Email nun Spam oder Ham ist.

    Wer übrigens gerne Firewallregeln schreibt, für den ist Postfwd (http://postfwd.org/) als Policy Manager zum Spamschutz sicherlich auch nicht ganz uninteressant.

  102. x-dast

    Ich nochmal. Soweit läuft jetzt alles und Senden und Empfangen von E-Mails ist auch möglich. Allerdings nur über Roundcube. Wenn ich mich per Thunderbird verbinden will, bekomme ich folgende Meldung im mail.log:

    Jul 17 22:10:04 mail dovecot: imap-login: Disconnected (no auth attempts in 0 secs): user=, rip=IP, lip=IP, TLS: SSL_read() failed: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca: SSL alert number 48, TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)

    Thunderbird gibt die Meldung aus, dass die Authentifizierungsmethode nicht unterstützt wird. Eingestellt ist „Passwort, normal“. Was muss da im Thunderbird eingestellt werden oder muss ich am dovecot noch was ändern? Einstellungen sind wie im Beitrag beschrieben.

    1. André P. Autor

      Hi,
      den Zertifikatsfehler (selbst-signiert) hast du „akzeptiert“? Der versteckt sich nämlich gerne mal im Hintergrund.
      Eingestellt werden muss/sollte STARTTLS auf Port 587 und IMAP ebenso via STARTTLS auf Port 143.
      Am besten noch einmal das TB Profil komplett löschen (aus Appdata oder /home/$user/.mozilla etc.) und noch einmal neu einrichten. Kannst du mir den Servernamen einmal per Mail senden?

  103. Holger

    Hallo,
    irgend wie bekomme ich es nicht zum laufen…
    Wenn ich aus dem Webmail eine Mail versenden möchte, erhalte ich diese Fehlermeldung:
    SMTP Fehler (451): Der Empfänger "xxx@xxx.de" konnte nicht gesetzt werden (4.3.0 : Temporary lookup failure).
    Und ein tail -f /var/log/mail.log zeigt dieses
    Jul 17 15:21:35 thor postfix/trivial-rewrite[2403]: warning: mysql:/etc/postfix/mysql/postfix-mysql-virtual_transport_maps.cf lookup error for "*"

      1. Holger

        Hallo André,

        kleiner Fehler, große Wirkung. Ich hab in der postfix-mysql-virtual_domains_maps.cf ein „‚“vergessen und damit hat es nicht funktioniert. Bei der Suche nach dem Fehler hab ich in den Dateien unter postfix/mysql aus 127.0.0.1 localhost gemacht. Und damit hatte mein Postfix offenbar ein Problem. Ich habe es nun wieder auf 127.0.0.1 (ohne Leerzeichen nach der 1) geändert, die Dienste alle neu gestartet und es funktioniert.

        DANKE

  104. x-dast

    Hallo,

    ich habe beim Setup von vimbadmin alles laut Anleitung konfiguriert. Allerdings kommt beim Aufruf im Browser dann nur „bootstrap() ->run();“, anstatt die Oberfläche von vimbadmin. Das Verzeichnis /srv/vimbadmin/public und var, gehören dem richtigen Benutzer und haben die Rechte 750.

    Wenn ich vimbadmin direkt im Verzeichnis des entsprechenden Benutzers (z. B. /var/www/user/http/vimbadmin) installiere, läufts (mit komplett den gleichen Einstellungen). Muss beim Apache noch was beachtet werden? Habe in der vhost folgendes noch eingetragen:

    Alias /vimbadmin /srv/vimbadmin/public

    Options FollowSymLinks
    AllowOverride FileInfo
    all granted

  105. Paul

    Irgendwie will bei mir Dovecot nicht. Anmelden über Roundcube läuft leider nicht. Errorlog von Roundcube sagt nur folgendes aus:
    IMAP Error in /var/mailstuffs/webmail/program/lib/Roundcube/rcube_imap.php (198): Login failed for me@mail.domain.tld from AUTHENTICATE PLAIN: Authentication failed.

    In Mail.log findet sich auch nur, das Dovecot selber ablehnt. Wenn man dann IMAP Debug hinzufügt, dann kommt folgendes aus dem IMAP Errorlog raus:
    [00DB] S: * OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
    [00DB] C: A0001 STARTTLS
    [00DB] S: A0001 OK Begin TLS negotiation now.
    [00DB] C: A0002 CAPABILITY
    [00DB] S: * CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAIN AUTH=LOGIN
    [00DB] S: A0002 OK Pre-login capabilities listed, post-login capabilities have more.
    [00DB] C: A0003 ID (\“name\“ \“Roundcube\“ \“version\“ \“1.1.2\“ \“php\“ \“5.6.9-0+deb8u1\“ \“os\“ \“Linux\“ \“command\“ \“/webmail/installer/index.php?_step=3\“)
    [00DB] S: * ID (\“name\“ \“Dovecot\“)
    [00DB] S: A0003 OK ID completed.
    [00DB] C: A0004 AUTHENTICATE PLAIN ****** [41]
    [00DB] S: A0004 NO [AUTHENTICATIONFAILED] Authentication failed.

    Empfangen & senden von Lokal aus geht aber ohne Probleme. Passwort ist das, welches auch über vimbadmin gesetzt wurde. Hast du vielleicht ne Idee, woran es liegen könnte?
    (Mail.domain.tld ist natürlich meine, also nicht wirklich mail.domain.tld)

    Dennoch danke für den Artikel!
    Gruß,
    Paul

    1. André P. Autor

      Hi,
      kannst du die letzten Zeilen der /var/log/mail.log auf pastebin etc. hochladen?
      Alternativ gerne auch einen SSH-Zugang via Mail. :-) Habe gerade etwas Zeit, wenn du magst.
      Viele Grüße
      André

  106. netlord

    Hi – ich wollte nur fragen wieso du den PHP-Composer verwendest?
    Nur weils in der Vorlage auch so ist?

    Roundcube ladest auch als Paket runter – das gibts von ViMbAdmin auch!
    Und curl ist schon installiert……

  107. Sayael

    Hallo André,

    Dein HowTo finde ich super!
    Ich habe da aber noch ne Frage, ist es möglich in der Config policys zu verwenden?
    Ich habe einen lokalen Mailserver, der den Postfixserver als Smarthost nutzt, nun verbietet „reject_authenticated_sender_login_mismatch“ ja das verweden eines Accounts für beliebige Absender das würde ich auch für alle normalen User gerne weiterhin verwenden jedoch nicht für den User des Smarthostes.

    LG,
    Sayael

    1. André P. Autor

      Hi Sayael,
      endlich habe ich wieder mehr Zeit für die Antworten. :-)
      Danke erst einmal!

      Probier mal Folgendes:
      /etc/postfix/main.cf:

      smtpd_sender_restrictions = [...],
        check_sasl_access hash:/etc/postfix/check_sasl_access,
        [...]

      /etc/postfix/check_sasl_access:

      smarthostuser@domain.tld	reject_sender_login_mismatch
      

      Anschließend:

      postmap /etc/postfix/check_sasl_access
      postfix reload

      Ich kann es dir leider nicht garantieren, es sollte aber funktionieren. :-)

      Viele Grüße
      André

      1. Sayael

        Hallo André,

        Danke für die schnelle Antwort :-)

        Ich habe es jetzt mit folgenden Einstellungen ans laufen bekommen:

        /etc/postfix/main.cf
        smtpd_sender_restrictions = check_sasl_access hash:/etc/postfix/check_sasl_access, reject_authenticated_sender_login_mismatch,

        /etc/postfix/check_sasl_acces
        smarthost@domain.tld ok

  108. Dennis

    Mir ist aufgefallen, dass diese VimbAdmin Installation Memcached nicht mit einbezieht. Jedoch empfiehlt OpenSolutions Memcached wärmstens für VimbAdmin und auch ich kann von meiner Installation sagen, dass VimbAdmin so deutlich schneller funktioniert.

    Folgende Pakete installieren:

    apt-get install php5-memcache memcached

    Dann in der application.ini folgendes ändern:

    ;resources.doctrine2cache.type = ‚ArrayCache‘
    resources.doctrine2cache.type = ‚MemcacheCache‘
    resources.doctrine2cache.memcache.servers.0.host = ‚127.0.0.1‘
    resources.doctrine2cache.namespace = ‚ViMbAdmin3

    Auch wird über einen Memcache-Glitch in VimbAdmin berichtet, den man folgend beheben kann (Quelle: RtCamp). Ich weiss allerdings nicht, ob er schon behoben wurde, ich muss mir noch die Changelogs anschauen:

    ;resources.session.save_path = APPLICATION_PATH „/../var/session“

    Hoffe ich konnte helfen ^^

      1. Dennis

        Ja, absolut ^^
        So läuft VimbAdmin deutlich schneller, besonders, wenn man Änderungen an den Configs vornimmt, wie z.B. :

        ./srv/vimbadmin/bin/vimbtool.php -a mailbox.cli-get-sizes

        zum Anzeigen des aktuellen Speicherplatzverbrauchs der jeweiligen Mailboxen. Passend dazu noch ein Cronjob mit dem selben Befehl eintragen.
        Hier hat die „normale“ Cache sich nach der Änderung fast 1 Minute Zeit gelassen (Chromium), danach nicht mehr.
        Mit memcache lief alles „instant“.

        Vielleicht kann ich dir ja ein Testacc zur Verfügung stellen, wenn du willst ^^

        Ansonsten wie gehabt. Server läuft auf einem PHP-Friends VSERVERS mit 1GB RAM. Muss irgendwann mal upgraden, denn es legt mit dem Debian8-Standardkernel ordentlich SWAP an, mit dem aktuellen 4.1 hat sich das zumindest verringert. An der Geschwindigkeit an sich stellt sich aber kein Problem heraus.

        Viele Grüsse

      2. Dennis

        Kleiner Edit:
        Damit das mit den Anzeigen der Mailbox-Grössen funtkoniert: noch folgendes in der application.ini eintragen (Quelle: VimbAdmin-Wiki)

        defaults.list_size.disabled = false
        defaults.list_size.multiplier = ‚GB‘

        Viele Grüsse

  109. Joe

    Hallo André,

    vielen Dank für dieses großartige HowTo!

    Eine kleine Anmerkung hätte ich noch:

    In Deinem ngingx-Tutorial schreibst Du
    Für alle Sockets sollten zudem kritische Funktionen zum Ausführen von Anwendungen deaktiviert werden. Diese können für einzelne Sockets bei Bedarf freigegeben werden:
    /etc/php5/fpm/php.ini:
    disable_functions=phpinfo,exec,shell_exec,system,passthru>

    Das deaktivieren von exec sollte bei diesem Setup hier vermieden werden. Es führt dazu, daß ViMbAdmin die User-Passwörter in der MySQL-Datenbank nicht mehr setzen/aktualisieren kann.

    Viele Grüße,
    Joe

  110. Hans-Werner Arndt

    Moin
    Ich habe leider Probleme beim Einrichten von vimbadmin.
    Mein Mailserver heißt mailserver.hwarndt.int (Testumgebung). DNS-technisch wird er auch aufgelöst.
    Beim Aufruf von https://mailserver.hwarndt.int/ erscheint die Startseite von Roundcube.
    Beim Aufruf von https://https://mailserver.hwarndt.int/admin bekomme ich folgenden Fehler
    „The requested URL /admin/auth/login was not found on this server“
    das public-verzeichniss von Vimbadmin ist in mein mailserververzeichniss verlinkt; die rechte hat www-data.
    In der application.ini in der sektion server.webmail.host ist der Name von meinem mailserver eingetragen.
    Hast du eine Idee wo der Fehler liegen könnte?
    Viele Grüße

  111. Patrick

    Hallo,

    da sendmail den 25er Port blockiert, kann ich es bedenkenlos stoppen bzw. den Port von sendmail selbst ändern? Denn Postfix möchte nicht starten, wenn der Port 25 geblockt wird.

    MfG,
    Patrick

    1. Patrick

      Ich sitze hier schon seit über 8 Stunden, und habe den Server mehrmals schon aufgesetzt und komme jedes mal nicht weiter… immer ist ein anderes Problem, jetzt kotzt es mich schon an … Wieso löscht sich sendmail nicht?

  112. Holger

    Hallo,
    ich scheiter bereits am ViMbAdmin.

    Bei der Einrichtung der Datenbank bekomme ich diese Fehlermeldung…

    ./bin/doctrine2-cli.php orm:schema-tool:create
    PHP Fatal error: Uncaught exception ‚Zend_Config_Exception‘ with message ’syntax error, unexpected BOOL_FALSE in /srv/vimbadmin/application/configs/application.ini on line 459
    ‚ in /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Config/Ini.php:182
    Stack trace:
    #0 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Config/Ini.php(202): Zend_Config_Ini->_parseIniFile(‚/srv/vimbadmin/…‘)
    #1 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Config/Ini.php(126): Zend_Config_Ini->_loadIniFile(‚/srv/vimbadmin/…‘)
    #2 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application.php(404): Zend_Config_Ini->__construct(‚/srv/vimbadmin/…‘, ‚production‘)
    #3 /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Application.php(87): Zend_Application->_loadConfig(‚/srv/vimbadmin/…‘)
    #4 /srv/vimbadmin/bin/utils.inc(106): Zend_Application->__construct(‚production‘, ‚/srv/vimbadmin/…‘)
    #5 /srv/vimbadmin/bin/doctrine2-cli.php(53): get_zend_application()
    #6 {main}
    throw in /srv/vimbadmin/vendor/zendframework/zendframework1/library/Zend/Config/Ini.php on line 182

    Hat jemand eine Idee?

    Danke
    Holger

            1. Holger

              Hallo,
              ich habe die application.ini gelöscht und neu gebaut, war sicher ein Fehler drin nur leider mit Sicherheit nicht in der Nähe von Zeile 459.

              Jetzt funktioniert es ;-)

              Holger

  113. Stefan

    Um auch andere Domains DKIM zu signieren muss man in der /etc/amavis/conf.d/50-user
    die Zeile dkim_key('domain.tld', 'default', '/var/lib/amavis/db/dkim_domain.tld.key'); kopieren und beide domain.tld entsprechend anpassen.

    Danach noch den Schlüssel wie in der Anleitung beschrieben erstellen:
    amavisd-new genrsa /var/lib/amavis/db/dkim_domain.tld.key 2048

    Jetzt noch Amavis mit service amavis restart neustarten und mit amavisd-new showkey domain.tld den public key auslesen, bzw mit folgendem Quickie in ein Copy&Paste Format bringen:
    amavisd-new showkey domain.tld | grep \" | sed 's/[ ")]//g' | tr -d "\n" && echo

  114. Stefan

    Vielen Dank für das tolle Tutorial, noch zwei Anmerkungen:

    Das erste wurde bereits mal erwähnt:
    chown root:vmail /etc/dovecot/dovecot-mysql.conf
    Schlägt fehlt weil die Gruppe „vmail“ erst ein paar Zeilen später angelegt wird.

    nano /etc/postfix/master.cf
    Hier ist es nicht ganz klar ob der gesamte Inhalt der Datei ersetzt werden soll oder nur die aufgeführten Settings, da an den anderen Stellen immer vorher ein rm DATEI gemacht wird.

  115. Andy

    Absolutely create article! Thanks a lot for that. Could you please add some info about how to add a catchall address?
    I think I found the answer, but I have just started to play around with my own mail server and would be very happy if you could explain it in the same detailed way you have done it in that article.

    This is what I found (the comment of Joshua Gleitze)
    https://thomas-leister.de/internet/postfix-catch-fuer-nicht-existierende-postfaecher/

    Thanks a lot again!
    Andy

    1. Andy

      Wieso schreib ich eigentlich auf Englisch?
      Falls noch wer eine Catchall einrichten möchte: es ist eh ganz einfach im vimbAdmin, heißt nur nicht so. Einfach unter Aliases @domain.tld -> postfach@domain.tld und schon gehts.

      Vielen Dank und weiter so!! :)

  116. Andreas

    Hi André,

    vielen Dank für diese tolle Anleitung.
    ist es möglich mit dieses konstrukt auch ein Multi Domain system zu betreiben ?
    Muss in dieser Hinsicht was beachtet werden ?

    Mit freundlichen Grüßen
    Andreas

  117. Hans-Dieter Wätsch

    Weißt du ob es möglich ist die Sieve Filter im Thunderbird durch das Sieve Addon zu bearbeiten?
    Ich habe deine Anleitung befolgt, aber konnte bisher keine Verbindung zu Sieve herstellen. Über Roundcube funtkioniert es.

    1. André P. Autor

      Hi,
      es ist möglich. :-) Hast du im Thunderbird Port 4190 angegeben?
      Hast du mit diesem Befehl eine Ausgabe? netstat -tulpen | grep 4190
      Steht dort 0.0.0.0? Ist die Firewall offen? Kannst du zum Beispiel von einem fremden System mit „telnet ip.mail.ser.ver 4190“ testen. :-)
      Viele Grüße

      1. Hans-Dieter Wätsch

        Danke für deine schnelle Hilfe.
        netstat -tulpen | grep 4190 liefert:
        tcp 0 0 0.0.0.0:4190 0.0.0.0:* LISTEN 0 64228 4265/dovecot
        Per telnet bekomme ich folgende Ausgabe:
        "IMPLEMENTATION" "Dovecot Pigeonhole"
        "SIEVE" "fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate"
        "NOTIFY" "mailto"
        "SASL" ""
        "STARTTLS"
        "VERSION" "1.0"
        OK "Dovecot ready."

        Ich denke es liegt an der Konfiguration des Sieve Addons im TB. Wobei ich inzwischen auch schon alle Varianten durch probiert habe.
        IMAP Server: mail.xxxxxx.tld
        Port 4190
        Kein TLS, TLS wenn verfügbar, TLS erzwingen habe ich alles ausprobiert, TLS erzwingen ist Standard
        Authentifizierung über IMAP Benutzername und Passwort. Proxy Auto.

        Ich bin ratlos.

  118. Walter

    Hallo André,

    ich habe dein Tutorial befolgt, leider klappt es mit dem Empfangen der Mails noch nicht. Im Syslog wird mir folgender Fehler angezeigt:
    postfix/lmtp[30816]: 386861751: to=, relay=mail.xxxxxx[private/dovecot-lmtp], delay=2158, delays=2158/0.04/0/0, dsn=4.7.4, status=deferred (TLS is required, but was not offered by host mail.xxxxxxxx[private/dovecot-lmtp])
    postqueue -p zeigt die wartenden Mails mit dem Status:
    (TLS is required, but was not offered by host mail.xxxxxxxx[private/dovecot-lmtp])

    Sowohl in vimbadmin als auch in main.cf habe ich
    lmtps:unix:private/dovecot-lmtp
    korrekt gesetzt.

    Noch Ideen?

    Gruß Walter

    1. André P. Autor

      Hi,
      Dovecot kennt erst ab neuen Versionen LMTPS (mit „S“). Daher muss das Repo vorher eingebunden- und aktualisiert werden mit „apt-get update“. Wahrscheinlich fehlt dir dieser Schritt. :-)
      Viele Grüße
      André

      1. Christoph Ziegler

        Hi André,

        habe ein „apt-get update“ und „apt-get upgrade“ durchgeführt. jetzt bringt er leider schon da Fehler:

        E: Sub-process /usr/bin/dpkg returned an error code (1)
        Failed to perform requested operation on package. Trying to recover:
        dovecot-core (2:2.2.18-1~auto+77) wird eingerichtet ...
        Job for dovecot.service failed. See 'systemctl status dovecot.service' and 'journalctl -xn' for details.
        invoke-rc.d: initscript dovecot, action "start" failed.
        dpkg: Fehler beim Bearbeiten des Paketes dovecot-core (--configure):
        Unterprozess installiertes post-installation-Skript gab den Fehlerwert 1 zurück
        dpkg: Abhängigkeitsprobleme verhindern Konfiguration von dovecot-managesieved:
        dovecot-managesieved hängt ab von dovecot-core (= 2:2.2.18-1~auto+77); aber:
        Paket dovecot-core ist noch nicht konfiguriert.

        Konfiguriert sollte er ja sein

        Mit freundlichen Grüßen
        Chris

  119. Christoph Ziegler

    Nach dem Tutorial hab ich leider den Dovecot nicht starten können. An was kann das liegen?

    service dovecot status
    ● dovecot.service - LSB: Dovecot init script
    Loaded: loaded (/etc/init.d/dovecot)
    Active: failed (Result: exit-code) since So 2015-06-14 19:51:21 CEST; 1h 2min ago
    Process: 9920 ExecStop=/etc/init.d/dovecot stop (code=exited, status=0/SUCCESS)
    Process: 10684 ExecStart=/etc/init.d/dovecot start (code=exited, status=1/FAILURE)

    Jun 14 19:51:21 astra2385 dovecot[10684]: [121B blob data]
    Jun 14 19:51:21 astra2385 dovecot[10684]: doveconf: Error: managesieve-login: dump-capability process returned 89
    Jun 14 19:51:21 astra2385 dovecot[10684]: [160B blob data]
    Jun 14 19:51:21 astra2385 dovecot[10684]: doveconf: Error: managesieve-login: dump-capability process returned 89
    Jun 14 19:51:21 astra2385 dovecot[10684]: [121B blob data]
    Jun 14 19:51:21 astra2385 dovecot[10684]: failed!
    Jun 14 19:51:21 astra2385 systemd[1]: dovecot.service: control process exited, code=exited status=1
    Jun 14 19:51:21 astra2385 systemd[1]: Failed to start LSB: Dovecot init script.
    Jun 14 19:51:21 astra2385 systemd[1]: Unit dovecot.service entered failed state.

    Und trotzdem vielen Dank für diese Tutorial

    Gruß
    Christoph

    1. Martin

      @Christoph Ziegler : schau mal in dein syslog. wahrscheinlich findest du diese zeile:
      Starting IMAP/POP3 mail server: dovecotdoveconf: Fatal: Error in configuration file /etc/dovecot/dovecot.conf: mailbox Gelöschte Objekte: name isn’t valid UTF-8

      Wenn ja: Entferne die Umlaute aus /etc/dovecot/dovecot.conf

      Gruß Martin

  120. Andreas

    Hi,

    dein Tutorial für Wheezy hat mir enorm gut gefallen und ich habe es gleich mal getestet. Funktioniert wirlich wunderbar.

    Gerade bin ich dabei einen neuen Server unter Jessie aufzusetzen, da ist mir aufgefallen, dass du die Schritte für den Viren- und Spamfilter nicht mehr optional gemacht hast. Das hat mir bei der letzten Version sehr gut gefallen, da ich diese Funktionen ausgelagert habe und nicht doppelt brauche. Daher jetzt meine Frage: Was muss ich anpassen, damit ich diese beiden Sachen ausbauen kann?
    Leider bin ich was die postfix master.cf angeht wirklich kein Profi :( Hoffe, du kannst mir helfen.

    Gruß
    Andreas

  121. Thomas

    Hallo André,
    vielen Dank für deinen tollen Artikel!
    Zur Form: Schön wäre es wenn du einen Changelog führen würdest, wie beim letzten Artikel. Zum Inhalt: Ich würde mir wünsche das du auf Apache als Alternative eingehst und SoGO wäre natürlich ein Kracher.
    Danke für deine Arbeit.

  122. achim

    Hallo Andre,

    vielen Dank für den Tipp. Das hatte ich tatsächlich beim Erstellen der application.ini überlesen. Hab ich jetzt nachgetragen.
    Leider klappts immer noch nicht, mit dem Verzeichnisse erstellen.

    Im postqueue -p steht die Mail mit folgendem Fehler drin:
    (delivery failed to mailbox //maildir:/var/vmail/domain.de/achim/Maildir:LAYOUT=fs: unable to create lock file //maildir:/var/vmail/domain.de/achim/Maildir:LAYOUT=fs.lock: No such file or directory)

    Wo kommen denn die // vor dem maildir: her? Ich finde keine Einstellung, die diese erzeugt und ich denke, die gehören da nicht hin.

    Vielen Dank für Deine Hilfe

    Achim

    1. André P. Autor

      Hi,
      öffne bitte im ViMbAdmin Panel deinen Benutzer, irgendwo solltest du den Transport definieren können. Dort steht „virtual“ per Standard, glaube ich. Da trägst du einfach „lmtps:unix:private/dovecot-lmtp“ ein, ohne die Anführungszeichen.
      Ich glaube, die mailq müsstest du auch einmal bereinigen, da die Änderung darauf nicht mehr wirkt.
      Die „//“ stellt er vor, da es das „virtual_mail_base“ ist (erstes „/“) und er den Maildirpfad als Pfad im Dateissystem erkennt (zweites „/“).
      Viele Grüße
      André

    2. achim

      Hallo Andre,

      vielen Dank für die schnelle Hilfe. Das wars. Der Transport-Eintrag hat in der Datenbank noch gefehlt. Danach hat postfix die mails aus der Queue an dovecot weitergegeben und dovecot brav das Mailverzeichnis erstellt.
      Super! Nun läuft der Mailserver endlich rund. Danke nochmals dafür.

      Grüße
      Achim

  123. Pascal

    Guten Abend ;),

    mir ist heute beim update von ViMbAdmin aufgefallen, dass du php-apc benutzt obwohl folgendes angegeben ist:

    Requirements

    Memcached is strongly recommended;

    Spielt das eine Rolle?

      1. Mario

        PS: Ich setze für Kalender/Kontakte/ActiveSync Horde anstatt roundcube ein. Das funktioniert perfekt.

        PPS: Macht es Sinn hier SpamAssassin noch weiter zu konfigurieren oder reichen die out-of-the-box Einstellungen?

        1. Deffo

          Es kann sinnvoll sein, einen cron job für die Automatisierung der Updates zu konfigurieren (Debian / Ubuntu).

          sa-update <= ist ein Tool von SpamAssassin zum aktualisieren der Regeldateien

          Bei Anderen Distros kann es sein, dass sa-update per default einmal täglich mit cron angestoßen wird.

          /etc/default/spamassassin <= in dieser Datei am ende z.B. per Editor CRON=1 ergänzen!

          Grüße

  124. achim

    Hallo Andre,

    vielen herzlichen Dank für diese tolle Anleitung.

    Ich hänge jedoch noch mit einer Kleinigkeit fest, da mir dovecot die Mail noch nicht ausliefert.
    Im Log-File des postfix finde ich folgenden Eintrag und komme nicht auf die Lösung:

    postfix/virtual[12607]: BC4551A006B: to=, relay=virtual, delay=0.01, delays=0/0/0/0, dsn=4.2.0, status=deferred (delivery failed to mailbox //maildir:/var/vmail/example.de/user/Maildir:LAYOUT=fs: unable to create lock file //maildir:/var/vmail/example.de/user/Maildir:LAYOUT=fs.lock: No such file or directory)

    Aus irgendeinem Grund legt dovecot das Maildir-Verzeichnis für den user nicht an. Der User ist in der Datenbank und existiert.

    Viele Grüße und schon mal vielen Dank für mögliche Tipps
    Achim

    1. André P. Autor

      Hi Achim,
      sorry für die relativ späte Antwort.
      Ich könnte mir vorstellen, dass du den default transport in der application.ini von ViMbAdmin nicht gesetzt hast, kannst du mal nachschauen? :-)
      Viele Grüße

  125. Kilian P.

    Hallo.
    Ich weiß das du bei deinem Tutorial Nginx verwendest kann man denn auch Apache2 verwenden? Außerdem wüsste ich gerne ob du auch PhpMyAdmin in das Tutorial einbinden könntest?
    MfG
    Kilian

    1. Tantalus

      Ja, das Tutorial funktioniert auch mit Apache. Habe das Tutorial mit Apache und ohne Roundcubemail gemacht und es läuft hier. Installiere einfach Apache und das Modul für PHP (oder halt per CGI was dir lieber ist). Anschließend mod_rewrite, php und mod_ssl aktivieren, einen vhost anlegen und fertig. :)

      Debian 8:
      Apache und PHP installieren:
      apt-get install apache2 apache2-mpm-prefork libapache2-mod-php5
      Danach aktiviere TLS und mod_rewrite und mod_php5:
      a2enmod ssl
      a2enmod rewrite
      a2enmod php5

      Ändere die php.ini wie oben im Tutorial beschrieben (Jedoch in der /etc/php5/apache2/php.ini)
      Erstelle einen vhost in /etc/apache2/sites-available/mail.domain.tld:
      <VirtualHost *:80>
      ServerName mail.domain.tld
      Redirect permanent / https://mail.domain.tld/
      </VirtualHost>

      <VirtualHost *:443>
      SSLEngine on
      SSLCertificateFile /etc/ssl/mail.domain.tld.crt
      SSLCertificateKeyFile /etc/ssl/mail.domain.tld.key
      # Intermediate Zertifikat
      # SSLCertificateChainFile /etc/ssl/sub.class1.server.sha2.ca.pem
      # Root Zertifikat
      # SSLCACertificateFile /etc/ssl/ca.pem

      ServerName mail.domain.tld
      CustomLog ${APACHE_LOG_DIR}/mail.domain.tld_access.log combined
      ErrorLog ${APACHE_LOG_DIR}/mail.domain.tld_error.log
      DocumentRoot /var/www/html

      HostnameLookups Off
      UseCanonicalName Off
      ServerSignature Off
      Header always set Strict-Transport-Security "max-age=10886400"

      <Directory "/var/www/html">
      SSLRequireSSL
      Options FollowSymLinks
      AllowOverride FileInfo Indexes Limit

      Require all granted
      DirectoryIndex index.php index.html index.htm
      </Directory>
      </VirtualHost>

      Und aktiviere diesen vhost:
      ln -s /etc/apache2/sites-available/mail.domain.tld /etc/apache2/sites-enabled/mail.domain.tld

      Anschließend deaktiviere noch unsichere Verschlüsselungsmethoden in /etc/apache2/mods-enabled/ssl.conf indem du folgendes am Ende und vor </IfModule> hinzufügst:
      SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH+aRSA+RC4:EECDH:EDH+aRSA:DES-CBC3-SHA:!ECDHE-RSA-DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!LOW:!MD5:!EXP:!PSK:!SRP:!DSS
      SSLHonorCipherOrder on
      SSLProtocol ALL -SSLv2 -SSLv3

      Apache starten (systemctl start apache2) und das sollte es hoffentlich gewesen sein, falls ich mich noch richtig daran erinnere.

  126. Tantalus

    Hi,

    ich habe mich an die Anleitung gehalten und einen eigenen Mailserver aufgesetzt, der auch soweit funktioniert. Jetzt habe ich noch einen alten Mailserver mit Plesk 11/courier (Maildir?) Mailkonten. Ich habe schon versucht einfach die Mailkonten mit courier-dovecot-migrate.pl zu migrieren und nach /var/vmail zu kopieren. Leider geht bei meinen bisherigen versuchen immer die Verzeichnisstruktur verloren (Alle Verzeichnisse auf einer Ebene und werden im Mailclient mit einem „.“ beginnend angezeigt). Habe ich bei mir was falsch konfiguriert oder weiß jemand was man da noch machen kann?

    Was ich eigenartig finde ist, dass ich wie im Tutorial „mail_location = maildir:~/Maildir:LAYOUT=fs“ in der dovecot.conf habe. Wenn ich aber mit dem Mail-Client auf ein Konto zugreife wird beispielsweise /var/vmail/domain.tld/test/mail anstelle von „Maildir“ angelegt?!

    1. André P. Autor

      Hi,
      argh…

      nano /srv/vimbadmin/application/configs/application.ini

      Dort:

      defaults.mailbox.maildir = "maildir:/var/vmail/%d/%u/Maildir:LAYOUT=fs"

      Ich musste eine alte Revision wiederherstellen, dabei ist das wohl durcheinander gekommen. Nicht gut. :-)

      Allerdings ist es nicht schlimm. Dovecots mail_location wird durch den Wert aus der Datenbank einfach überschrieben.
      Schlecht ist es allerdings für den „shared“-Namespace, der muss korrekt sein.

      Also entweder würdest du nun die „application.ini“ wie oben beschrieben korrigieren, oder du änderst den Namespace in der „dovecot.conf“:

      namespace {
          type = shared
          separator = /
          prefix = Shared/%%u/
          location = maildir:%%h/mail:LAYOUT=fs:INDEXPVT=~/mail/Shared/%%u
          subscriptions = yes
          list = yes
      }

      Falls du sowieso noch keine Mails empfangen hast und die Mailbox neu anlegen kannst, empfehle ich eher die „application.ini“ abzuändern.
      Anschließend wird das Maildir korrekt gesetzt, wenn in ViMbAdmin die Mailbox neu angelegt wird.

      Danke für den (unfreiwilligen) Hinweis. :-)

  127. Sven

    Eine Frage hätte ich doch noch, auch wenn es sich nicht direkt auf den Artikel bezieht.

    Ich habe die Aufgabe ebenfalls einen Backup MX anzulegen.

    Ich habe jetzt im groben und ganzen die Config des Postfix genommen, damit ich die Prüfungen und Validierungen auch im Backup MX habe und keinen Backscatter erzeuge.

    Das Ganze funktioniert auch eigentlich recht gut.
    Allerdings erhalte ich die Mails 3fach…

    Gibt es hier vielleicht einen Tipp woher das stammen könnte?
    Bisher konnte ich es noch nicht nachvollziehen so richtig..

    Wäre super wenn du einen Tipp hättest.. Google hilft mir leider nicht weiter..

    Viele Grüße
    Sven

  128. Dennis

    Hallo,

    Erstmal einen riesen Dank für Fufix, die Seafile-Hilfe und diesem Tut hier ^^ Ich kann dir gar nicht sagen, wie viel Zeit es mir erspart hat, beim Einrichten eines Mailservers und vielen weiteren Sachen :D
    Ein paar Fragen hätte ich aber noch:
    – Wo ist fail2ban? Eine DoS Protection ist sicherlich sinnvoll ^^
    – Warum nicht auf MariaDB setzen? Die Jessie-Mainrepos kommen standardmässig mit MariaDB. Wäre eine Überlegung wert…
    – Für eine SOGo-Integration in diese Anleitung wäre ich unendlich dankbar :D

    LG,
    Dennis

    1. André P. Autor

      Och, fail2ban könnte ich gerne in einem seperatem Thema beschreiben. Ich weiß, ich habe es im „alten“ Artikel drin. Das neueste Release aus dem Git ist aber nochmal schöner, finde ich. Kommt vor allem mit einigen vordefinierten Filtern. :-)

      Und danke auch an dich!

      SOGo kommt bestimmt irgendwann. Ist ja erstaunlich, dass das so gefragt ist. :-)

      Mit MariaDB hatte ich hin und wieder kleine Probleme. Zwar nichts wildes, aber es könnte vielleicht stören. Auf Dauer sollte aber der Wechsel drin sein.

  129. Sven

    Einen kleinen Fehler hätte ich da noch gefunden:

    Nachdem anlegen der Datei für die MySQL Verbindung für Dovecot soll man die Rechte anpassen
    chown root:vmail /etc/dovecot/dovecot-mysql.conf

    Allerdings wird erst im Step danach der User „vmail“ angelegt.

    Viele Grüße
    Sven

  130. Pascal

    könnte schon glatt als Spam durchgehen ;)…

    Ich habe folgendes Problem in den Logs gefunden:

    May 27 11:31:40 mail amavis[6396]: (06396-01) (!)run_av (ClamAV-clamd) FAILED – unexpected , output=“/var/lib/amavis/tmp/amavis-20150527T113139-06396-lclSLbS3/parts: lstat() failed: Permission denied. ERROR\n“
    May 27 11:31:40 mail amavis[6396]: (06396-01) (!)ClamAV-clamd av-scanner FAILED: CODE(0x41747d8) unexpected , output=“/var/lib/amavis/tmp/amavis-20150527T113139-06396-lclSLbS3/parts: lstat() failed: Permission denied. ERROR\n“ at (eval $
    May 27 11:31:40 mail amavis[6396]: (06396-01) (!)WARN: all primary virus scanners failed, considering backups

    Bin deiner Anleitung exakt gefolgt und habe auf einem sauberen System gestartet. Fehlt evtl. noch
    apt-get install clamav
    ?

    Gruß Pascal

    1. André P. Autor

      Och nö, habe was wichtiges im Artikel vergessen…

      adduser clamav amavis
      sed -i 's/AllowSupplementaryGroups false/AllowSupplementaryGroups true/g' /etc/clamav/clamd.conf
      service clamav-daemon restart 
      

      Danach sollte das Problem behoben sein. Keine Ahnung, wieso ich das vergessen habe, sorry! Aber danke für den Hinweis!

      1. Pascal

        Danke! Scheint zu funktionieren.

        amavis[6394]: (06394-02) Passed CLEAN

        Bin mehr als Dankbar, dass du überhaupt so gut kommentierte Tutorials schreibst, also alles super! :)

        Ansonsten gibt es noch nen kleinen Fehler bei

        amavisd-new genrsa /var/lib/amavis/db/dkim_domain.tld 2048

        dort fehlt das .key
        Oder halt hier entfernen:

        dkim_key(‚domain.tld‘, ‚default‘, ‚/var/lib/amavis/db/dkim_domain.tld.key‘);

        Viele Grüße und DANKE!

  131. Pascal

    Kleiner Tipp für Probleme im ersten Schritt:
    Falls bei euch nach der Eingabe von

    timedatectl set-timezone Europe/Berlin
    hostnamectl set-hostname mail.domain.tld

    folgende Fehlermeldung erscheint:
    "Failed to create bus connection: No such file or directory"
    fehlt bei euch dbus.

    Einfach nachinstallieren:
    apt-get update && apt-get install -y dbus

    1. André P. Autor

      Danke für den Hinweis! :-) Musste es auch schon in fufix einbauen, hier leider vergessen. Muss mir mal anschauen, wieso bei „minimal“-Systemen auf dbus verzichtet wird. Sollte meiner Meinung nach dazugehören.

  132. Pascal

    André… ich könnte dich knutschen ;)….

    Erst einmal Entschuldigung für die geplatzte Kommunikation via Email. Mein Kleopatra ist immer wieder abgekackt und das hat mir zu viele Nerven geraubt. Inzwischen hab ich mich dazu entschlossen ein eigenes Cluster aufzubauen mit ISPconfig (Meinung dazu?) und eben einem separaten Mailserver. Dabei wird mir deine Anleitung eine großartige Hilfe sein!

    Vor kurzem habe ich das erste Mal nginx verwendet und bin auf Probleme mit PHPMyAdmin gestoßen. Jedoch war nginx nicht so ein Ressourcenfresser als der Apache. Geht deine Empfehlung hier klar in Richtung nginx?

    Viele Grüße,

    Pascal

    1. André P. Autor

      Ich empfinde Nginx als viel übersichtlicher und strukturierter als Apache2. In den meisten Situationen zudem einfach schneller. Gut, die ganzen Rewrites, die je nach Webanwendung umzuschreiben sind, können schon nerven. Es wird sich ja oft auf funktionierende htaccess-Datein verlassen (seitens Entwickler). Ich kann mir vorstellen, dass dort auch das Problem mit PMA bestand.
      Hin und wieder, wenn ich ganz faul bin und schnell eine mir fremde Webanwendung hosten möchte, setze ich Apache2 mit libapache2-mod-php5 auf. Das erspart mir dann 5 Minuten der Umkonfiguration. :-)

  133. Tobias

    Hallo André,

    kann mich dem oben genannt Lob nur anschließen.
    Um auf die aktuelle Logjam-Thematik einzugehen, wäre bzgl. der Ciphers noch folgende Seite zu erwähnen:

    Dort wird folgender Parameter bei Postfix empfohlen:
    smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA
    Es gibt dort auch Vorschläge für Dovecot.
    Weiterhin wird eine eigene DH Gruppe vorgeschlagen.

    Gruß
    Tobias

  134. spm

    Hallo André,
    wirst du ViMbAdmin 3 auch in Fufix integrieren? Bzw. ließe sich dort ViMbAdmin 3 ohne große Probleme auch nachträglich hinzufügen, ggf. im Austausch für postfixadmin?
    Ansonsten schließe ich mich wynni an, das wäre wirklich das Nonplusultra :)
    Danke für deine tollen Tutorials!

    1. André P. Autor

      Ich habe darüber nachgedacht. Allerdings unterscheiden die Datenbanken sich schon deutlich. Muss erst einen vernünftigen Upgrade-Prozess basteln. :-) Aber danach steht dem eigentlich nicht mehr viel im Wege.
      Kalender und Kontakte sollten wohl der nächste Schritt sein. Habe schon viele Ansätze gehabt, die ich aber noch nicht einbauen wollte, da irgendetwas klemmte oder nicht „ganz so gut“ funktionierte. Baikal mit IMAP-Login wäre wohl eine Überlegung.
      Danke für deinen Kommentar! :-)

  135. wynni

    Hallo André,
    zuerst ein großes Lob, mir gefällt dein Blog und deine Arbeit an fufix. Ich muß zugeben, bis noch habe ich fufix nicht getestet. Was ich aber hier vermisse ist eine Kalender und Kontakte Synchronisation. Ich selbst möchte nicht mehr darauf verzichten.
    Vielleicht stolperst du ja mal zufällig über SOGo oder ähnliches und kannst das geschickt mit einbauen :)

    Lg
    wynni

    1. André P. Autor

      Hi,
      danke! Kalender und Kontakte werden noch kommen, siehe Kommentar an spm. Mir fehlt leider noch der endgültige Ansatz dafür. :-) Persönlich verwende ich WebMail Pro von Afterlogic für 50€. Spricht zwar gegen das Prinzip der kostenlosen Software. Aber es funktioniert einfach zu gut, hehe…
      SOGo habe ich schon einige male gebastelt, allerdings müsste dann das Passwort-Hashing wieder auf MD5 (crypted?) runtergeschraubt werden, damit die Synchronisation funktioniert.
      Mal sehen, es findet sich schon noch das richtige Stück Software!
      Viele Grüße und danke für deinen Kommentar!

      1. Samurait

        Hi André,
        Ich habe SOGo bei mir mit Fufix am laufen und musste das Passwort-Hashing nicht runtersetzen, habe ganz einfach SOGo installiert, dann die Authentifizierung auf Mysql umgestellt und greife per View auf die Datenbank von Postfixadmin zu.
        Mein userPasswordAlgorithm von SOGo steht einfach auf crypt. DAV Server funktioniert einwandfrei, Wenn ich User lösche kann dieser sich auch nicht mehr bei SOGo anmelden, Sieve Regeln funktionieren sogar besser als bei Roundcube, Ich würde ebenfalls Vorschlagen das du SOGo einbinden würdest, Theoretisch könntest du aber auch noch gerne auf LDAP umsteigen, dann könntest du auch noch Openchange darauf installieren, was dann sogar ActiveSync unterstützen würde.
        Was hälst du davon?

        1. André P. Autor

          Hi Samurait,
          und du hat kein Problem mit SHA512-Crypt? Ich habe in Erinnerung, dass SOGo damit nicht umgehen kann.
          :-) OpenChange wäre bestimmt nicht schlecht. Aber das wären dann wirklich zu viele Änderungen und eher was für einen eigenen Artikel, glaube ich.
          Ich bin immer wieder überrascht, wieviele Menschen sich volle Exchange-Funktionalität wünschen. :-)
          Danke für die Info!

    1. André P. Autor

      Postfix ist unfassbar gut dokumentiert, seit Jahren (eher Jahrzehnten) bewährt und bis ins letzte Detail durchdacht. Ich glaube, wenn man eine Software nicht schlechtreden kann, dann ist es Postfix.
      Den ganzen Umfang wird dir kein anderer MTA in der Stabilität bieten können.
      Ja, bis man durchblickt, vergeht einige Zeit. Aber wenn man einmal die Möglichkeiten hatte, kann Postfix kaum noch etwas das Wasser reichen.
      Aber wer bin ich, dass ich nicht offen für Alternativen bin. Gab ja leider schon eine Weile keine Neuigkeiten am MTA Himmel. Mit Dovecot sieht das ganze ja schon anders aus. Schlecht mailen tun wir mit unseren freien Systemen jedenfalls nicht. :-)
      Viele Grüße

      1. tux.

        Braucht denn wer „den ganzen Umfang“ wirklich? Ist „kann das meiste“ wirklich immer das Topargument?
        Fehlende Stabilität kann man OpenBSD-Software sicherlich nicht vorwerfen. ;)

        1. Marc Stürmer

          Wenn dir Postfix nicht gefällt, dann nimm eben was anderes – wie Sendmail, Exim, Qmail, Zmailer oder Courier. Es ist ja nicht so, als dass es nur den einen gäbe.

          Postfix hat den Vorteil, dass es gut dokumentiert ist, sehr performant ist (> 100000 ausgehende Mails pro Stunde ist kein Problem), eine sehr große Community hat und damit es sehr viel Dokumentation hat, dass es Milter eingebaut hat so wie von Grund auf als sicherer MTA als Designziel programmiert wurde (Exim beispielsweise ist ein monolithisches Binary SUID root, Postfix dagegen besteht aus einer Vielzahl an Programmen, jedes genau für einen Zweck und die remote root exploits bei Sendmail früher waren Legion), weiterhin kommt dazu die nach wie vor aktive Entwicklung durch den Autor hinzu. Der andere MTA dieser Art, Qmail, ist zum Konfigurieren eine Qual.

          Eine einfache Installation mit Postfix ist schnell gemacht, aber es skaliert eben auch sehr gut.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.