Postfix Konfiguration · 7 min read · Sep 28, 2025
Virtuelle Benutzer und Domains mit Postfix, Courier, MySQL und SquirrelMail (Mandriva 2009.1 x86_64) - Seite 2
5 Erstellen Sie die MySQL-Datenbank für Postfix/Courier
Wir erstellen eine Datenbank namens mail:
mysqladmin -u root -p create mailAls nächstes gehen wir zur MySQL-Shell:
mysql -u root -pIn der MySQL-Shell erstellen wir den Benutzer mail_admin mit dem Passwort mail_admin_password (ersetzen Sie es durch ein Passwort Ihrer Wahl), der SELECT, INSERT, UPDATE, DELETE-Berechtigungen für die Datenbank mail hat. Dieser Benutzer wird von Postfix und Courier verwendet, um eine Verbindung zur Mail-Datenbank herzustellen:
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;Immer noch in der MySQL-Shell erstellen wir die Tabellen, die Postfix und Courier benötigen:
USE mail;CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
TYPE=MyISAM;CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT '10485760',
PRIMARY KEY (email)
) TYPE=MyISAM;CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;quit;Wie Sie vielleicht bemerkt haben, haben wir mit dem Befehl quit; die MySQL-Shell verlassen und sind zurück in der Linux-Shell.
Die Tabelle domains speichert jede virtuelle Domain, für die Postfix E-Mails empfangen soll (z.B. example.com).
| domain |
| example.com |
Die Tabelle forwardings dient dazu, eine E-Mail-Adresse auf eine andere zu verweisen, z.B. E-Mails für [email protected] an [email protected] weiterzuleiten.
| source | destination |
| [email protected] | [email protected] |
Die Tabelle users speichert alle virtuellen Benutzer (d.h. E-Mail-Adressen, da die E-Mail-Adresse und der Benutzername identisch sind) und Passwörter (in verschlüsselter Form!) sowie einen Quota-Wert für jedes Postfach (in diesem Beispiel beträgt der Standardwert 10485760 Bytes, was 10 MB entspricht).
| password | quota | |
| [email protected] | No9.E4skNvGa. (“secret” in verschlüsselter Form) | 10485760 |
Die Tabelle transport ist optional und dient fortgeschrittenen Benutzern. Sie ermöglicht es, E-Mails für einzelne Benutzer, ganze Domains oder alle E-Mails an einen anderen Server weiterzuleiten. Zum Beispiel,
| domain | transport |
| example.com | smtp:[1.2.3.4] |
würde alle E-Mails für example.com über das SMTP-Protokoll an den Server mit der IP-Adresse 1.2.3.4 weiterleiten (die eckigen Klammern [] bedeuten “keine MX-DNS-Abfrage durchführen” (was für IP-Adressen sinnvoll ist…). Wenn Sie stattdessen einen vollqualifizierten Domainnamen (FQDN) verwenden, würden Sie die eckigen Klammern nicht verwenden.).
6 Konfigurieren Sie Postfix
Jetzt müssen wir Postfix mitteilen, wo es alle Informationen in der Datenbank finden kann. Dazu müssen wir sechs Textdateien erstellen. Sie werden feststellen, dass ich Postfix sage, dass es sich mit MySQL unter der IP-Adresse 127.0.0.1 anstelle von localhost verbinden soll. Dies liegt daran, dass Postfix in einem Chroot-Jail läuft und keinen Zugriff auf den MySQL-Socket hat, mit dem es sich verbinden würde, wenn ich Postfix sage, dass es localhost verwenden soll. Wenn ich 127.0.0.1 verwende, verwendet Postfix TCP-Netzwerkverbindungen, um sich mit MySQL zu verbinden, was auch in einem Chroot-Jail kein Problem darstellt (die Alternative wäre, den MySQL-Socket in das Chroot-Jail zu verschieben, was einige andere Probleme verursacht).
Jetzt lassen Sie uns unsere sechs Textdateien erstellen.
vi /etc/postfix/mysql-virtual_domains.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_forwardings.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_mailboxes.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_email2email.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_transports.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |
vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |
chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cfJetzt erstellen wir einen Benutzer und eine Gruppe namens vmail mit dem Home-Verzeichnis /home/vmail. Hier werden alle Postfächer gespeichert.
groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -mAls nächstes nehmen wir einige Postfix-Konfigurationen vor. Stellen Sie sicher, dass Sie server1.example.com durch einen gültigen FQDN ersetzen, da Ihr Postfix sonst möglicherweise nicht richtig funktioniert!
postconf -e 'myhostname = server1.example.com'
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'
postconf -e 'mynetworks = 127.0.0.0/8'
postconf -e 'virtual_alias_domains ='
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
postconf -e 'virtual_mailbox_base = /home/vmail'
postconf -e 'virtual_uid_maps = static:5000'
postconf -e 'virtual_gid_maps = static:5000'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'broken_sasl_auth_clients = yes'
postconf -e 'smtpd_sasl_authenticated_header = yes'
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'
postconf -e 'virtual_create_maildirsize = yes'
postconf -e 'virtual_maildir_extended = yes'
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'
postconf -e 'virtual_mailbox_limit_override = yes'
postconf -e 'virtual_maildir_limit_message = "Der Benutzer, den Sie erreichen möchten, hat das Quota überschritten."'
postconf -e 'virtual_overquota_bounce = yes'
postconf -e '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 $virtual_mailbox_limit_maps'
postconf -e 'inet_interfaces = all'
postconf -e 'alias_database = hash:/etc/postfix/aliases'
postconf -e 'alias_maps = hash:/etc/postfix/aliases'Anschließend erstellen wir das SSL-Zertifikat, das für TLS benötigt wird:
cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509Landname (2-Buchstaben-Code) [GB]: <– Geben Sie Ihren Landnamen ein (z.B. “DE”).
Bundesland oder Provinzname (vollständiger Name) [Berkshire]: <– Geben Sie den Namen Ihres Bundeslandes oder Ihrer Provinz ein.
Ortsname (z.B. Stadt) [Newbury]: <– Geben Sie Ihre Stadt ein.
Organisationsname (z.B. Firma) [My Company Ltd]: <– Geben Sie den Namen Ihrer Organisation ein (z.B. den Namen Ihres Unternehmens).
Name der organisatorischen Einheit (z.B. Abteilung) []: <– Geben Sie den Namen Ihrer organisatorischen Einheit ein (z.B. “IT-Abteilung”).
Allgemeiner Name (z.B. Ihr Name oder der Hostname Ihres Servers) []: <– Geben Sie den vollqualifizierten Domainnamen des Systems ein (z.B. “server1.example.com”).
E-Mail-Adresse []: <– Geben Sie Ihre E-Mail-Adresse ein.
Ändern Sie dann die Berechtigungen der smtpd.key:
chmod o= /etc/postfix/smtpd.key7 Konfigurieren Sie Saslauthd
Bearbeiten Sie /etc/sasl2/smtpd.conf. Es sollte so aussehen:
vi /etc/sasl2/smtpd.conf| # SASL-Bibliothekskonfigurationsdatei für Postfix # alle Parameter sind dokumentiert in: # /usr/share/doc/cyrus-sasl/options.html # Die mech_list-Parameter listen die zu verwendenden SASL-Mechanismen auf, # standardmäßig alle gefundenen Mechanismen. #mech_list: plain login # Um sich über den separaten saslauthd-Daemon zu authentifizieren, (z.B. für # System- oder LDAP-Benutzer). Siehe auch /etc/sysconfig/saslauthd. #pwcheck_method: saslauthd #saslauthd_path: /var/lib/sasl2/mux # Um sich gegen Benutzer zu authentifizieren, die in sasldb gespeichert sind. #pwcheck_method: auxprop #auxprop_plugin: sasldb #sasldb_path: /var/lib/sasl2/sasl.db pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/lib/authdaemon/socket |
Erstellen Sie dann die Systemstartlinks für Postfix und starten Sie Postfix, saslauthd und courier-authdaemon:
chmod 755 /var/lib/authdaemon
chkconfig postfix on
/etc/init.d/courier-authdaemon start
/etc/init.d/postfix start
/etc/init.d/saslauthd start8 Konfigurieren Sie Courier
Jetzt müssen wir Courier mitteilen, dass es sich gegen unsere MySQL-Datenbank authentifizieren soll. Zuerst bearbeiten Sie /etc/courier/authdaemonrc und ändern den Wert von authmodulelist, sodass er wie folgt lautet:
vi /etc/courier/authdaemonrc| [...] authmodulelist="authmysql" #authmodulelist="authpam authpwd authshadow" [...] |
Bearbeiten Sie dann /etc/courier/authmysqlrc. Es sollte genau so aussehen (stellen Sie erneut sicher, dass Sie die richtigen Datenbankdetails ausfüllen):
cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
cat /dev/null > /etc/courier/authmysqlrc
vi /etc/courier/authmysqlrc| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |
Starten Sie dann Courier neu:
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imapd restart
/etc/init.d/courier-pop3d restartDurch Ausführen von
telnet localhost pop3können Sie überprüfen, ob Ihr POP3-Server korrekt funktioniert. Es sollte +OK Hello there . zurückgeben (tippen Sie quit, um zur Linux-Shell zurückzukehren):
[root@server1 postfix]# telnet localhost pop3
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Hello there.
quit
+OK Better luck next time.
Connection closed by foreign host.
[root@server1 postfix]#Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.