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

Creative Commons-Lizenzvertrag 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.