Hi, In my site, I send a lot of emails to users. I'd like to build a software to detect bouncing email, and automatically take some actions, like removing the user from the database. I'm considering using mailman code to do it. Why build, if you can steal?:-)
I have two options: 1. Do a hack, copying and pasting some of mailman code to do it. 2. Build some auxiliary classes around mailman code so other people can also use it.
Sure, I prefer number 2. It also has the technical advantage that I can incorporate mailman improvements in bounce detection. I'm writing to hear some opinions about it. Is it feasible?
After a quick look in the code, here is my approach. I would like very much to hear people more knowledgeable about Mailman code criticize it.
There's two spots that handle bouncing email. The files in directory Bouncers/ identify if a message is a bounce. Calling BounceAPI.py with a message instance and a list instance calls the RegisterBounce method in list if the email is a bounce.
Bouncer.py is the mix-in class that handle the bounces and calls some methods of its sibiling and subclasses (e.g. IsMember and Save).
I'd put a pipe in the alias file to pass it to a simple program that builds the message object, the list object and pass them to BounceAPI.
Subclass Bouncer class in Bouncer.py to redefine list objects methods that would be defined in other classes. Some would be dummy methods, others do the real action.
Any opinions? Is there any trap?
thanks in advance,
Paulo Eduardo Neves maito:neves@samba-choro.com.br
"PEN" == Paulo Eduardo Neves <neves@samba-choro.com.br> writes:
PEN> Hi, In my site, I send a lot of emails to users. I'd like to
PEN> build a software to detect bouncing email, and automatically
PEN> take some actions, like removing the user from the
PEN> database. I'm considering using mailman code to do it. Why
PEN> build, if you can steal?:-)
Absolutely! And feel free to contribute back any new bounce dectectors you develop; it's a never ending battle with MTA authors who feel the need to be clever and unique. ;/
PEN> After a quick look in the code, here is my approach. I would
PEN> like very much to hear people more knowledgeable about
PEN> Mailman code criticize it.
PEN> There's two spots that handle bouncing email. The files in
PEN> directory Bouncers/ identify if a message is a
PEN> bounce. Calling BounceAPI.py with a message instance and a
PEN> list instance calls the RegisterBounce method in list if the
PEN> email is a bounce.
PEN> Bouncer.py is the mix-in class that handle the bounces and
PEN> calls some methods of its sibiling and subclasses
PEN> (e.g. IsMember and Save).
PEN> I'd put a pipe in the alias file to pass it to a simple
PEN> program that builds the message object, the list object and
PEN> pass them to BounceAPI.
PEN> Subclass Bouncer class in Bouncer.py to redefine list objects
PEN> methods that would be defined in other classes. Some would be
PEN> dummy methods, others do the real action.
PEN> Any opinions? Is there any trap?
I think this is more work than you need to do actually. If you look at ScanMessages() in BouncerAPI.py, it really does two things:
iterate through the list of bounce detectors until one of them returns a match
calls into the MailList object to "register" the bouncing addresses
#2 probably has little use for you outside the context of Mailman, so if all you're interested in is the bounce detection framework, I'd say you should just re-implement ScanMessages() to do something more useful for your application.
Forget the MailList instance; all you really need is a Message object. I think, but am not positive, that Python's standard rfc822.Message class should suffice here, although you'll need to be sure that file object you pass to the constructor is rewindable. Some sys.stdins are not, and if that's the case for you, I suggest reading all of sys.stdin into a StringIO instance and passing /that/ to the rfc822.Message constructor.
You'll probably need to change the __import__() call in ScanMessages() because your copy probably won't live in the Mailman.Bouncers package.
The API to the individual bounce detectors is this:
- the module must have a module-global function called process()
- process() must take a single argument, the Message object
- process() returns None (or any false value) to indicate it could not find a matching address in the message
- process() returns a list of matching addresses if it does find a match
The algorithm in ScanMessages() simply iterates through every bounce detector until one of them returns a non-false value. Given that list of addresses, you can then do whatever is appropriate for your application.
Hope that helps, -Barry
participants (2)
-
bwarsaw@beopen.com
-
Paulo Eduardo Neves