gnus: SpamAssassin
9.16.3 SpamAssassin, Vipul’s Razor, DCC, etc
--------------------------------------------
The days where the hints in the previous section were sufficient in
avoiding spam are coming to an end. There are many tools out there that
claim to reduce the amount of spam you get. This section could easily
become outdated fast, as new products replace old, but fortunately most
of these tools seem to have similar interfaces. Even though this
section will use SpamAssassin as an example, it should be easy to adapt
it to most other tools.
Note that this section does not involve the ‘spam.el’ package, which
is discussed in the next section. If you don’t care for all the
features of ‘spam.el’, you can make do with these simple recipes.
If the tool you are using is not installed on the mail server, you
need to invoke it yourself. Ideas on how to use the ‘:postscript’ mail
source parameter (Mail Source Specifiers) follow.
(setq mail-sources
'((file :prescript "formail -bs spamassassin < /var/mail/%u")
(pop :user "jrl"
:server "pophost"
:postscript
"mv %t /tmp/foo; formail -bs spamc < /tmp/foo > %t")))
Once you manage to process your incoming spool somehow, thus making
the mail contain, e.g., a header indicating it is spam, you are ready to
filter it out. Using normal split methods (Splitting Mail):
(setq nnmail-split-methods '(("spam" "^X-Spam-Flag: YES")
...))
Or using fancy split methods (Fancy Mail Splitting):
(setq nnmail-split-methods 'nnmail-split-fancy
nnmail-split-fancy '(| ("X-Spam-Flag" "YES" "spam")
...))
Some people might not like the idea of piping the mail through
various programs using a ‘:prescript’ (if some program is buggy, you
might lose all mail). If you are one of them, another solution is to
call the external tools during splitting. Example fancy split method:
(setq nnmail-split-fancy '(| (: kevin-spamassassin)
...))
(defun kevin-spamassassin ()
(save-excursion
(save-restriction
(widen)
(if (eq 1 (call-process-region (point-min) (point-max)
"spamc" nil nil nil "-c"))
"spam"))))
Note that with the nnimap back end, message bodies will not be
downloaded by default. You need to set ‘nnimap-split-download-body’ to
‘t’ to do that (Client-Side IMAP Splitting).
That is about it. As some spam is likely to get through anyway, you
might want to have a nifty function to call when you happen to read
spam. And here is the nifty function:
(defun my-gnus-raze-spam ()
"Submit SPAM to Vipul's Razor, then mark it as expirable."
(interactive)
(gnus-summary-save-in-pipe "razor-report -f -d" t)
(gnus-summary-mark-as-expirable 1))