emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs/lisp/mail rmail-spam-filter.el


From: Glenn Morris
Subject: [Emacs-diffs] emacs/lisp/mail rmail-spam-filter.el
Date: Thu, 19 Feb 2009 03:31:31 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Glenn Morris <gm>       09/02/19 03:31:31

Modified files:
        lisp/mail      : rmail-spam-filter.el 

Log message:
        (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).

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/lisp/mail/rmail-spam-filter.el?cvsroot=emacs&r1=1.28&r2=1.29

Patches:
Index: rmail-spam-filter.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/mail/rmail-spam-filter.el,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -b -r1.28 -r1.29
--- rmail-spam-filter.el        19 Feb 2009 03:29:58 -0000      1.28
+++ rmail-spam-filter.el        19 Feb 2009 03:31:31 -0000      1.29
@@ -337,7 +337,7 @@
               ;; 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 @@
     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)
+        (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)))
+    (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 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))
+           ;; 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))
+             (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")




reply via email to

[Prev in Thread] Current Thread [Next in Thread]