X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=elmo%2Felsp-bogofilter.el;h=948a2d0bc31c631d193b3f938df0c3fb85d27031;hb=3f6935b3b822de4596bb193c7bc635cb5b68d577;hp=08de7632dc07ad3d83147d5425ef13e759649f07;hpb=cdd4208dfe998a518b6af628f2c2797496b413b2;p=elisp%2Fwanderlust.git diff --git a/elmo/elsp-bogofilter.el b/elmo/elsp-bogofilter.el index 08de763..948a2d0 100644 --- a/elmo/elsp-bogofilter.el +++ b/elmo/elsp-bogofilter.el @@ -52,21 +52,29 @@ (const :tag "Use the default")) :group 'elmo-spam-bogofilter) +(defcustom elmo-spam-bogofilter-max-messages-per-process 30 + "Number of messages processed at once." + :type 'integer + :group 'elmo-spam-bogofilter) + (defcustom elmo-spam-bogofilter-arguments-alist - '((classify . ("-v" "-2" - (if register "-u") - (if elmo-spam-bogofilter-database-directory - (list "-d" elmo-spam-bogofilter-database-directory)))) - (register . ("-v" - (if spam "-s" "-n") - (if restore (if spam "-N" "-S")) - (if elmo-spam-bogofilter-database-directory - (list "-d" elmo-spam-bogofilter-database-directory))))) + '((classify + (if elmo-spam-bogofilter-debug "-vv") + (if register "-u") + (if elmo-spam-bogofilter-database-directory + (list "-d" elmo-spam-bogofilter-database-directory))) + (register + (if elmo-spam-bogofilter-debug "-vv") + (if spam "-s" "-n") + (if restore (if spam "-N" "-S")) + (if elmo-spam-bogofilter-database-directory + (list "-d" elmo-spam-bogofilter-database-directory)))) "*An alist of options that are used with call bogofilter process. Each element is a list of following: -\(TYPE . LIST-EXP) +\(TYPE [SEXP...]) TYPE is a symbol from `classify' or `register'. -LIST-EXP is an expression to get list of options." +SEXP is an expression to get options. +Must be return a string or list of string." :type '(repeat (cons (choice (const :tag "Classify" classify) (const :tag "Register" register)) (repeat sexp))) @@ -81,19 +89,20 @@ LIST-EXP is an expression to get list of options." (eval-and-compile (luna-define-class elsp-bogofilter (elsp-generic))) -(defsubst elmo-spam-bogofilter-call (&rest args) +(defsubst elmo-spam-bogofilter-call (&optional args) (apply #'call-process-region (point-min) (point-max) elmo-spam-bogofilter-program nil (if elmo-spam-bogofilter-debug (get-buffer-create "*Debug ELMO SPAM Bogofilter*")) nil - (delq nil (append elmo-spam-bogofilter-args - (elmo-flatten args))))) + (append elmo-spam-bogofilter-args + (delq nil args)))) (defmacro elmo-spam-bogofilter-arguments (type) - `(mapcar #'eval - (cdr (assq ,type elmo-spam-bogofilter-arguments-alist)))) + `(elmo-flatten + (mapcar #'eval + (cdr (assq ,type elmo-spam-bogofilter-arguments-alist))))) (luna-define-method elmo-spam-buffer-spam-p ((processor elsp-bogofilter) buffer &optional register) @@ -114,6 +123,45 @@ LIST-EXP is an expression to get list of options." buffer &optional restore) (elsp-bogofilter-register-buffer buffer nil restore)) +(defsubst elmo-spam-bogofilter-register-messages (folder numbers spam restore) + (if (not (< 0 elmo-spam-bogofilter-max-messages-per-process)) + (error "non-positive value for `elmo-spam-bogofilter-max-messages-per-process'")) + (with-temp-buffer + (buffer-disable-undo (current-buffer)) + (while numbers + (let ((count 0)) + (while (and numbers + (< count elmo-spam-bogofilter-max-messages-per-process)) + (insert "From MAILER-DAEMON\n" + (with-temp-buffer + (elmo-spam-message-fetch folder (car numbers)) + (goto-char (point-min)) + (while (re-search-forward "^>*From " nil t) + (goto-char (match-beginning 0)) + (insert ?>) + (forward-line)) + (buffer-substring (point-min) (point-max))) + "\n\n") + (setq count (1+ count) + numbers (cdr numbers))) + (elsp-bogofilter-register-buffer (current-buffer) spam restore) + (elmo-progress-notify 'elmo-spam-register count) + (erase-buffer))))) + +(luna-define-method elmo-spam-register-spam-messages :around + ((processor elsp-bogofilter) folder &optional numbers restore) + (let ((numbers (or numbers (elmo-folder-list-messages folder t t)))) + (if (> (length numbers) 1) + (elmo-spam-bogofilter-register-messages folder numbers t restore) + (luna-call-next-method)))) + +(luna-define-method elmo-spam-register-good-messages :around + ((processor elsp-bogofilter) folder &optional numbers restore) + (let ((numbers (or numbers (elmo-folder-list-messages folder t t)))) + (if (> (length numbers) 1) + (elmo-spam-bogofilter-register-messages folder numbers nil restore) + (luna-call-next-method)))) + (require 'product) (product-provide (provide 'elsp-bogofilter) (require 'elmo-version))