[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[sup-devel] Filtering rules



Hello everyone,

I have been working on a filtering rules system for heliotrope.
Basically, I wanted to have something that can apply some rules to my
messages, so that I could rearrange my mails' labels/state
automatically at any given time, much like what notmuch does (speaking
of which : it's sad that common goals in building an efficient mail
system are so much separated by divergences in code).

I preferred to use an "after-add" strategy, as opposed to a
"before-add", for multiple reasons :

- In a "after-add", messages are already indexed; a search for a
matching criteria is easily done with mechanisms from whistlepig
(which was built for the job). In a "before-add", you would have to
search for your criterias manually
- If you put bad labels/state before adding the message to the store,
you have to search for it manually and apply the good ones
- In case of a bulk import, a bulk labelling is practical.

So I worked on a possible template for rules that is very simple. It's
pure yaml, and looks like this :

-  to:"sup" subject:"Filtering rules" :
     labels: "+sup"
-  to:"me@domain.com" body:"Enlarge your" :
     state: "+spam"
-  from:"facebook" :
     state: "-unread"

Again, it's very simple, but I believe it is quite readable and can do
most of the things one would want. You can have find more (documented)
examples at the previous link.

So I created a filter.rb script, in the heliotrope folder, on my
public repo (https://github.com/rakoo/heliotrope/tree/filter). Here's
how you use it :

  ruby filter.rb --dir /path/to/heliotrope/data/dir --check
/path/to/rules/files.yml

And it will print you what are the offending threads. I didn't put the
changes back to the store yet for testing purposes (it's just a puts
of the non-matching threads), but it's just a :dry_run opt away.
Plus, state are to be considered differently than labels: they are
per-message, not per-threads.

Bonus : I guess most of us use Gmail and Gmail's filters. The same
script can take your gmail filters and output a valid yaml rules file
for you! You just have to export your rules by hand (it's a Lab
feature) to a local file, and run :

  ruby filter.rb --dir /path/to/heliotrope/data/dir --import
/path/to/gmail/filters/file.xml

I have to work around a few quirks, but you can post-edit the
generated file easily to get a usable rules file.
There's a way to get your rules automagically from Google servers, but
it is reserved to Google Apps users. If you're a simple user, you must
use the export function.

I'm working on the other way around (heliotrope -> Gmail), but Gmail's
import/export rules are XML-the-verbose.

Please enjoy this  !

Totally unrelated : I happen to have some negative thread_ids. Is it
an expected behaviour ?

-- 
Matthieu RAKOTOJAONA
_______________________________________________
Sup-devel mailing list
Sup-devel@rubyforge.org
http://rubyforge.org/mailman/listinfo/sup-devel