The reason turned out to be dependent wether Python 1.5 (the early version, of course) was made with threads or not. The threaded version had a bad effect on sys.stdin after an os.fork(). sys.stdin was a "bad file number" in the child process. Maybe these are known things, but there are some issues:
To the Mailmen: It was quite hard to track this error down through the mailman scripts. Finally, I ended up if I made the deliver fork temporarily into a do-nothing. The "deliver" script does a number of forks. I does no proper checking if the forks work (under Linux, btw., fork never returns ENOMEM, so the check isn't safe yet).
I don't understand -- "forker(tries)" in the "deliver" script tries fork()ing, catches any exceptions raised, and re-raises them if a) the error causing the exception weren't EAGAIN or b) this were failed fork() number "tries"+1.
Catching the exception is about as far as you can go to "check if the forks work", IMHO -- when fork() stops working, there usually aren't very many clever things worth doing (short of giving up), are there?
Deliverer.py also trusts the os.popen very much.
Well, os.popen() should bail out by raising os.error whenever it's behaving "untrustworthy", shouldn't it?
Anyway, sys.stdin is read without error checking in the deliver script. I think, some more checks are necessary to guarantee that failing deliveries get noticed.
I don't think I have understood enough of the problem to fix this properly, so any suggestions on exactly _what_ those extra checks should check for would be nice :)