+2003-01-01 Teodor Zlatanov <tzz@lifelogs.com>
+
+ * spam.el (spam-summary-prepare-exit): added slots for spam- and
+ ham-processing of articles; use the new
+ spam-group-(spam|ham)-contents-p functions
+ (spam-group-spam-contents-p, spam-group-ham-contents-p): new
+ convenience functions
+ (spam-mark-junk-as-spam-routine): use the new
+ spam-group-spam-contents-p function
+
+ * gnus.el (spam-process, spam-contents, spam-process-destination):
+ added new parameters with corresponding global variables
+ (gnus-group-spam-exit-processor-ifile,
+ gnus-group-spam-exit-processor-bogofilter,
+ gnus-group-spam-exit-processor-blacklist,
+ gnus-group-spam-exit-processor-whitelist,
+ gnus-group-spam-exit-processor-BBDB,
+ gnus-group-spam-classification-spam,
+ gnus-group-spam-classification-ham): added new symbols for the
+ spam-process and spam-contents parameters
+
+ * spam.el (spam-ham-marks, spam-spam-marks): changed list
+ customization and list itself to store mark symbol rather than
+ mark character.
+ (spam-bogofilter-register-routine): added logic to generate mark
+ values list from spam-ham-marks and spam-spam-marks, so (member)
+ would work.
+
2003-01-02 Katsumi Yamaoka <yamaoka@jpl.org>
* message.el (message-cross-post-followup-to): Fix comment.
`gnus-large-newsgroup'). If it is `nil', the default value is the
total number of articles in the group.")
+;; group parameters for spam processing added by Ted Zlatanov <tzz@lifelogs.com>
+(defvar gnus-group-spam-classification-spam t
+ "Spam group classification (requires spam.el).
+This group contains spam messages. On summary entry, unread messages
+will be marked as spam. On summary exit, the specified spam
+processors will be invoked on spam-marked messages, then those
+messages will be expired, so the spam processor will only see a
+spam-marked message once.")
+
+(defvar gnus-group-spam-classification-ham 'ask
+ "The ham value for the spam group parameter (requires spam.el).
+On summary exit, the specified ham processors will be invoked on
+ham-marked messages. Exercise caution, since the ham processor will
+see the same message more than once because there is no ham message
+registry.")
+
+(gnus-define-group-parameter
+ spam-contents
+ :type list
+ :function-document
+ "The spam type (spam, ham, or neither) of the group."
+ :variable gnus-spam-newsgroup-contents
+ :variable-default nil
+ :variable-document
+ "*Groups in which to automatically mark new articles as spam on
+summary entry. If non-nil, this should be a list of group name
+regexps that should match all groups in which to do automatic spam
+tagging, associated with a classification (spam, ham, or neither).
+This only makes sense for mail groups."
+ :variable-group spam
+ :variable-type '(repeat
+ (list :tag "Group contents spam/ham classification"
+ (regexp :tag "Group")
+ (choice
+ (variable-item gnus-group-spam-classification-spam)
+ (variable-item gnus-group-spam-classification-ham)
+ (other :tag "Unclassified" nil))))
+
+ :parameter-type '(list :tag "Group contents spam/ham classification"
+ (choice :tag "Group contents classification for spam sorting"
+ (variable-item gnus-group-spam-classification-spam)
+ (variable-item gnus-group-spam-classification-ham)
+ (other :tag "Unclassified" nil)))
+ :parameter-document
+ "The spam classification (spam, ham, or neither) of this group.
+When a spam group is entered, all unread articles are marked as spam.")
+
+(defvar gnus-group-spam-exit-processor-ifile "ifile"
+ "The ifile summary exit spam processor.
+Only applicable to spam groups.")
+
+(defvar gnus-group-spam-exit-processor-bogofilter "bogofilter"
+ "The Bogofilter summary exit spam processor.
+Only applicable to spam groups.")
+
+(defvar gnus-group-spam-exit-processor-blacklist "blacklist"
+ "The Blacklist summary exit spam processor.
+Only applicable to spam groups.")
+
+(defvar gnus-group-ham-exit-processor-whitelist "whitelist"
+ "The whitelist summary exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+(defvar gnus-group-ham-exit-processor-BBDB "bbdb"
+ "The BBDB summary exit ham processor.
+Only applicable to non-spam (unclassified and ham) groups.")
+
+(gnus-define-group-parameter
+ spam-process
+ :type list
+ :parameter-type '(choice :tag "Spam Summary Exit Processor"
+ :value nil
+ (list :tag "Spam Summary Exit Processor Choices"
+ (set
+ (variable-item gnus-group-spam-exit-processor-ifile)
+ (variable-item gnus-group-spam-exit-processor-bogofilter)
+ (variable-item gnus-group-spam-exit-processor-blacklist)
+ (variable-item gnus-group-ham-exit-processor-whitelist)
+ (variable-item gnus-group-ham-exit-processor-BBDB))))
+ :function-document
+ "Which spam or ham processors will be applied to the GROUP articles at summary exit."
+ :variable gnus-spam-process-newsgroups
+ :variable-default nil
+ :variable-document
+ "*Groups in which to automatically process spam or ham articles with
+a backend on summary exit. If non-nil, this should be a list of group
+name regexps that should match all groups in which to do automatic
+spam processing, associated with the appropriate processor. This only makes sense
+for mail groups."
+ :variable-group spam
+ :variable-type '(repeat :tag "Spam/Ham Processors"
+ (list :tag "Spam Summary Exit Processor Choices"
+ (regexp :tag "Group Regexp")
+ (set :tag "Spam/Ham Summary Exit Processor"
+ (variable-item gnus-group-spam-exit-processor-ifile)
+ (variable-item gnus-group-spam-exit-processor-bogofilter)
+ (variable-item gnus-group-spam-exit-processor-blacklist)
+ (variable-item gnus-group-ham-exit-processor-whitelist)
+ (variable-item gnus-group-ham-exit-processor-BBDB))))
+ :parameter-document
+ "Which spam processors will be applied to the spam or ham GROUP articles at summary exit.")
+
+(gnus-define-group-parameter
+ spam-process-destination
+ :parameter-type '(choice :tag "Destination for spam-processed articles at summary exit"
+ (string :tag "Move to a group")
+ (other :tag "Expire" nil))
+ :function-document
+ "Where spam-processed articles will go at summary exit."
+ :variable gnus-spam-process-destinations
+ :variable-default nil
+ :variable-document
+ "*Groups in which to explicitly send spam-processed articles to
+another group, or expire them (the default). If non-nil, this should
+be a list of group name regexps that should match all groups in which
+to do spam-processed article moving, associated with the destination
+group or `nil' for explicit expiration. This only makes sense for
+mail groups."
+ :variable-group spam
+ :variable-type '(repeat :tag "Spam-processed articles destination"
+ (list
+ (regexp :tag "Group Regexp")
+ (choice :tag "Destination for spam-processed articles at summary exit"
+ (string :tag "Move to a group")
+ (other :tag "Expire" nil))))
+ :parameter-document
+ "Where spam-processed articles will go at summary exit.")
+
(defcustom gnus-group-uncollapsed-levels 1
"Number of group name elements to leave alone when making a short group name."
:group 'gnus-group-visual
(require 'gnus-sum)
(require 'gnus-uu) ; because of key prefix issues
+(require 'gnus) ; for the definitions of group content classification and spam processors
;; FIXME! We should not require `message' until we actually need
;; them. Best would be to declare needed functions as auto-loadable.
(push '((eq mark gnus-spam-mark) . spam-face)
gnus-summary-highlight)
+;; convenience functions
+(defun spam-group-spam-contents-p (group)
+ (if (stringp group)
+ (or (member group spam-junk-mailgroups)
+ (memq 'gnus-group-spam-classification-spam (gnus-parameter-spam-contents group)))
+ nil))
+
+(defun spam-group-ham-contents-p (group)
+ (if (stringp group)
+ (memq 'gnus-group-spam-classification-ham (gnus-parameter-spam-contents group))
+ nil))
+
+
;;; Hooks dispatching. A bit raw for now.
(defun spam-summary-prepare ()
(spam-mark-junk-as-spam-routine))
(defun spam-summary-prepare-exit ()
- (spam-bogofilter-register-routine))
+ (spam-bogofilter-register-routine)
+ (when (spam-group-spam-contents-p gnus-newsgroup-name)
+ (
+ ;; TODO: the spam processors here
+ ;; TODO: the spam-processed articles will be moved here
+ ))
+ (when (spam-group-ham-contents-p gnus-newsgroup-name)
+ (
+ ;; TODO: the ham processors here
+ )))
(add-hook 'gnus-summary-prepare-hook 'spam-summary-prepare)
(add-hook 'gnus-summary-prepare-exit-hook 'spam-summary-prepare-exit)
(defun spam-mark-junk-as-spam-routine ()
- (when (member gnus-newsgroup-name spam-junk-mailgroups)
+ ;; check the global list of group names spam-junk-mailgroups and the group parameters
+ (when (spam-group-spam-contents-p gnus-newsgroup-name)
(let ((articles gnus-newsgroup-articles)
article)
(while articles
article mark ham-articles spam-articles spam-mark-values ham-mark-values)
;; marks are stored as symbolic values, so we have to dereference them for memq to work
+ ;; we wouldn't have to do this if gnus-summary-article-mark returned a symbol.
(dolist (mark spam-ham-marks)
(push (symbol-value mark) ham-mark-values))