Debian Mailsystem: Unabhängige “Domain” zum Standardsystem: Unterschied zwischen den Versionen

Aus NOBAQ
Zur Navigation springenZur Suche springen
Zeile 131: Zeile 131:
  
 
  stiftingtal_aliases_members:
 
  stiftingtal_aliases_members:
debug_print = "R: virtual_aliases for $local_part@$domain"
+
debug_print = "R: virtual_aliases for $local_part@$domain"
driver = redirect
+
driver = redirect
# domains = +virtual_domains
+
# domains = +virtual_domains
domains = stiftingtal.net
+
domains = stiftingtal.net
allow_fail
+
allow_fail
allow_defer
+
allow_defer
# data = ${lookup{$local_part}lsearch{/etc/exim4/$domain.aliases}}
+
# 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}'}}
+
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
+
qualify_preserve_domain
 
   
 
   
 
  stiftingtal_aliases_other:
 
  stiftingtal_aliases_other:
debug_print = "R: stiftingtal_aliases_other for $local_part@$domain"
+
debug_print = "R: stiftingtal_aliases_other for $local_part@$domain"
driver = redirect
+
driver = redirect
domains = stiftingtal.net
+
domains = stiftingtal.net
allow_fail
+
allow_fail
allow_defer
+
allow_defer
data = ${lookup{$local_part}lsearch{/etc/exim4/stiftingtal.aliases}}
+
data = ${lookup{$local_part}lsearch{/etc/exim4/stiftingtal.aliases}}
qualify_preserve_domain
+
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"
+
debug_print = "R: stiftingtal for $local_part@$domain"
driver = accept
+
driver = accept
domains = stiftingtal.net
+
domains = stiftingtal.net
# local_parts = /etc/exim4/stiftingtal.net.users
+
# local_parts = /etc/exim4/stiftingtal.net.users
local_parts = mysql;STIFTINGTAL_USERS
+
local_parts = mysql;STIFTINGTAL_USERS
transport = maildir_stiftingtal
+
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 :-)