Hi,
I guess that in need_keyword_hook case save_init/save_finish hooks will have to check email for spams and keyword it. It is not clear how to mark mail as spam if both need_folder_hook and need_keyword_hook are true.
Well, the need_keyword_hook variable is just internal. The point is that save_{init,finish} are not invoked when just the keywords change, so I override the struct mail's update_keywords function.
See http://git.sipsolutions.net/?p=dovecot-antispam.git;a=blob;f=antispam-storag...
One problem with this is that evolution doesn't sync the keywords to the server right away, only when you change folders. Also, it's not entirely obvious what the code should do when the backend fails since there doesn't seem to be a way to roll back the keyword change easily. Any comments on the code would be appreciated, and you can probably easily make it invoke the backend with what's there to actually test it.
If I understand how it works with folders -- if message is moved from/to spam folder and spam learning fails, dovecot-antispam rolls back the IMAP transaction and dovecot reports error to client? (sorry if I am wrong, didn't read code nor IMAP specification, just assuming).
Yes.
Then I think it would be correct to do exactly same with keywords and let client handle error. I am not sure if Evolution would handle that...
The thing is that I don't know what context the update_keywords function runs in and whether it has a transaction at all, so I don't know how to roll back. I suppose it would be possible to grab the original keyword list before invoking super.update_keywords() and then resetting to that if the backend fails...
johannes