[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Procmail und exim-Probleme



Am 27.02.2003 21:52:57, Peter Blancke schrieb:
> Am 27.02.2003 13:34:11, Peter Blancke schrieb:
> 
> > Es geht um das Einlaufen von Mails auf einem externen Mailserver
> > fuer viele User, die von Root vom externen Mailserver abgeholt
> > werden und per Procmail an die lokalen User verteilt werden
> > sollen.
> 
> Ich melde mich Ende naechster Woche mit dieser Loesung, sofern
> diese laeuft.

Hier die versprochenen funktionierenden Loesungsansaetze:

Da ich gerne selbstdefinierte User (und keine vom System
eingerichteten User) verwende, habe ich fuer die vorbeschriebene
Aufgabe einen User "mailerdaemon" eingerichtet.

Fuer den Loesungsansatz verwende ich als Beispiel die Domain
"domain.tld".

In /home/mailerdaemon habe ich zunaechst fuer das Abholen der Mails
folgende Datei eingerichtet:

,---[ /home/mailerdaemon/.fetchmailrc ]
| poll mailserver.domain.tld protocol pop3 \
| username meinname password meinpasswort \
| mda "/usr/bin/procmail ~/.procmailrc-domain1"
`---

Das bewirkt, dass die Mails hereingeholt werden und an Procmail
uebergeben werden. Die zusaetzliche Angabe der Datei
"procmailrc-domain1" bewirkt, dass ich mit dem gleichem User
"mailerdaemon" weitere Domains hereinhole, die ganz anderen Regeln
folgen koennen.

Nachdem die Mails hereingekommen sind, werden sie den
Procmail-Regeln uebergeben. Da ich festgestellt habe, dass mitunter
die Mailheader mal nach "Envelope", mal nach "To" beschrieben
werden, sieht meine Procmail-Steuerdatei folgendermassen aus:

,---[ /home/mailerdaemon/.procmailrc-domain1 ]
| # Zunaechst einige Regeln fuer Spamassasin, koennen wir hier
| # uebergehen, da Spamassasin in einem anderen Thread gerade
| # behandelt wird.
| 
| # Wo liegt der Sendmailer Exim?
| SENDMAIL="/usr/sbin/exim"
| 
| # Den Absender der Mail herausholen
| FROM=`formail -xFrom: | sed -e 's/ *(.*)//; s/>.*//; s/.*[:<] *//; s/ //'`
| 
| # Einen weiteren X-Delivered-Header setzen
| :0 fw
| | formail -I "X-Delivered:"
| 
| # Den ersten User "user1" herausfiltern
| :0 c
| * (^Envelope-to.* user1@domain.tld|^TO_.*user1@domain.tld)
| | $SENDMAIL -bm -f $FROM user1@domain.tld
| :0 fw
| * (^Envelope-to.* user1@domain.tld|^TO_.*user1@domain.tld)
| | formail -A "X-Delivered: user1"
| 
| # Den zweiten User "user2" herausfiltern
| :0 c
| * (^Envelope-to.* user2@domain.tld|^TO_.*user2@domain.tld)
| | $SENDMAIL -bm -f $FROM user2@domain.tld
| :0 fw
| * (^Envelope-to.* user2@domain.tld|^TO_.*user2@domain.tld)
| | formail -A "X-Delivered: user2"
| 
| # weitere User bis user n
| # ...
| 
| # Jetzt ein kleines Schmankerl, mit dem man die IP-Situation
| # mitgeteilt bekommen kann, falls mal gerade dyndns.org versagt hat
| # (was bei mir alle viertel Jahr einmal vorkommt)
| :0
| * (^Envelope-to.* ip-situation@domain.tld|^TO_.*systemecho@domain.tld)
| | /sbin/ifconfig | mail -s "ECHODIENST" $FROM -- -f ip-situation@domain.tld
| 
| # Zugestellte Nachrichten koennen jetzt geloescht werden
| :0
| * ^X-Delivered
| /dev/null
| 
| # Was noch uebrigbleibt, sind unbekannte User, Verschreiber u. a.
| # Die Mails werden dem Chef des Hauses zugestellt. Der kann
| # sehen, was er damit macht. Bitte jetzt keinen Rechtsstreit!
| :0
| | $SENDMAIL -bm -f $FROM chef@domain.tld
`---

Damit ich diese Procmail-Regeln pflegeleicht erstellen und erweitern
kann, gibt es zunaechst eine einfache Datei namens
".procmail_empfaenger-domain1", in welcher saemtliche Mailempfaenger
des Systems eingetragen werden.  Die Datei sieht lediglich so aus:

,---[ /home/mailerdaemon/.procmail_empfaenger-domain1 ]
| ich
| chef
| user1
| user2
| user-n
`---

Diese Datei wird von einem Skript namens
".procmail_generate-domain1" ausgewertet, die ihrerseits die
".procmailrc-domain1" erstellt. Das Skript sieht folgendermassen
aus:

,---[ /home/mailerdaemon/.procmail_generate-domain1 ]
| #/bin/sh
| 
| # .procmail_generate-domain1
| # Erzeugen der ~/.procmailrc-domain1 von einer Liste von
| # Empfaengern. Die Empfaenger muessen in ${MAILERS} eingetragen sein.
| #
| # (c) 1999-2003 by Peter Blancke
| # Autor: Peter Blancke <rechenzentrum@blancke.de>
| #
| 
| GENERATE=~/.procmailrc-domain1
| DOMAIN="domain.tld"
| MAILERS=~/.procmail_empfaenger-domain1
| SENDMAIL="/usr/sbin/exim"
| DEFAULTMAILER=chef
| 
| # **********************************************
| # AB HIER KEINE AENDERUNGEN MEHR VORNEHMEN     *
| # **********************************************
| 
| echo ".procmailrc-domain1-generator"
| echo "(c) 1999-2003 by Peter Blancke"
| 
| echo -n Moment...
| 
| FEHLENDE=""
| 
| # Feststellen, ob es Eintraege gibt, die nicht als User
| # angelegt wurden.
| for i in `cat ${MAILERS}`; do
|   id $i > /dev/null 2>&1 || FEHLENDE="${FEHLENDE} ${i}"
| done
| 
| echo
| 
| # Fehlen User?
| if test -n "${FEHLENDE}" ; then
|   echo "${GENERATE} kann nicht erstellt werden."
|   echo "Nachfolgende User gibt es nicht:"
|   for i in ${FEHLENDE}; do
|     echo -e "\t$i"
|   done
|   exit -1
| fi
| 
| # .procmailrc-domain1 anlegen
| echo "" > ${GENERATE}
| 
| # Zeilen fuer Spamassin einfuegen (hier weggelassen)
| # ...
| 
| # Wo ist SENDMAIL/EXIM?
| echo "SENDMAIL=\"${SENDMAIL}\"" >> ${GENERATE}
| echo >> ${GENERATE}
| 
| # Mailabsender nach FROM kopieren
| echo "FROM=\`formail -xFrom: | \
|       sed -e 's/ *(.*)//; s/>.*//; s/.*[:<]*//; s/ //'\`" \
|       >> ${GENERATE}
| echo >> ${GENERATE}
| 
| # Setze alle Mails auf "X-Delivered"
| echo ":0 fw" >> ${GENERATE}
| echo "| formail -I \"X-Delivered:\"" >> ${GENERATE}
| echo "" >> ${GENERATE}
| 
| # Die Usereintraege jetzt erzeugen
| 
| for i in `cat ${MAILERS}`; do
| 
|   echo Erzeuge ${i} ...
| 
|   # Mailzustellung
|   echo ":0 c" >> ${GENERATE}
|   echo "* (^Envelope-to.* ${i}@${DOMAIN}|^TO_.*${i}@${DOMAIN})" \
|        >> ${GENERATE}
|   echo "| \${SENDMAIL} -bm -f \${FROM} ${i}@localhost" \
|        >> ${GENERATE}
| 
|   # Mail als "delivered" kennzeichnen
|   echo ":0 fw" >> ${GENERATE}
|   echo "* (^Envelope-to.* ${i}@${DOMAIN}|^TO_.*${i}@${DOMAIN})" \
|        >> ${GENERATE}
|   echo "| formail -A \"X-Delivered: $i\"" >> ${GENERATE}
| 
|   # Ein bisschen was fuer die Lesbarkeit
|   echo "" >> ${GENERATE}
| 
| done
| 
| # Und hier die IP-Mitteilung durch das System...
| ADR="ip-situation"
| echo ":0" >> ${GENERATE}
| echo "* (^Envelope-to.* ${ADR}@${DOMAIN}|^TO_.*${ADR}@${DOMAIN})" \
|      >> $GENERATE
| echo "| /sbin/ifconfig \
|       | mail -s \"ECHODIENST\" \${FROM} -- -f${ADR}@${DOMAIN}" \
|       >> ${GENERATE}
| echo "" >> ${GENERATE}
| 
| # Delivered-Mails nach /dev/null
| echo ":0" >> ${GENERATE}
| echo "* ^X-Delivered" >> ${GENERATE}
| echo "/dev/null" >> ${GENERATE}
| echo "" >> ${GENERATE}
| 
| # Und der Rest an den Chef
| echo ":0" >> ${GENERATE}
| echo "| \${SENDMAIL} -bm -f \${FROM} ${DEFAULTMAILER}@localhost" \
|      >> ${GENERATE}
| echo "" >> ${GENERATE}
| 
| # Und immer nett sein!
| echo "Prima! Die procmailrc-domain1 wurde erzeugt!"
`---

Ich weiss, dass etliche meiner ${VARIABLEN}-Konstruktionen nicht
noetig sind, es ist einfach Gewohnheit bei mir. Auch liessen sich
die Procmail-Regeln durch entsprechende Klammerung uebersichtlicher
und einfacher gestalten. Das folgt spaeter.

Dieses Skript laesst sich leicht fuer weitere Domains kopieren.
Daraus lassen sich dann weitere Procmail-Regeln erzeugen.

Auf einem Kundenserver verwalte ich damit fuenf Domains problemlos.

BTW: Damit der User "mailerdaemon" ueberhaupt in der Lage ist, Exim
     mit dem Zusatz "-f" aufzurufen, muss er als "vertrauter User"
     in die Exim-Config eingetragen werden, sonst wird der
     veraenderte FROM-Eintrag nicht akzeptiert. Der Eintrag findet
     sich unter "trusted_users".

Der User "mailerdaemon" holt jetzt per Crontab regelmaessig die
Mails rein und verteilt sie korrekt. Root wurde von dieser Aufgabe
aus Sicherheitsgruenden befreit.

Gerne hoere ich Meinungen zu meinen Ideen.

Gruss

Peter Blancke

-- 
Nachtwaechter ist der Wahnsinn, weil er wacht...



Reply to: