cyrusv2 und nicht-existente User

Diesen Beitrag schrieb ich 16 Jahre und 11 Monate zuvor; die nachfolgenden Ausführungen müssen heute weder genau so nach wie vor funktionieren, noch meiner heutigen Meinung entsprechen. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 1 Minute

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

Anschließend 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!

Eure Gedanken zu „cyrusv2 und nicht-existente User“

Ich freue mich über jeden Kommentar, es sei denn, er ist blöd. Deshalb behalte ich mir auch vor, die richtig blöden kurzerhand wieder zu löschen. Die Kommentarfunktion ist über GitHub realisiert, weshalb ihr euch zunächst dort einloggen und „utterances“ bestätigen müsst. Die Kommentare selbst werden im Issue-Tracker und mit dem Label „✨💬✨ comment“ erfasst – jeder Blogartikel ist ein eigenes Issue. Über GitHub könnt ihr eure Kommentare somit jederzeit bearbeiten oder löschen.