1 ;;; wl-spam.el --- Spam filtering interface for Wanderlust.
3 ;; Copyright (C) 2003 Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
4 ;; Copyright (C) 2003 Yuuichi Teranishi <teranisi@gohome.org>
6 ;; Author: Hiroya Murata <lapis-lazuli@pop06.odn.ne.jp>
7 ;; Keywords: mail, net news, spam
9 ;; This file is part of Wanderlust (Yet Another Message Interface on Emacsen).
11 ;; This program is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
16 ;; This program is distributed in the hope that it will be useful,
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 ;; GNU General Public License for more details.
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24 ;; Boston, MA 02111-1307, USA.
33 (eval-when-compile (require 'cl))
40 "Spam configuration for wanderlust."
43 (defcustom wl-spam-folder-name "+spam"
48 (defcustom wl-spam-undecided-folder-regexp-list '("inbox")
49 "*List of folder regexp which is contained undecided domain."
50 :type '(repeat (regexp :tag "Folder Regexp"))
53 (defcustom wl-spam-ignored-folder-regexp-list
54 (list (regexp-opt (list wl-draft-folder
57 "*List of folder regexp which is contained ignored domain."
58 :type '(repeat (regexp :tag "Folder Regexp"))
61 (defcustom wl-spam-auto-check-policy-alist '(("inbox" . mark))
62 "*Alist of Folder regexp which check spam automatically and policy."
63 :type '(repeat (cons (regexp :tag "Folder Regexp")
64 (choice (const :tag "Target mark" mark)
65 (const :tag "Refile mark" refile)
66 (const :tag "none" nil))))
69 (defun wl-spam-folder-guess-domain (folder-name)
70 (cond ((string= folder-name wl-spam-folder-name)
72 ((wl-string-match-member folder-name
73 wl-spam-undecided-folder-regexp-list)
75 ((wl-string-match-member folder-name
76 wl-spam-ignored-folder-regexp-list)
81 (defsubst wl-spam-map-spam-messages (folder numbers function &rest args)
82 (let ((total (length numbers)))
83 (elmo-with-progress-display (> total elmo-display-progress-threshold)
84 (elmo-spam-check-spam total "Checking spam...")
85 (dolist (number (elmo-spam-list-spam-messages (elmo-spam-processor)
88 (apply function number args)))
89 (message "Checking spam...done")))
91 (defun wl-spam-register-spam-messages (folder numbers)
92 (let ((total (length numbers)))
93 (elmo-with-progress-display (> total elmo-display-progress-threshold)
94 (elmo-spam-register total "Register spam messages...")
95 (elmo-spam-register-spam-messages (elmo-spam-processor)
96 wl-summary-buffer-elmo-folder
98 (message "Register spam messages...done")))
100 (defun wl-spam-register-good-messages (folder numbers)
101 (let ((total (length numbers)))
102 (elmo-with-progress-display (> total elmo-display-progress-threshold)
103 (elmo-spam-register total "Register good messages...")
104 (elmo-spam-register-good-messages (elmo-spam-processor)
105 wl-summary-buffer-elmo-folder
107 (message "Register good messages...done")))
109 (defun wl-spam-save-status ()
111 (elmo-spam-save-status (elmo-spam-processor)))
113 ;; insinuate into summary mode
114 (defvar wl-summary-spam-map nil)
116 (unless wl-summary-spam-map
117 (let ((map (make-sparse-keymap)))
118 (define-key map "*" 'wl-summary-target-mark-spam)
119 (define-key map "o" 'wl-summary-refile-spam)
120 (define-key map "s" 'wl-summary-register-as-spam)
121 (define-key map "S" 'wl-summary-register-as-spam-all)
122 (define-key map "n" 'wl-summary-register-as-good)
123 (define-key map "N" 'wl-summary-register-as-good-all)
124 (setq wl-summary-spam-map map)))
126 (define-key wl-summary-mode-map "k" wl-summary-spam-map)
128 (define-key wl-summary-mode-map "ms" 'wl-summary-target-mark-register-as-spam)
129 (define-key wl-summary-mode-map "mn" 'wl-summary-target-mark-register-as-good)
132 ;; Avoid compile warnings
133 (defalias-maybe 'wl-summary-target-mark 'ignore)
134 (defalias-maybe 'wl-summary-refile-mark 'ignore))
136 (defun wl-summary-target-mark-spam (&optional folder)
137 "Set target mark to messages which is guessed spam in FOLDER."
139 (wl-spam-map-spam-messages (or folder wl-summary-buffer-elmo-folder)
140 wl-summary-buffer-number-list
141 #'wl-summary-target-mark))
143 (defun wl-summary-refile-spam (&optional folder)
144 "Set refile mark to messages which is guessed spam in FOLDER."
146 (wl-spam-map-spam-messages (or folder wl-summary-buffer-elmo-folder)
147 wl-summary-buffer-number-list
149 wl-spam-folder-name))
151 (defun wl-summary-register-as-spam ()
153 (let ((number (wl-summary-message-number)))
155 (wl-spam-register-spam-messages wl-summary-buffer-elmo-folder
158 (defun wl-summary-register-as-spam-all ()
160 (wl-spam-register-spam-messages wl-summary-buffer-elmo-folder
161 wl-summary-buffer-number-list))
163 (defun wl-summary-target-mark-register-as-spam ()
166 (goto-char (point-min))
167 (let ((inhibit-read-only t)
168 (buffer-read-only nil)
169 wl-summary-buffer-disp-msg)
170 (wl-spam-register-spam-messages wl-summary-buffer-elmo-folder
171 wl-summary-buffer-target-mark-list)
172 (dolist (number wl-summary-buffer-target-mark-list)
173 (wl-summary-unset-mark number)))))
175 (defun wl-summary-register-as-good ()
177 (let ((number (wl-summary-message-number)))
179 (wl-spam-register-good-messages wl-summary-buffer-elmo-folder
182 (defun wl-summary-register-as-good-all ()
184 (wl-spam-register-good-messages wl-summary-buffer-elmo-folder
185 wl-summary-buffer-number-list))
187 (defun wl-summary-target-mark-register-as-good ()
190 (goto-char (point-min))
191 (let ((inhibit-read-only t)
192 (buffer-read-only nil)
193 wl-summary-buffer-disp-msg)
194 (wl-spam-register-good-messages wl-summary-buffer-elmo-folder
195 wl-summary-buffer-target-mark-list)
196 (dolist (number wl-summary-buffer-target-mark-list)
197 (wl-summary-unset-mark number)))))
199 ;; hook functions and other
200 (defun wl-summary-auto-check-spam ()
201 (case (cdr (elmo-string-matched-assoc (wl-summary-buffer-folder-name)
202 wl-spam-auto-check-policy-alist))
204 (wl-summary-target-mark-spam))
206 (wl-summary-refile-spam))))
208 (defun wl-summary-exec-action-refile-with-register (mark-list)
209 (let ((processor (elmo-spam-processor))
210 (folder wl-summary-buffer-elmo-folder)
212 (when (eq (wl-spam-folder-guess-domain
213 (elmo-folder-name-internal folder))
215 (dolist (info mark-list)
216 (case (wl-spam-folder-guess-domain (nth 2 info))
218 (setq spam-list (cons (car info) spam-list)))
220 (setq good-list (cons (car info) good-list)))))
221 (let ((total (+ (length spam-list) (length good-list))))
222 (elmo-with-progress-display (> total elmo-display-progress-threshold)
223 (elmo-spam-register total "Register spam...")
225 (elmo-spam-register-spam-messages processor folder spam-list))
227 (elmo-spam-register-good-messages processor folder good-list)))
228 (message "Register spam...done")))
229 ;; execute refile messages
230 (wl-summary-exec-action-refile mark-list)))
232 (defun wl-refile-guess-by-spam (entity)
233 (when (elmo-spam-message-spam-p (elmo-spam-processor)
234 wl-summary-buffer-elmo-folder
235 (elmo-message-entity-number entity))
236 wl-spam-folder-name))
239 (product-provide (provide 'wl-spam) (require 'wl-version))
241 ;;; wl-sapm.el ends here