Sometimes I write things that are for myself, and later decide to release on the off-chance other people might be interested.
I've hated procmail for a long time, but it is extremely flexible, and for the longest time I figured since I'd got things working the way I wanted there was little point changing.
When it comes to procmail there are few alternatives:
- Exim filters.
- Maildrop.
- Email::Filter
Unfortunately both Exim and Email::Filter suffer from a lack of "pipe" support. To be more specific Exim filters and Email::Filter allow you to pipe an incoming message to an external program - but they regard that as the end of the delivery process.
So, for example, you cannot receive a message (on STDIN), pipe it through crm114, then process that updated message. (i.e. The output of crm114).
Maildrop does allow pipes, but suffers from other problems which makes me "not like it".
My own approach is to have a simple mail-sieve command which is configured thusly:
set maildir=/home/steve/Maildir set logfile=/home/.trash.d/mail-sieve.log # # Null-senders # Return-Path: /<>/ save .Automated.bounces/ # # Spam filter # filter /usr/bin/crm -u /home/steve/.crm /usr/share/crm114/mailreaver.crm # # Spam? # X-CRM114-Status: /SPAM/ save .CRM.Spam/ X-CRM114-Status: /Unsure/ save .CRM.Unsure/ # # People / Lists # From: /[email protected]/ save .people.foo/ From: /[email protected]/ save .people.bar/ .. .. # # Domains # To: /steve.org.uk$/ save .steve.org.uk/ To: /debian-administration.org$/ save .debian-administration.org.personal/ # # All done. # save .inbox.unfiled/
On the one hand this is simple, readable, and complete enough for myself. On the other hand if I were going to make it releasable I think I'd probably want to add both conditionals and the ability to match upon multiple header values.
Getting there would probably involve something like this on the ~/.mail-filter side :
if ( ( From: /[email protected] ) || ( From: /[email protected] ) ) { save .people.example.com/ exit } # ps. remind me how much I hate parsers and lexers?
That starts to look very much like Exim's filter language, at which point I think "why should I bother". Pragmatically the simplest solution would be to add a "Filter" primitive to Email::Filter - and pretend I understood the nasty "Exit" settings.
ObQuote: Andre, we don't use profanity or double negatives here at True Directions. - "But I'm a Cheerleader".
Tags: maildrop, procmail, sieve 5 comments