Konsole

wall < "cyrusv2 und nicht-existente User"

Broadcast message from spillerm@unixe.de (pts/1) (Fr Dez 14 14:54:09 2007):
4
Diesen Beitrag schrieb ich vor 11 Jahren. Behalte das beim Lesen bitte im Hinterkopf.

Eine Sache, die verdammt nervig ist: sendmail nimmt Mail entgegen, und als confLOCAL_MAILER ist cyrusv2 definiert; sendmail übergibt diese Mails, jedoch prüfen weder er noch der cyrus, ob die Empfängeradresse tatsächlich existiert. Existiert sie nicht, wird postmaster benachrichtigt — was im Ernstfall für einen Overhead von mehreren 100 Mails pro Tag führen kann.

Schauen wir uns das einmal genauer an; ich habe einen User mary, der eine lokale cyrus-Mailbox hat; den User blafasel gibt es nicht.

$ /usr/sbin/sendmail -bv mary
mary... deliverable: mailer cyrusv2, user mary
$ /usr/sbin/sendmail -bv blafasel
mary... deliverable: mailer cyrusv2, user blafasel

Sprich: dem sendmail ist es völlig egal, der schiebt alles an cyrus weiter. Um das zu verhindern, sind einige Änderungen an der Konfiguration nötig — in erster Linie benötigen wir ein zusätzliches FEATURE-File für den sendmail:

$ cd /usr/share/sendmail-cf/feature/
$ wget http://www.bsdbox.de/downloads/emailserver/ckuser_cyrus.m4

In meinem Fall musste dieses File ein wenig modifiziert werden; mein cyrus (unter Fedora) legt all seine sockets nach /var/lib/imap/socket/, das File gibt einen anderen Default-Wert aus:

14c14
<         ifelse(len(X`'_ARG_), `1', `local:/var/lib/imap/socket/smmapd', _ARG_))
---
>         ifelse(len(X`'_ARG_), `1', `local:/var/imapd/socket/smmapd', _ARG_))

Also den Pfad zum Socket entsprechend anpassen und sich merken (!). Als nächstes muss die Konfiguration des sendmail angepasst werden; hierzu wird die sendmail.mc editiert und ziemlich am Ende (nach define(confLOCAL_MAILER',cyrusv2')dnl) folgendes hinzugefügt:

FEATURE(`ckuser_cyrus')dnl

Anschliessend die sendmail.cf neu generieren:

$ m4 sendmail.mc > sendmail.cf

Zuletzt muss auch dem cyrus gesagt werden, dass er etwas mit diesem Socket zu tun hat; anzupassen ist /etc/cyrus.conf, meine sieht beispielsweise nun so aus:

START {
  recover       cmd="ctl_cyrusdb -r"
  idled         cmd="idled"
}
SERVICES {
  ##imap       cmd="imapd" listen="imap" prefork=5
  imaps        cmd="imapd -s" listen="imaps" prefork=1
  ##pop3       cmd="pop3d" listen="pop3" prefork=3
  pop3s        cmd="pop3d -s" listen="pop3s" prefork=1
  ##sieve      cmd="timsieved" listen="sieve" prefork=0
  ##nntp       cmd="nntpd" listen="nntp" prefork=3
  ##nntps      cmd="nntpd -s" listen="nntps" prefork=1
  ##lmtp       cmd="lmtpd" listen="lmtp" prefork=0
  lmtpunix     cmd="lmtpd" listen="/var/lib/imap/socket/lmtp" prefork=1
  smmapd       cmd="smmapd" listen="/var/lib/imap/socket/smmapd" prefork=1
  ##notify     cmd="notifyd" listen="/var/lib/imap/socket/notify" proto="udp" prefork=1
}
EVENTS {
  checkpoint   cmd="ctl_cyrusdb -c" period=30
  delprune     cmd="cyr_expire -E 3" at=0400
  tlsprune     cmd="tls_prune" at=0400
  squatter     cmd="/usr/lib/cyrus-imapd/squatter -r *" period=120
}

Nun den cyrus neu starten — aufmerksam das Logfile beobachten! Kommen keine Fehlermeldungen (beziehungsweise nach Behebung eventueller Fehler) kann nun auch der sendmail durchgestartet werden. Auch hier alles okay? Nun denn — ein Testlauf:

$ /usr/sbin/sendmail -bv mary
mary... deliverable: mailer cyrusv2, user mary
$ /usr/sbin/sendmail -bv blafasel
blafasel... Mailbox is not available.

That’s great!

4