Debian Mailsystem: Unabhängige “Domain” zum Standardsystem: Unterschied zwischen den Versionen
Niki (Diskussion | Beiträge) |
Niki (Diskussion | Beiträge) |
||
Zeile 131: | Zeile 131: | ||
stiftingtal_aliases_members: | stiftingtal_aliases_members: | ||
− | + | debug_print = "R: virtual_aliases for $local_part@$domain" | |
− | + | driver = redirect | |
− | + | # domains = +virtual_domains | |
− | + | domains = stiftingtal.net | |
− | + | allow_fail | |
− | + | allow_defer | |
− | + | # data = ${lookup{$local_part}lsearch{/etc/exim4/$domain.aliases}} | |
− | + | data = ${lookup mysql{SELECT IF(LENGTH(rcpt)>0,rcpt,u.username) FROM t_mail_aliases AS a LEFT JOIN phpbb_users AS u ON u.user_id = a.user_id WHERE a.alias LIKE '${local_part}'}} | |
− | + | qualify_preserve_domain | |
stiftingtal_aliases_other: | stiftingtal_aliases_other: | ||
− | + | debug_print = "R: stiftingtal_aliases_other for $local_part@$domain" | |
− | + | driver = redirect | |
− | + | domains = stiftingtal.net | |
− | + | allow_fail | |
− | + | allow_defer | |
− | + | data = ${lookup{$local_part}lsearch{/etc/exim4/stiftingtal.aliases}} | |
− | + | qualify_preserve_domain | |
Wie man sieht sind es in Wirklichkeit zwei. Der erste konsultiert die mySQL-Tabelle. Vorteil: Es brauchen keine Synchronisationsscripts geschrieben werden. Die Intranetseite schreibt die Aliase des Benutzers direkt in die t_mail_aliases. | Wie man sieht sind es in Wirklichkeit zwei. Der erste konsultiert die mySQL-Tabelle. Vorteil: Es brauchen keine Synchronisationsscripts geschrieben werden. Die Intranetseite schreibt die Aliase des Benutzers direkt in die t_mail_aliases. | ||
Zeile 158: | Zeile 158: | ||
stiftingtal: | stiftingtal: | ||
− | + | debug_print = "R: stiftingtal for $local_part@$domain" | |
− | + | driver = accept | |
− | + | domains = stiftingtal.net | |
− | + | # local_parts = /etc/exim4/stiftingtal.net.users | |
− | + | local_parts = mysql;STIFTINGTAL_USERS | |
− | + | transport = maildir_stiftingtal | |
Wie man auch hier sieht, kommen die Daten nicht mehr aus einer Datei, die mühevoll synchronisiert werden muss und vielleicht auch noch Race-Conditions beschert, sondern auch aus der mySQL-Datenbank (SQL-Statement wurde oben bereits definiert). | Wie man auch hier sieht, kommen die Daten nicht mehr aus einer Datei, die mühevoll synchronisiert werden muss und vielleicht auch noch Race-Conditions beschert, sondern auch aus der mySQL-Datenbank (SQL-Statement wurde oben bereits definiert). |
Version vom 21. Jänner 2008, 15:41 Uhr
Prinzipiell verwende ich auf meinem Server das “Standard”-Debian Paket für Mail (SMTP/IMAP): Exim und Courier. Vor längerer Zeit wurde aber die Forderung nach einem zweiten “virtuellen” Server für stiftingtal.net laut, das unabhängig vom jetzigen System eingebaut werden sollte. Bis jetzt hab ich per exim einfach einen zusätzlichen Director/Transport eingtebaut, der Mails für die Domain stiftingtal.net nach /var/spool/mail/stiftingtal.net/ verschoben hatte. Für die Mailaliase gabs zusätzlich Symlinks auf w-lan.mine.nu und wlan.lan. Abgeholt wurden die Mails per POP3. Dazu hab ich einen einfachen extra Server “teapop” installiert. mySQL hat leider nie funktioniert, so wurde einfach eine normale passwd-file aus der Datenbank generiert.
Nun soll aber das modernere IMAP-System Verwendung finden. Alles in allem lässt sich das sehr gut in die vorhandene Struktur eingliedern, sodass die alten Systeme erhalten bleiben. Wie, das beschreib ich hier.
Was war da
Vorhanden war ein normales Debian System mit den Paketen für Courier und exim3 installiert. Standardmäßig ist bei Courier der authdaemon installiert, der nach PAM authentifiziert, was mir sehr recht ist. Und ich hab nur die SSL-Variante am laufen, IMAP ohne SSL brauche ich nicht. Der exim ist so eingerichtet, dass er lokale Mails im Homeverzeichnis in ~/Maildir im Maildir-Format speichert.
Courier anpassen
Die Mails sollen gesammelt nach /home/intranet/spool/ kommen. Das ganze läuft nun über eine mySQL Tabelle. Dazu wird das Debian Paket courier-authmysql installiert.
In der vorhandenen mySQL “intranet”-Datenbank wird folgende Tabelle hinzugefügt:
CREATE TABLE `mail_users` (
`email` varchar(128) NOT NULL default '',
`crypt` varchar(128) NOT NULL default '',
`clear` varchar(128) NOT NULL default '',
`name` varchar(128) NOT NULL default '',
`defaultdelivery` varchar(255) NOT NULL default '',
`quota` varchar(255) NOT NULL default '',
`options` varchar(255) NOT NULL default '',
PRIMARY KEY (`email`)
) TYPE=MyISAM;
Nun wird /etc/courier/authmysqlrc angepasst:
MYSQL_SERVER localhost MYSQL_USERNAME mail MYSQL_PASSWORD secret MYSQL_PORT 0 MYSQL_OPT 0 MYSQL_DATABASE intranet MYSQL_USER_TABLE mail_users MYSQL_CRYPT_PWFIELD crypt MYSQL_UID_FIELD 1019 MYSQL_GID_FIELD 1007 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/intranet" MYSQL_NAME_FIELD name MYSQL_MAILDIR_FIELD CONCAT('/home/intranet/spool/',SUBSTRING_INDEX(email,'@',1),'/') MYSQL_QUOTA_FIELD 0
Das gute dran: Alles ist nun zentral drinnen in mySQL. Leider muss wegen des crypt-Passwortes nach wie vor das Passwort redundant gespeichert werden aber das wird sich mit LDAP ändern. Die Courier-Konfiguration ist hiermit fertig. Nein doch nicht.
In /etc/courier/authdaemonrc kommt noch:
authmodulelist="authpam authmysql"
Normale Benutzer werden wie gehabt per PAM authentifiziert. Stiftingtal Benutzer mit benutzername@stiftingtal.net. Das gute: Ist das Maildir noch nicht vorhanden wird es automatisch erstellt!
exim Konfiguration
Im Zuge dieses Umbaus bin ich gleich auf exim4 umgestiegen. Deswegen beschreib ich exim3 nicht mehr. Auch exim4 bezieht seine Daten von der mySQL Datenbank und ist so konfiguriert, dass die stiftingtal.net-Domain zusätzlich geschaltet ist.
Für die Aliase wird wieder eine neue Tabelle erstellt:
CREATE TABLE `t_mail_aliases` (
`user_id` int(11) NOT NULL default '0',
`alias` varchar(20) NOT NULL default '',
`rcpt` varchar(60) default NULL,
PRIMARY KEY (`user_id`,`alias`)
) TYPE=MyISAM;
rcpt ist entweder NULL, dann ist es ein lokaler Alias. Oder es ist eine ganze E-Mail Adresse, die kann dann auch extern sein.
exim4 ist ganz normal zu konfigurieren wie in Debian. Ich gehe hier nur mehr auf die Änderungen ein.
In /etc/exim4/update-exim4.conf.conf ist folgendes hinzuzufügen:
dc_other_hostnames='/etc/exim4/domains_local.txt:/etc/exim4/domains_virtual.txt'
Und in /etc/exim4/domains_local.txt steht drinnen:
nobaq.net intra.nobaq.net
bzw. in /etc/exim4/domains_virtual.txt:
stiftingtal.net
In /etc/exim4/conf.d/main/02_exim4-config-options habe ich hinzugefügt:
# by Niki: Ich will diese verdammte AUTH-PLAIN!! AUTH_SERVER_ALLOW_NOTLS_PASSWORDS = MAIN_ALLOW_DOMAIN_LITERALS = domainlist virtual_domains = /etc/exim4/domains_virtual.txt STIFTINGTAL_USERS = SELECT SUBSTRING_INDEX(email,'@',1) AS local_part FROM mail_users WHERE email LIKE '${quote_mysql:$local_part}%' # MySQL defines MYSQL_SERVER=localhost MYSQL_USER=intranet MYSQL_PASSWORD=secret MYSQL_DB=intranet hide mysql_servers = "MYSQL_SERVER/MYSQL_DB/MYSQL_USER/MYSQL_PASSWORD"
Nun kommt ein Transport für stiftingtal.net dazu. Es soll einfach eine Datei mit folgendem Inhalt erstellt werden und nach /etc/exim4/conf.d/transport kopiert werden:
maildir_stiftingtal: debug_print = "T: maildir_stiftingtal for $local_part@$domain" driver = appendfile user = intranet group = intranet mode = 0600 directory_mode = 0700 mode_fail_narrower = false envelope_to_add return_path_add directory = /home/intranet/spool/${local_part}/${if eqi {${substr_0_3:$header_X-Spam-Status:}}{Yes}{.Junk}{}} create_directory maildir_format delivery_date_add
Was sofort als “Super-Feature” ins Auge sticht: Ist ein Mail als Spam markiert, wird er automatisch im Junk-Unterverzeichnis gespeichert! Es braucht also nur z.B. sa-exim mit SpamAssassin vorgeschaltet werden, das die passenden Headerzeilen hinzufügt.
Nun wird es kniffliger, denn es kommen Router dazu und bei denen ist die Reihenfolge wichtig. Der erste Router ist für die Aliase:
stiftingtal_aliases_members: debug_print = "R: virtual_aliases for $local_part@$domain" driver = redirect # domains = +virtual_domains domains = stiftingtal.net allow_fail allow_defer # data = ${lookup{$local_part}lsearch{/etc/exim4/$domain.aliases}} data = ${lookup mysql{SELECT IF(LENGTH(rcpt)>0,rcpt,u.username) FROM t_mail_aliases AS a LEFT JOIN phpbb_users AS u ON u.user_id = a.user_id WHERE a.alias LIKE '${local_part}'}} qualify_preserve_domain stiftingtal_aliases_other: debug_print = "R: stiftingtal_aliases_other for $local_part@$domain" driver = redirect domains = stiftingtal.net allow_fail allow_defer data = ${lookup{$local_part}lsearch{/etc/exim4/stiftingtal.aliases}} qualify_preserve_domain
Wie man sieht sind es in Wirklichkeit zwei. Der erste konsultiert die mySQL-Tabelle. Vorteil: Es brauchen keine Synchronisationsscripts geschrieben werden. Die Intranetseite schreibt die Aliase des Benutzers direkt in die t_mail_aliases. Der zweite Router ist noch für statische Aliases (z.B. admin)
Diesen Router benennt man am besten als “380_exim4-config_stiftingtal_aliases” damit er zwischen 300_exim4-config_real_local und 400_exim4-config_system_aliases kommt.
Der zweite Router folgt direkt danach und stellt die Mails tatsächlich ins Maildir-Verzeichnis zu. Damit der Router gleich darauf folgt, benennt man die Datei am besten 390_exim4-config_stiftingtal:
stiftingtal: debug_print = "R: stiftingtal for $local_part@$domain" driver = accept domains = stiftingtal.net # local_parts = /etc/exim4/stiftingtal.net.users local_parts = mysql;STIFTINGTAL_USERS transport = maildir_stiftingtal
Wie man auch hier sieht, kommen die Daten nicht mehr aus einer Datei, die mühevoll synchronisiert werden muss und vielleicht auch noch Race-Conditions beschert, sondern auch aus der mySQL-Datenbank (SQL-Statement wurde oben bereits definiert).
Das ganze Verzeichnis sieht nun so aus:
root@nobaq:/etc/exim4/conf.d/router # dir insgesamt 64 drwxr-xr-x 2 root root 4096 2007-02-28 01:30 . drwxr-xr-x 9 root root 4096 2007-02-19 00:00 .. -rw-r--r-- 1 root root 514 2006-04-11 13:48 00_exim4-config_header -rw-r--r-- 1 root root 648 2006-04-11 13:48 100_exim4-config_domain_literal -rw-r--r-- 1 root root 1118 2006-04-11 13:48 150_exim4-config_hubbed_hosts -rw-r--r-- 1 root root 2952 2006-04-11 13:48 200_exim4-config_primary -rw-r--r-- 1 root root 458 2006-04-11 13:48 300_exim4-config_real_local -rw-r--r-- 1 root root 741 2007-02-28 01:29 380_exim4-config_stiftingtal_aliases -rw-r--r-- 1 root root 245 2007-02-28 00:59 390_exim4-config_stiftingtal -rw-r--r-- 1 root root 1787 2007-02-19 00:06 400_exim4-config_system_aliases -rw-r--r-- 1 root root 878 2006-04-11 13:48 500_exim4-config_hubuser -rw-r--r-- 1 root root 1968 2006-04-11 13:48 600_exim4-config_userforward -rw-r--r-- 1 root root 403 2006-04-11 13:48 700_exim4-config_procmail -rw-r--r-- 1 root root 323 2006-04-11 13:48 800_exim4-config_maildrop -rw-r--r-- 1 root root 262 2006-04-11 13:48 900_exim4-config_local_user -rw-r--r-- 1 root root 472 2006-04-11 13:48 mmm_mail4root
Das wars eigentlich :-)