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 (SeeMail 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 (SeeSplitting Mail):
 
      (setq nnmail-split-methods '(("spam"  "^X-Spam-Flag: YES")
                                   ...))
 
    Or using fancy split methods (SeeFancy 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 (SeeClient-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))