Hallo zusammen,
On Mon, Feb 10, 2003 at 04:07:47PM +0100, Hans Wilmer wrote:
^^^^^^
sorry, da� ich erst jetzt antworte, aber bei dem Traffic hier vergi�t man
schon mal was. :)
> On Sat, Feb 08, 2003 at 11:41:01PM +0100, Mike Dornberger wrote:
>
> > Daher ein kleines C-Programm, welches ich cyrdeliver_wrapper genannt habe:
> >
> > #include <pwd.h>
> > #include <sys/types.h>
> > #include <errno.h>
> > #include <unistd.h>
> > #include <string.h>
> >
> > int main(int argc, char *argv[]){
> > struct passwd *userinfo;
> >
> > /*if (argc != 2) return EINVAL;*/ /* invalid argument, too many/too
> > few args */
> > if (argc != 2) return ECANCELED; /* invalid argument, too many/too
> > few args; EINVAL is also returned
> > by execle */
>
> Bei Fehlern w�rde ich EX_TEMPFAIL an den MTA zur�ckgeben, damit die
> Mail nicht gleich endg�ltig abgewiesen wird.
Ich m��te mal ausprobieren, wie eigentlich cyrdeliver reagiert, wenn man es
mit fehlerhaften Argumenten aufruft und dieses Verhalten nachahmen. L�uft
aber auf eine (so oder so) fehlerhafte .procmailrc hinaus. Sollte das der
Sender einer E-Mail von mir erfahren? Gerade wenn ich da an Spam-Mail
denke... Diesen Leuten m�chte ich eigentlich nicht zeigen, da� der von ihnen
angeschriebene Account noch aktiv ist.
> > userinfo = getpwuid(getuid()); /* get user info from /etc/passwd for
> > calling user */
> > execl("/usr/sbin/cyrdeliver", "cyrdeliver", "-a", userinfo->pw_name, "-m",
> > argv[1], NULL);
>
> Funktioniert das auch bei seltsamen Namen? Das Programm sollte
> entsprechend reagieren, wenn EACCES zur�ckkommt oder -1. Siehe auch
> man errno und popen().
getopt (ich nehme mal an, da� diese Funktion von cyrdeliver verwendet wird)
sollte da� so als Argument zum Schalter -a erkennen. Da mein kleines
Programm im Prinzip "unsichtbar" zwischen procmail und cyrdeliver sitzt, (ich
mache keinen fork sondern ersetze meinen Proze� mit cyrdeliver, das dann
auch stdin, ...out usw. erbt,) soll cyrdeliver sich auch genau so beschweren,
wie es das t�te, w�re mein Programm nicht da (und man w�rde z.B. mit
globalen procmailrcs arbeiten).
> > return errno; /* if execle fails, it sets errno; see man execle or man
> > execve */
>
> siehe man errno
>
> Eine Fehlermeldung auszugeben, w�re schon irgendwie sinnvoll :)
Hm, ich habe noch nicht ausprobiert, was passiert, wenn ich cyrdeliver
umbenenne, soda� es nicht ausgef�hrt werden kann. Da es dann ein (mehr oder
weniger) permanenter Fehler ist, da� die E-Mail nicht zugestellt werden
kann, wird der MTA sich entsprechend verhalten und wom�glich die E-Mail
entweder mit "Internal server error" oder sowas bouncen oder postmaster
informieren. Wenn die E-Mail aber bounced, braucht es doch den Sender nicht
zu interessieren, da� cyrdeliver nicht ausgef�hrt werden konnte. (S.a. oben,
Spam.)
> > /* Hm, I cannot see in man page, what cyrdeliver returns... */
> >
> > }
>
> Ggf. gibt cyrdeliver einen permanenten Fehler zur�ck, wenn die Mailbox
> �ber Quota ist. Au�erdem kann (bzw. wird) es eine Fehlermeldung nach
> stdout (oder stderr?) ausgeben, die Du entsprechend an den MTA
> weiterleiten m��test, damit dieser einen Bounce mit sinnvoller
> Fehlermeldung erzeugen kann. Was es sonst noch zur�ckgibt, wei� ich
> nicht, aber ich kann mir vorstellen, da� irgendwas kommt, wenn
> z. B. die angesprochene Mailbox nicht existiert.
Nun, wenn cyrdeliver ausf�hrbar ist, kehrt der Aufruf von exec nie in mein
Programm zur�ck. Da, wie oben schon gesagt, die fds vererbt werden, brauche
ich mich um cyrdeliver->procmail nicht zu k�mmern.
Ich habe gerade nochmal in man cyrdeliver geschaut, da steht tats�chlich
nicht, was passiert, wenn die Mailbox (-m) nicht existiert. Nur was
passiert, wenn die ACLs nicht stimmen. Wird wohl ein Bugreport f�llig...
(Nunja, man k�nnte es so interpretieren: Nicht vorhandene Mailbox => User
hat f�r diese Mailbox das (p)osting-Recht nicht => deliver nach INBOX.
Selbst wenn die Logik so ist, sollte es trotzdem in der man page explizit
stehen.)
> Ob die Fehlerbehandlung mit dem zwischen MTA und cyrdeliver h�ngenden
> procmail funktioniert, sei dahingestellt ...
Ja, das w�re auch noch etwas, was ich/man ausprobieren/besser recherchieren
m��te...
> Wie stellst Du sicher, da� bei der Verwendung Deines Programms keine
> Mails verlorengehen?
Bis jetzt... nicht wirklich. Bei mir h�ngt in der .procmailrc bis jetzt
hinten ein:
:0w
| $IMAP
(Da die Generierung einer "From "-Zeile in meinem MTA abgestellt habe, da
ich ja alles im IMAP haben m�chte, kann ich nicht ohne weiteres nach
/var/mail/usermbox zustellen lassen.)
Danch sollte es wohl eine Fehlermeldung von procmail->MTA geben, wenn
cyrdeliver von meinem Programm nicht gefunden wurde. Um richtig transparent
zu werden, m��te ich hier das Verhalten von procmail nachahmen, wenn es das
Programm, welches mit | aufgerufen werden soll, nicht finden kann.
(Achso, jetzt mu� ich da noch was anf�gen, da� nach der Zeile auch kein
deliver nach /var/mail/user passiert, wenn cyrdeliver_wrapper fehlschl�gt.
S.a. Klammer oben.)
Besser w�re nat�rlich, wenn die E-Mail dann z.B. im /var/mail/user
landet oder evt. postmaster informiert wird (der dann hoffentlich nicht auch
so eine "fehlerhafte" .procmailrc besitzt *g*).
Wie immer bl�ht die Fehlerbehandlung die Sache ziemlich auf. :)
Hier also als Zusammenfassung nochmal die Punkte, die (bei mir) bis jetzt
noch offen sind:
(i) Die ~/.procmail/log sieht durcheinandergew�rfelt aus. K�nnte ein lock
Problem sein, da auch scheinbar einige Logs �ber manche E-Mails fehlen.
Vermutlich werdem beim fetchmail-Aufruf vom MTA mehrere Instanzen von
procamail gleichzeitig aufgerufen. ("Eigenen" lock-Mechanismus �ber die
.procmailrc implementieren? Bugreport?)
(ii) Auf der Konsole sehe ich nicht mehr, wenn ich neue E-Mail bekommen
habe. Die meisten Programme schauen ja nach dem Datum von z.B.
/var/mail/user oder ~/Mail/...
(iii) Sollte man einen lokalen User ins Killfile gesteckt haben, kann er
einen trotzdem in der INBOX nerven. :)
(iv) K�nnen E-Mails verloren gehen? (Fehlerbehandlungen: keine Messages ohne
"From "-Zeile d�rfen in der /var/mail/usermbox landen; was machen, wenn
der Aufruf von cyrdeliver nicht klappt; ...)
Naja, wenn die Punkte mal abgehakt sind, schreibe ich vielleicht mal ein
fetchmail->MTA(exim)->procmail->cyrus imapd(v. 1.5.19) - (mini)HOWTO. Da ich
bis jetzt aber mit den Punkten (au�er (i)) leben kann (und eigentlich
schonmal recht zufrieden bin), wird das wohl aber noch eine Weile dauern. :)
Gr��e,
Mike
--
Haeufig gestellte Fragen und Antworten (FAQ):
http://www.de.debian.org/debian-user-german-FAQ/
Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject "unsubscribe". Probleme? Mail an [EMAIL PROTECTED] (engl)