Dovecot 2.4 IMAP Server Installation auf Debian 13, eine freie Open-Source-Software für leistungsstarke und sichere IMAP- und POP3-E-Mail-Server für Linux.

Setup: Virtuelle Mailbox-Benutzer, verwaltet in MySQL. LAMP-Stack und Postfix ist bereits vorhanden.
1. Dovecot Pakete Installation
apt update
apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql
apt install postfix-mysql
2. vmail-Systembenutzer anlegen
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/mail/vhosts -m -s /usr/sbin/nologin
mkdir -p /var/mail/vhosts
chown -R vmail:vmail /var/mail/vhosts
3. MySQL-Datenbank für Mail-Accounts
CREATE DATABASE mailserver;
USE mailserver;
CREATE TABLE virtual_domains (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL UNIQUE
);
CREATE TABLE virtual_users (
id INT PRIMARY KEY AUTO_INCREMENT,
domain_id INT NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(150) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);
CREATE TABLE virtual_aliases (
id INT PRIMARY KEY AUTO_INCREMENT,
domain_id INT NOT NULL,
source VARCHAR(100) NOT NULL,
destination VARCHAR(100) NOT NULL,
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
);
Dedizierter MySQL-Verwaltungsuser (statt root)
CREATE USER 'mailadmin'@'localhost' IDENTIFIED BY 'STARKES_PASSWORT';
GRANT SELECT, INSERT, UPDATE, DELETE ON mailserver.* TO 'mailadmin'@'localhost';
CREATE USER 'mailuser'@'localhost' IDENTIFIED BY 'ANDERES_PASSWORT';
GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1';
CREATE USER 'mailuser'@'127.0.0.1' IDENTIFIED BY 'ANDERES_PASSWORT';
GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1';
FLUSH PRIVILEGES;
Hinweis Der MySQL-Verwaltungsuser als ‚localhost‘ und ‚127.0.0.1‘ erstellen, da MySQL diese als unterschiedliche User behandelt. Damit der Postfix User-Lookup über einer der beiden möglich ist.
mailadmin— volle Rechte, genutzt vom Verwaltungs-Script (mailuser.sh)mailuser— nur Lesezugriff, genutzt von Dovecot und Postfix für die Auth-/Domain-Lookups
4. Dovecot-Konfiguration (/etc/dovecot/dovecot.conf)
Dovecot 2.4 verwendet eine neue, zentrale Config-Syntax. Alles Wesentliche steht in einer Datei statt verteilt über conf.d/*.conf.
dovecot_config_version = 2.4.0
dovecot_storage_version = 2.4.0
protocols {
lmtp = yes
imap = yes
}
ssl = required
ssl_server_cert_file = /etc/letsencrypt/live/mail.beispiel.tld/fullchain.pem
ssl_server_key_file = /etc/letsencrypt/live/mail.beispiel.tld/privkey.pem
sql_driver = mysql
mysql 127.0.0.1 {
user = mailuser
password = ANDERES_PASSWORT
dbname = mailserver
}
auth_mechanisms = plain login
auth_username_format = %{user | lower}
passdb sql {
query = SELECT email AS user, password FROM virtual_users WHERE email = '%{user | lower}';
default_password_scheme = SHA512-CRYPT
}
userdb sql {
query = SELECT email AS user FROM virtual_users WHERE email = '%{user | lower}';
iterate_query = SELECT email FROM virtual_users;
}
mail_uid = vmail
mail_gid = vmail
mail_privileged_group = vmail
mail_home = /var/mail/vhosts/%{user | domain}/%{user | username}
mail_driver = maildir
mail_path = ~/mail
mailbox_list_layout = fs
namespace inbox {
inbox = yes
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0660
group = postfix
user = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0660
user = vmail
group = vmail
}
}
Wichtig: In den SQL-Queries für
passdb/userdbmuss%{user | lower}verwendet werden — nicht%{user | username | lower}. Derusername-Filter schneidet den Domain-Teil ab und sucht dann fälschlich nur nach dem Lokalteil der Adresse, wodurch die Query invirtual_userskeinen Treffer findet. Fürmail_home(Pfadaufbau) ist die Trennung indomain/usernamedagegen korrekt und gewollt.
chmod 600 /etc/dovecot/dovecot.conf
chown root:root /etc/dovecot/dovecot.conf
5. Postfix-Anbindung (/etc/postfix/main.cf)
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
/etc/postfix/mysql-virtual-mailbox-domains.cf
user = mailuser
password = ANDERES_PASSWORT
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'
/etc/postfix/mysql-virtual-mailbox-maps.cf
user = mailuser
password = ANDERES_PASSWORT
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'
chown root:postfix /etc/postfix/mysql-virtual-*.cf
chmod 640 /etc/postfix/mysql-virtual-*.cf
6. Dienste starten
doveconf -n # Syntax-Check
postfix check
systemctl restart dovecot
systemctl restart postfix
systemctl enable dovecot
7. Verwaltungs-Script mailuser.sh
CLI-Tool zum Anlegen/Verwalten von Domains, Benutzern und Aliassen, nutzt den mailadmin-MySQL-User und doveadm pw -s SHA512-CRYPT für Passwort-Hashes.
Nutzung: mailuser.sh {add-domain|add-user|password|add-alias|delete-user|list}
8. Test der kompletten Kette
Domain-/User-Lookup über Postfix:
postmap -q beispiel.tld mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
postmap -q mein.email@beispiel.tld mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
Dovecot-Auth direkt testen:
doveadm auth test mein.email@beispiel.tld
→ passdb: mein.email@beispiel.tld auth succeeded
IMAP-Login:
openssl s_client -connect localhost:993 -crlf
a login mein.email@beispiel.tld PASSWORT
a select inbox
Testmail per sendmail (Postfix-Wrapper, kein zusätzliches Paket nötig):
sendmail mein.email@beispiel.tld << 'EOF'
Subject: Testmail
From: mein.email@beispiel.tld
To: mein.email@beispiel.tld
Dies ist eine Testmail.
EOF
Zustellung prüfen:
ls -la /var/mail/vhosts/beispiel.tld/admin/mail/new/
Mail-Log live mitverfolgen:
tail -f /var/log/mail.log
Ergebnis: Postfix → LMTP → Dovecot → MySQL-Auth → Maildir-Zustellung funktioniert durchgängig für virtuelle Domains/Benutzer.
Offene Erweiterungen (optional)
- Sieve-Filter (
dovecot-sieve,dovecot-managesieved) für serverseitige Regeln - fail2ban-Jail für Dovecot/Postfix gegen Brute-Force-Logins
- Postfix Submission (Port 587 mit STARTTLS Explicit TLS) für externe Mail-Clients konfigurieren
- Postfix Submissions (Port 465 mit implizitem TLS)) für externe Mail-Clients konfigurieren


