Design notes about Sierra


Yo, I've just read a lot of Herbert Kornfeld (The Onion) again and so if this file has a distinctly casual tone its to blame, but before I get started shouts going out to all ma dogs in Accountz Reeceevable and those bitcthez in payroll, keep the accounting clean and the balance green. Ya all know what I'm saying.


So, Sierra is a mailing list manager. Mailing lists managers process incoming mail. They may process it in various ways, but its all just mail processing goddamit!

Computers use Inputs and they provide Outputs, they also use storage. Thats really what they do, any MLM that runs on a computer will do the same.

The inputs will be incoming mails, the outputs will be outgoing mails. Storage well thats just stuff innit?

Of course there is also all the web shit, but I'm ignoring that for now.

So just for any of the slow kids at the back of the class mail comes in, it gets processed (maybe some storage ops go on) and then it gets output to somewhere (or not). It's not rocket science and hence MLM software doesn't need to be rocket science.


So mail hits the localhost's SMTP, now we don't want to tinker around with loadable modules or any of that sheeit, lets ignore any optimisations for now.

So it comes to various addresses, lets say we have a mailing list called (Accounts Receivable Posse), now if have arp as really an alias for sierra then mail will get sent to sierra instead. So it arrives there and being a good mail system it looks for a .forward file, whats this it finds? why its , the entry point to the Sierra system, now might be very simple, something like

        use Sierra::Listener qw(process);

        my $mail = join ('',(<>));
        return 1;

of course later on it can be SOAPafied or some shit if speed is an issue with the main process, but on day 1 we don't care, we only really care about whats going to happen in process().

So what is going to happen in process? Well something like this,

    sub process {
        my ($mailraw) = @_;
        my $mail  = Sierra::Mail->new($mailraw);
        my $group = Sierra::Group->load_by_email($mail->{dest_address});
        # All in the other stuff MLM's do

        for (@{$group->get_addresses_of_people_who_actually_want_this_shit()}) {

and thats basically it. Jobs a good 'ne.

Ok, there's all the shit in the middle, such as handling digests, rejecting mails from ponces not on all the mailing list, removing stupidly long company added .sig's for people who want it done, etc. etc.

So the nice simple process sub becomes a big pile of steaming business logic. As more and more whiners^w people with valuable ideas start to suggest things.

So I suggest we have a Plugins/ dir in the Sierra code, basically you can stick anything in, a bit like a procmail rule and it gets a nice reference to the Mail object and it can arse around with it and at the end return true or false, true means carry on with more rules and false means stop, this mail has been `dealt' with.

I don't know how to order how these rules are applied, for instance we might like our unsubbed sender rejecter plugin to run before the the digest or archiver.

I do know a list of Plugins that we would want, here is some of them,

        Digest Plugin
                Use its own private storage (possible issue), to store
                information about mails in the current digest and then
                sends them all out.
        Subscriber Only Plugin
                Checks that the mail has arrived from a subscriber,
                otherwise punts it, or puts it in a holding pattern
                waiting for the mail admins
        Sig Adjuster
                If a user has asked for their sig to be chopped,
                everything under '-- ' will be removed. Handy for
                corporate sig stuff.
                Stores the mail somewhere, if the group has selected
                that, might actually set a no delete flag or some such.
        Signal/Noise rejecter
                Runs jwz's code for S/N and rejects anything with too
                low a S/N value
        Spamassasin Plugin
                Rejects any mail with a high value after being checked
                by SA.
        Evil Advertiser Plugin
                Adds evil advertising like Yahoo to a mail
        Scribot/URL Vampire Plugin
                Generates a Scribot like page with a list of unique

Sometimes i think that the actual mail sending should be a plugin as well but I'm not sure.

One way of ordering the plugins would be to create a run level structure.


        Level 0, read only, the mail will be untouched and unhacked
                Subscriber Only Plugin
                Spamassasin Plugin
                S/N Rejecter
                Scribot/URL Vampire
        Level 1, read write, open season on mail adjustments
                Evil Advertiser
                Sig Adjuster
        Level 2, read only, the mail has now be altered
                Digest Generator
                Archive Generator

This would be fairly sensible

Now all groups can select which plugins can be used on their mailing list. (One crazy reason maybe the final normal mail sending should be a plugin is so that you could subscribe Sierra to another mailing list and still use Sig Vampire, Archive Generator).


Err do this later


Greg McCarroll <>