cyrusv2 und nicht-existente User
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!