summaryrefslogtreecommitdiff
path: root/lisp/mail/rmail-spam-filter.el
diff options
context:
space:
mode:
authorGlenn Morris <rgm@gnu.org>2009-02-19 03:31:31 +0000
committerGlenn Morris <rgm@gnu.org>2009-02-19 03:31:31 +0000
commit3e3480fb8ac59907b1fd15116d07da7e554303bb (patch)
treeb6e557f783e41fbcda56c975e65231ad64419261 /lisp/mail/rmail-spam-filter.el
parent25833b8cd8ccbdf98b9501f79f879709af5eb984 (diff)
downloademacs-3e3480fb8ac59907b1fd15116d07da7e554303bb.tar.gz
(rmail-get-new-mail-filter-spam): Be more careful about error-handling.
Restore the feature of temporarily setting all old messages undeleted before expunging (removed 2009-02-18).
Diffstat (limited to 'lisp/mail/rmail-spam-filter.el')
-rw-r--r--lisp/mail/rmail-spam-filter.el54
1 files changed, 41 insertions, 13 deletions
diff --git a/lisp/mail/rmail-spam-filter.el b/lisp/mail/rmail-spam-filter.el
index bd2dfaa12f8..5e88e4fb9cd 100644
--- a/lisp/mail/rmail-spam-filter.el
+++ b/lisp/mail/rmail-spam-filter.el
@@ -337,7 +337,7 @@ it from rmail file. Called for each new message retrieved by
;; Else the prompt to write a new file leaves the raw
;; mbox buffer visible.
(and newfile
- (rmail-show-message (rmail-first-unseen-message) 1))
+ (rmail-show-message (rmail-first-unseen-message) t))
(rmail-output rsf-file)
;; Swap back, else rmail-get-new-mail-1 gets confused.
(when newfile
@@ -352,23 +352,51 @@ it from rmail file. Called for each new message retrieved by
return-value))
(defun rmail-get-new-mail-filter-spam (nnew)
- "Check the most NNEW recent messages for spam."
+ "Check the most NNEW recent messages for spam.
+This is called at the end of `rmail-get-new-mail-1' if there is new mail."
(let* ((nold (- rmail-total-messages nnew))
(nspam 0)
- (nscan (1+ nold)))
- (while (<= nscan rmail-total-messages)
- (or (rmail-spam-filter nscan)
- (setq nspam (1+ nspam)))
+ (nscan (1+ nold))
+ ;; Save the original deleted state of all the messages.
+ (rdv-old rmail-deleted-vector)
+ errflag)
+ ;; Set all messages undeleted so that the expunge only affects spam.
+ (setq rmail-deleted-vector (make-string (1+ rmail-total-messages) ?\s))
+ (while (and (not errflag) (<= nscan rmail-total-messages))
+ (condition-case nil
+ (or (rmail-spam-filter nscan)
+ (setq nspam (1+ nspam)))
+ (error (setq errflag nscan)))
(setq nscan (1+ nscan)))
- (when (> nspam 0)
- ;; Otherwise the expunge prompt leaves the raw mbox buffer showing.
- (rmail-show-message (rmail-first-unseen-message) 1)
- (if (rmail-expunge-confirmed) (rmail-only-expunge t))
- ;; Swap back, else get-new-mail-1 gets confused.
- (rmail-swap-buffers-maybe)
- (widen))
+ (unwind-protect
+ (if errflag
+ (progn
+ (setq rmail-use-spam-filter nil)
+ (if rsf-beep (ding t))
+ (message "Spam filter error for new message %d, disabled" errflag)
+ (sleep-for rsf-sleep-after-message))
+ (when (> nspam 0)
+ ;; Otherwise sleep or expunge prompt leaves raw mbox buffer showing.
+ (rmail-show-message (or (rmail-first-unseen-message) 1) t)
+ (unwind-protect
+ (progn
+ (if rsf-beep (ding t))
+ (message "Rmail spam-filter detected and deleted %d spam \
+message%s"
+ nspam (if (= 1 nspam) "" "s"))
+ (sleep-for rsf-sleep-after-message)
+ (if (rmail-expunge-confirmed) (rmail-only-expunge t)))
+ ;; Swap back, else get-new-mail-1 gets confused.
+ (rmail-swap-buffers-maybe)
+ (widen))))
+ ;; Restore the original deleted state. Character N refers to message N.
+ (setq rmail-deleted-vector
+ (concat (substring rdv-old 0 (1+ nold))
+ ;; This still works if we deleted all the new mail.
+ (substring rmail-deleted-vector (1+ nold)))))
;; Return a message based on the number of spam messages found.
(cond
+ (errflag ", error in spam filter")
((zerop nspam) "")
((= 1 nnew) ", and it appears to be spam")
((= nspam nnew) ", and all appear to be spam")