Dieser Text befindet sich inhaltlich auf dem Stand des Jahres 2004 und wird nicht mehr gepflegt oder aktualisiert. Er ist in jeder Hinsicht veraltet und steht nur noch zu Dokumentationszwecken online.
Confixx wurde - zumindest auf den "Rootservern" von 1&1 - standardmäßig nicht mit Exim, sondern (früher) mit sendmail oder (heute) mit Postfix ausgeliefert. Dennoch kann man natürlich auch Exim mit dem System ans Laufen bekommen, wenn auch vielleicht nur über Umwege.
Eine mögliche Lösung (für ein auf sendmail abgestelltes Confixx 2.x und einen Exim 3.x), die ich selbst verwendet habe, möchte ich hier vorstellen. Sie erhebt keinen Anspruch darauf, die beste denkbare oder auch nur einigermaßen elegant zu sein - aber sie hat einige Jahre funtioniert. - Eine andere mögliche Lösung für Confixx 3.x und Exim 4.x bietet sich, wenn man mit Exim direkt die MySQL-Datenbank von Confixx ausliest, man also Exim mit MySQL einsetzt.
Für Exim 4.x müssen ggf. die Schnippsel aus der exim.conf
angepasst
werden; das sollte aber für jemanden, der sich mit Exim auskennt,
kein Problem sein. Falls das Confixx nicht für sendmail,
sondern für Postfix eingerichtet wurde, wie dies bei neueren 1&1-
"Rootservern" der Fall ist, müssen die vorhandenen Dateien ggf. etwas anders
geparst werden; damit beschäftigt sich der letzte Teil dieser Seite.
Ich möchte noch darauf hinweisen, dass es mir hier eher um die Vorstellung des Konzepts als eine plug&play-Lösung geht; man sollte also bitte nachzuvollziehen versuchen, was man da tut, und nicht einfach alles 1:1 kopieren und dann loslegen.
Vorbemerkungen
Confixx generiert beim Anlegen von Mailaccounts bzw. Mailadressen
zwei Dateien - eine, die die Domains enthält, für die Mail anzunehmen ist,
und eine, die die Mailadressen enthält. Für die sendmail-Variante
sind das sendmail.cw
und virtusertable
; diese werden in derselben Art
wie bspw. /etc/passwd
und /etc/shadow
von Confixx bei jeder
Änderung an den Mailadressen beim Durchlauf des Counterscripts aus der
Confixx-Datenbank generiert und auch in /root/confixx/safe
zwischengespeichert, und zwar als /root/confixx/safe/sendmail.cw.tmp
und
/root/confixx/safe/virtusertable.tmp
. Danach wird /usr/sbin/makemap
und
/usr/bin/newaliases
aufgerufen, die aus den Textdateien die für
sendmail verwendbaren DBs generieren.
Diese Dateien müssen nun so angepasst werden, dass sie für Exim
verwendbar werden; das Format ist dabei nicht ganz identisch. Ich habe mir
so beholfen, dass ich zu diesem Zweck ein kleines Perlscript geschrieben
habe, dass die Dateien ausliest und neue, passende Dateien generiert. Dieses
Script kann man dann entweder alle x Minuten als Cronjob starten, mit der
Folge, dass Änderungen an den Mailadressen auch nur in diesen Abständen
propagiert (und die Dateien sehr oft unnötig neugeschrieben) werden, man
verwendet/zweckentfremdet eines der aus Confixx aufgerufenen, oben
genannten Scripts (makemap
oder newaliases
). Diese werden von
Confixx nur bei Bedarf aufgerufen.
Danach braucht es in Exim dann nur einen bzw. mehrere passende(n) Director(s).
Implementation
Ich bin so vorgegangen, dass ich die Liste der lokalen Domains abweichend von der vorgesehenen Variante nur aus den Domains generiere, für die auch Mailadressen angelegt sind; andere Domains kennt Exim dann gar nicht als lokal. Außerdem habe ich vorgesehen, dass auch Domains als lokal verfüttert werden können, die in Confixx gar nicht vorhanden sind (oder für die jedenfalls keine Mailadressen angelegt sind); das kann sinnvoll sein, wenn man bspw. auch einen Mailinglistenserver o.ä. betreibt, dessen Adressen dann ja nicht über Confixx angelegt werden sollen.
Dann habe ich ein Script makemail.pl
, das mit dem Parametern --aliases
oder --domains
aufgerufen werden kann und auf STDIN
die virtusertable
erwartet, aus der es dann entweder die Liste der Mailadressen oder eben die
der als lokal zu behandelnden Domains generiert. Dazu dann noch ein
copyfiles.sh
, das makemail.pl
zweimal mit den jeweils passenden
Parametern aufruft (und zudem noch dafür sorgt, dass auch die von
Confixx angelegten "Verteiler" - für den Fall, dass eine Mailadresse
mehr als eine Weiterleitung hat - richtig übernommen werden). Und
schließlich domains-template
, mit den Domains, die zusätzlich als lokal
behandelt werden sollen. Nach dem Aufruf von copyfiles.sh
hat's dann drei
Dateien, mit denen Exim arbeiten kann:
confixx-domains
confixx-aliases
confixx-verteiler
copyfiles.sh
kann man entweder alle x Minuten per Cronjob aufrufen oder
auch in bspw. /usr/sbin/makemap
umbenennen oder symbolisch verlinken; dann
wird's automagisch bei Änderungen von Confixx aus gestartet.
copyfiles.sh
copyfiles.sh
ruft makemail.pl
auf und grept durch /etc/mail/aliases
nach den Confixx-Verteilern.
#!/bin/sh
# Confixx-Dateien fuer Exim kopieren
/etc/exim/makemail.pl --aliases < /root/confixx/safe/virtusertable.tmp > /etc/exim/confixx-aliases
grep confixx-du /etc/mail/aliases > /etc/exim/confixx-verteiler
cp /etc/exim/domains-template /etc/exim/confixx-domains
/etc/exim/makemail.pl --domains < /root/confixx/safe/virtusertable.tmp >> /etc/exim/confixx-domains
# Statt der letzten Zeiel geht alternativ auch:
# cat /root/confixx/safe/sendmail.cw.tmp >> /etc/exim/confixx-domains
# Dann hat man alle in Confixx angelegten Domains als lokal.
makemail.pl
makemail.pl
liest eine virtusertable
aus, die per STDIN
hineingepiped
wird, und gibt auf STDOUT
dann die Domains oder Aliases aus. (Ja, der Code
ist alles andere als elegant und sicherlich maximal verbesserungsfähig - es
war damals ein Hack, und wie es so oft ist: solange es funktioniert,
funktioniert es eben … Zumindest die Idee sollte aber rüberkommen;
verbessern kann's dann jeder selber.)
#!/usr/bin/perl -w
####
# makemail.pl
# -thh 020817
$type = shift (@ARGV);
if (!defined($type) or $type ne '--aliases' and $type ne '--domains') {
die "Usage: $0 --aliases OR $0 --domains\n";
};
while (<>) {
local ($address,$target,$lhs,$rhs);
($address,$target) = split;
($lhs,$rhs) = split /\@/, $address;
if (!grep /^$rhs$/, @domains) {
push @domains, $rhs;
};
if ($lhs eq '') {
if ($target ne 'error:nouser') {
$catchall{$rhs} = $target;
}
} elsif ($type eq '--aliases') {
print "$lhs\@$rhs \t $target\n";
};
};
foreach $domain (@domains) {
if ($type eq '--aliases') {
if (exists($catchall{$domain})) {
print "*\@$domain\t".$catchall{$domain}."\n";
};
} else {
print "$domain\n";
};
};
exim.conf
your.host.pureserver.info
ist jeweils passend durch den eigenen Hostnamen
zu ersetzen.
In den Abschnitt "main" kommen die lokalen Domains:
######################################################################
# MAIN CONFIGURATION SETTINGS #
######################################################################
[...]
local_domains = your.host.pureserver.info:localhost : /etc/exim/confixx-domains
Der Abschnitt "transports" sollte eigentlich schon den folgenden Eintrag haben:
######################################################################
# TRANSPORTS CONFIGURATION #
######################################################################
# ORDER DOES NOT MATTER #
# Only one appropriate transport is called for each delivery. #
######################################################################
[...]
local_delivery:
driver = appendfile
file = /var/spool/mail/$local_part
delivery_date_add
envelope_to_add
return_path_add
[...]
Der Abschnitt "directors" braucht mindestens die folgenden Einträge, die auch in der richtigen Reihenfolge stehen müssen:
######################################################################
# DIRECTORS CONFIGURATION #
# Specifies how local addresses are handled #
######################################################################
# ORDER DOES MATTER #
# A local address is passed to each in turn until it is accepted. #
######################################################################
# This director handles aliasing using a traditional /etc/aliases file.
# system aliases nur fuer local host (siehe "domains")
system_aliases:
driver = aliasfile
file = /etc/aliases
search_type = lsearch
domains = your.host.pureserver.info
user = exim
file_transport = address_file
pipe_transport = address_pipe
# director fuer Confixx-Verteiler 'confixx-du*'
confixx_verteiler:
driver = aliasfile
file = /etc/exim/confixx-verteiler
search_type = lsearch
domains = your.host.pureserver.info
user = exim
file_transport = address_file
pipe_transport = address_pipe
# kann man, wenn man will ...
userforward:
driver = forwardfile
file = .forward
condition = ${if exists {$home/.forward} {yes} {no}}
no_verify
no_expn
check_ancestor
suffix = +*
suffix_optional
filter
file_transport = address_file
pipe_transport = address_pipe
reply_transport = address_reply
# Dieser director wertet jetzt confixx-aliases aus
confixx_aliases:
driver = aliasfile
file = /etc/exim/confixx-aliases
search_type = lsearch*@
include_domain
suffix = +*
suffix_optional
user = exim
file_transport = address_file
pipe_transport = address_pipe
# Dieser director liefert schließlich in lokale
# Mailboxen aus, also final an web1p42@localhost bzw.
# web1p42@your.host.pureserver.info
localuser:
domains = your.host.pureserver.info
driver = localuser
transport = local_delivery
Änderungen für Postfix
Wenn Confixx von Haus aus eigentlich mit Postfix zusammenarbeiten
sollte (wie bei neueren 1&1-"Rootservern"), ergeben sich einige Änderungen.
Statt /root/confixx/safe/sendmail.cw.tmp
brauchen wir
/etc/postfix/confixx_localDomains
und statt
/root/confixx/safe/virtusertable.tmp
ist es
/etc/postfix/confixx_virtualUsers
. Schließlich wird dann auch
/usr/sbin/postmap
aufgerufen, um die geänderten Dateien zu hashen; ggf.
muss man also seinen symbolischen Link auf copyfiles.sh
von dort aus
legen.
Bei Verwendung der makemail.pl
wie oben braucht's dann keine weiteren
Änderungen; will man lieber alle in Confixx angelegten Domains als
lokale Domains haben, dann reicht es allerdings nicht mehr, die
confixx_localDomains
einfach zu kopieren; man muss hier jetzt das
"confixx" nach dem Domainnamen in jeder Zeile entfernen. Das zu parsen
sollte allerdings trivial sein. :)
Dieser Text befindet sich inhaltlich auf dem Stand des Jahres 2004 und wird nicht mehr gepflegt oder aktualisiert. Er ist in jeder Hinsicht veraltet und steht nur noch zu Dokumentationszwecken online.
Lizenz
Dieser Inhalt ist unter der Creative Commons-Lizenz BY-NC-SA 4.0 DE lizenziert; er darf unter Namensnennung des Autors nicht-kommerziell weitergegeben und auch bearbeitet werden, soweit das neue Werk gleichfalls wieder dieser Creative-Commons-Lizenz unterliegt. Die Einzelheiten ergeben sich aus dem Lizenzvertrag.