From: yamaoka Date: Sun, 4 Jan 2004 06:02:34 +0000 (+0000) Subject: T-gnus 6.16.4 revision 00. X-Git-Tag: t-gnus-6_16_4-00 X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b1d5f5f4bad8751d8b18aa0a73fd5206b939d009;p=elisp%2Fgnus.git- T-gnus 6.16.4 revision 00. --- diff --git a/ChangeLog b/ChangeLog index 64080f7..ebc02e4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-01-04 Katsumi Yamaoka + + * lisp/gnus-vers.el: T-gnus 6.16.4 revision 00. + +2004-01-02 Reiner Steib + + * GNUS-NEWS: Add `gnus-group-read-ephemeral-group'. + 2003-12-30 Katsumi Yamaoka * lisp/gnus-vers.el: T-gnus 6.16.3 revision 00. diff --git a/GNUS-NEWS b/GNUS-NEWS index 97aa520..eb74175 100644 --- a/GNUS-NEWS +++ b/GNUS-NEWS @@ -8,6 +8,8 @@ For older news, see Gnus info node "New Features". * Changes in Oort Gnus +** `gnus-group-read-ephemeral-group' can be called interactively, using `G M'. + ** In draft groups, `e' is now bound to `gnus-draft-edit-message'. Use `B w' for `gnus-summary-edit-article' instead. diff --git a/README.T-gnus b/README.T-gnus index e402cff..2e02d32 100644 --- a/README.T-gnus +++ b/README.T-gnus @@ -33,5 +33,5 @@ NEWS: * T-gnus 6.16 - this is based on Gnus. - The latest T-gnus is T-gnus 6.16.3 (based on Gnus 5.10.3). It + The latest T-gnus is T-gnus 6.16.4 (based on Gnus 5.10.4). It requires SEMI 1.14, FLIM 1.14, and APEL 10.0 or later. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 44d78ed..8c3c124 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,124 @@ +2004-01-03 Lars Magne Ingebrigtsen + + * gnus.el: Gnus v5.10.4 is released. + +2004-01-02 Reiner Steib + + * gnus.el (gnus-mode-line-buffer-identification): Show version in + help-echo. + (gnus-read-group): Allow most group names. Changed warning. + +2004-01-02 Lars Magne Ingebrigtsen + + * gnus-dired.el (gnus-dired-mode-map): Change keymaps. + +2004-01-02 Arne J,Ax(Brgensen + + * smime.el (smime-crl-check): Doc fix. + +2004-01-02 Edwin Steiner + + * gnus-nocem.el (gnus-nocem-enter-article): Use the real group + hashtb (tiny patch). + +2004-01-02 Kai Grossjohann + + * nnml.el (nnml-save-mail): Grok compressed articles. From + Michael Albinus . + +2004-01-02 Teodor Zlatanov + + * spam.el (spam-ham-copy-or-move-routine): use spam-list-articles + (spam-list-articles): rewritten to only check a mark once per + invocation + +2004-01-01 Simon Josefsson + + * mml-sec.el (mml-default-encrypt-method) + (mml-default-sign-method): Defcustom. + +2003-12-31 Lars Magne Ingebrigtsen + + * mml.el (mml-generate-mime-1): Remove extra ). + + * gnus-group.el (gnus-group-set-current-level): Signal errors on + topic lines. + (gnus-group-set-current-level): Fix fix. + +2003-12-31 Jeremy Maitin-Shepard + + * mml.el (mml-generate-mime-1): Use mml-compute-boundary (tiny + change). + +2003-12-30 Reiner Steib + + * gnus-group.el: Removed `(when t ...)' around `gnus-define-keys'. + (gnus-group-group-map): Added `gnus-group-read-ephemeral-group' + (already in previous commit inadvertently). + (gnus-group-make-menu-bar): Added `gnus-group-read-ephemeral-group'. + (gnus-group-read-ephemeral-group): Made interactive. + + * gnus-score.el (gnus-score-find-trace): Added comment on sync + with `gnus-score-edit-file-at-point'. + + * gnus-logic.el (gnus-score-advanced): Ditto. + + * gnus-score.el (gnus-score-edit-file-at-point): Fix for + advanced scoring. + +2003-12-30 Simon Josefsson + + * gnus-score.el (gnus-score-edit-file-at-point): Use + gnus-point-at-*, for portability. + +2003-12-30 Reiner Steib + + * gnus-art.el (gnus-treat-body-boundary): Fix doc-string and + custom type. + (gnus-button-mid-or-mail-regexp): Don't be too restrictive. + Suggested by Felix Wiemann . + (gnus-button-alist): Added "M-x ... RET" and "mid:" buttons. + Added comments about relevant RFCs. + + * gnus-sum.el (gnus-summary-mode): Untabify doc-string. + (gnus-summary-goto-article): Allow `%40'. + (gnus-summary-refer-article): Convert `%40' to `@'. + +2003-12-30 Simon Josefsson + + * smime.el (smime-crl-check): New. + (smime-verify-region): Use it. From Arne J,Ax(Brgensen + in <87llpk9v5q.fsf@seamus.arnested.dk> (tiny + change). + +2003-12-30 Reiner Steib + + * gnus-score.el (gnus-score-edit-file-at-point): Consider the + whole match element. From Karl Pfl,Ad(Bsterer . + (gnus-score-find-trace): Use it. Added `f' and `t' commands, + added quick help. With some suggestions from Karl Pfl,Ad(Bsterer + . + + * gnus-util.el (gnus-emacs-version): Added doc-string. + + * mml.el (mml-minibuffer-read-disposition): New function. + (mml-attach-file): Use it. + (mml-preview): Added MIME preview to gnus-buffers. + +2003-12-30 Jesper Harder + + * gnus-sum.el (gnus-summary-make-menu-bar): Add ellipses. + +2003-12-30 Lars Magne Ingebrigtsen + + * gnus-start.el (gnus-get-unread-articles): Inline gnus-server-get-method. + (gnus-get-unread-articles): Cache methods. + (gnus-get-unread-articles-in-group): Indent. + + * gnus.el (gnus-version-number): Bump. + (gnus-secondary-method-p): Extend servers to methods before comparing. + (gnus-secondary-method-p): Revert. + 2003-12-30 Lars Magne Ingebrigtsen * gnus.el: Gnus v5.10.3 is released. diff --git a/lisp/gnus-art.el b/lisp/gnus-art.el index 5bce49c..dfc8477 100644 --- a/lisp/gnus-art.el +++ b/lisp/gnus-art.el @@ -1368,12 +1368,12 @@ See Info node `(gnus)Customizing Articles' and Info node gnus-treat-from-picon) 'head nil) "Draw a boundary at the end of the headers. -Valid values are nil, t, `head', `last', an integer or a predicate. +Valid values are nil and `head'. See Info node `(gnus)Customizing Articles' for details." :version "21.1" :group 'gnus-article-treat :link '(custom-manual "(gnus)Customizing Articles") - :type gnus-article-treat-custom) + :type gnus-article-treat-head-custom) (defcustom gnus-treat-capitalize-sentences nil "Capitalize sentence-starting words. @@ -6251,7 +6251,8 @@ It should match all directories in the top level of `gnus-ctan-url'." :type 'regexp) (defcustom gnus-button-mid-or-mail-regexp - (concat "\\b\\(\")!;:,{}\n\t ]*@" + (concat "\\b\\(\")!;:,{}\n\t ]*@" + ;; Felix Wiemann in <87oeuomcz9.fsf@news2.ososo.de> gnus-button-valid-fqdn-regexp ">?\\)\\b") "Regular expression that matches a message ID or a mail address." @@ -6561,10 +6562,14 @@ positives are possible." 1 (>= gnus-button-message-level 0) gnus-button-fetch-group 5) ("\\b\\(nntp\\|news\\):\\(//\\)?\\([^'\">\n\t ]+\\)" 0 (>= gnus-button-message-level 0) gnus-button-fetch-group 3) + ;; RFC 2392 (Don't allow `/' in domain part --> CID) + ("\\bmid:\\(//\\)?\\([^'\">\n\t ]+@[^'\">\n\t /]+\\)" + 0 (>= gnus-button-message-level 0) gnus-button-message-id 2) ("\\bin\\( +article\\| +message\\)? +\\(<\\([^\n @<>]+@[^\n @<>]+\\)>\\)" 2 (>= gnus-button-message-level 0) gnus-button-message-id 3) ("\\( \n\t]+\\)>" 0 (>= gnus-button-message-level 0) gnus-url-mailto 2) + ;; RFC 2368 (The mailto URL scheme) ("mailto:\\([-a-z.@_+0-9%=?&]+\\)" 0 (>= gnus-button-message-level 0) gnus-url-mailto 1) ("\\bmailto:\\([^ \n\t]+\\)" @@ -6624,6 +6629,8 @@ positives are possible." 0 (>= gnus-button-emacs-level 9) gnus-button-handle-symbol 1) ("(setq[ \t\n]+\\([a-z][a-z0-9]+-[-a-z0-9]+\\)[ \t\n]+.+)" 1 (>= gnus-button-emacs-level 7) gnus-button-handle-describe-variable 1) + ("\\bM-x[ \t\n]+\\([^ \t\n]+\\)[ \t\n]+RET" + 1 (>= gnus-button-emacs-level 7) gnus-button-handle-describe-function 1) ("\\b\\(C-h\\|?\\)[ \t\n]+f[ \t\n]+\\([^ \t\n]+\\)[ \t\n]+RET" 0 (>= gnus-button-emacs-level 1) gnus-button-handle-describe-function 2) ("\\b\\(C-h\\|?\\)[ \t\n]+v[ \t\n]+\\([^ \t\n]+\\)[ \t\n]+RET" @@ -6632,9 +6639,15 @@ positives are possible." ;; Unlike the other regexps we really have to require quoting ;; here to determine where it ends. 1 (>= gnus-button-emacs-level 1) gnus-button-handle-describe-key 3) - ;; This is how URLs _should_ be embedded in text (RFC 1738)... + ;; This is how URLs _should_ be embedded in text (RFC 1738, RFC 2396)... ("]*\\)>" 1 (>= gnus-button-browse-level 0) gnus-button-embedded-url 1) + ;; RFC 2396 (2.4.3., delims) ... + ("\"URL: *\\([^\"]*\\)\"" + 1 (>= gnus-button-browse-level 0) gnus-button-embedded-url 1) + ;; RFC 2396 (2.4.3., delims) ... + ("\"URL: *\\([^\"]*\\)\"" + 1 (>= gnus-button-browse-level 0) gnus-button-embedded-url 1) ;; Raw URLs. (gnus-button-url-regexp 0 (>= gnus-button-browse-level 0) browse-url 0) diff --git a/lisp/gnus-dired.el b/lisp/gnus-dired.el index cf54427..2cf8af2 100644 --- a/lisp/gnus-dired.el +++ b/lisp/gnus-dired.el @@ -58,9 +58,9 @@ (setq gnus-dired-mode-map (make-sparse-keymap)) (gnus-define-keys gnus-dired-mode-map - "\C-c\C-a" gnus-dired-attach - "\C-c\C-l" gnus-dired-find-file-mailcap - "\C-cP" gnus-dired-print)) + "\C-c\C-m\C-a" gnus-dired-attach + "\C-c\C-m\C-l" gnus-dired-find-file-mailcap + "\C-c\C-m\C-p" gnus-dired-print)) (defun gnus-dired-mode (&optional arg) "Minor mode for intersections of gnus and dired. diff --git a/lisp/gnus-group.el b/lisp/gnus-group.el index 118788c..e934383 100644 --- a/lisp/gnus-group.el +++ b/lisp/gnus-group.el @@ -535,210 +535,210 @@ simple manner.") (put 'gnus-group-mode 'mode-class 'special) -(when t - (gnus-define-keys gnus-group-mode-map - " " gnus-group-read-group - "=" gnus-group-select-group - "\r" gnus-group-select-group - "\M-\r" gnus-group-quick-select-group - "\M- " gnus-group-visible-select-group - [(meta control return)] gnus-group-select-group-ephemerally - "j" gnus-group-jump-to-group - "n" gnus-group-next-unread-group - "p" gnus-group-prev-unread-group - "\177" gnus-group-prev-unread-group - [delete] gnus-group-prev-unread-group - [backspace] gnus-group-prev-unread-group - "N" gnus-group-next-group - "P" gnus-group-prev-group - "\M-n" gnus-group-next-unread-group-same-level - "\M-p" gnus-group-prev-unread-group-same-level - "," gnus-group-best-unread-group - "." gnus-group-first-unread-group - "u" gnus-group-unsubscribe-current-group - "U" gnus-group-unsubscribe-group - "c" gnus-group-catchup-current - "C" gnus-group-catchup-current-all - "\M-c" gnus-group-clear-data - "l" gnus-group-list-groups - "L" gnus-group-list-all-groups - "m" gnus-group-mail - "i" gnus-group-news - "g" gnus-group-get-new-news - "\M-g" gnus-group-get-new-news-this-group - "R" gnus-group-restart - "r" gnus-group-read-init-file - "B" gnus-group-browse-foreign-server - "b" gnus-group-check-bogus-groups - "F" gnus-group-find-new-groups - "\C-c\C-d" gnus-group-describe-group - "\M-d" gnus-group-describe-all-groups - "\C-c\C-a" gnus-group-apropos - "\C-c\M-\C-a" gnus-group-description-apropos - "a" gnus-group-post-news - "\ek" gnus-group-edit-local-kill - "\eK" gnus-group-edit-global-kill - "\C-k" gnus-group-kill-group - "\C-y" gnus-group-yank-group - "\C-w" gnus-group-kill-region - "\C-x\C-t" gnus-group-transpose-groups - "\C-c\C-l" gnus-group-list-killed - "\C-c\C-x" gnus-group-expire-articles - "\C-c\M-\C-x" gnus-group-expire-all-groups - "V" gnus-version - "s" gnus-group-save-newsrc - "z" gnus-group-suspend - "q" gnus-group-exit - "Q" gnus-group-quit - "?" gnus-group-describe-briefly - "\C-c\C-i" gnus-info-find-node - "\M-e" gnus-group-edit-group-method - "^" gnus-group-enter-server-mode - gnus-mouse-2 gnus-mouse-pick-group - "<" beginning-of-buffer - ">" end-of-buffer - "\C-c\C-b" gnus-bug - "\C-c\C-n" gnus-namazu-search - "\C-c\C-s" gnus-group-sort-groups - "t" gnus-topic-mode - "\C-c\M-g" gnus-activate-all-groups - "\M-&" gnus-group-universal-argument - "#" gnus-group-mark-group - "\M-#" gnus-group-unmark-group) - - (gnus-define-keys (gnus-group-mark-map "M" gnus-group-mode-map) - "m" gnus-group-mark-group - "u" gnus-group-unmark-group - "w" gnus-group-mark-region - "b" gnus-group-mark-buffer - "r" gnus-group-mark-regexp - "U" gnus-group-unmark-all-groups) - - (gnus-define-keys (gnus-group-sieve-map "D" gnus-group-mode-map) - "u" gnus-sieve-update - "g" gnus-sieve-generate) - - (gnus-define-keys (gnus-group-group-map "G" gnus-group-mode-map) - "d" gnus-group-make-directory-group - "h" gnus-group-make-help-group - "u" gnus-group-make-useful-group - "a" gnus-group-make-archive-group - "k" gnus-group-make-kiboze-group - "l" gnus-group-nnimap-edit-acl - "m" gnus-group-make-group - "n" gnus-group-make-shimbun-group - "E" gnus-group-edit-group - "e" gnus-group-edit-group-method - "p" gnus-group-edit-group-parameters - "v" gnus-group-add-to-virtual - "V" gnus-group-make-empty-virtual - "D" gnus-group-enter-directory - "f" gnus-group-make-doc-group - "G" gnus-group-make-nnir-group - "w" gnus-group-make-web-group - "r" gnus-group-rename-group - "R" gnus-group-make-rss-group - "c" gnus-group-customize - "x" gnus-group-nnimap-expunge - "\177" gnus-group-delete-group - [delete] gnus-group-delete-group) - - (gnus-define-keys (gnus-group-soup-map "s" gnus-group-group-map) - "b" gnus-group-brew-soup - "w" gnus-soup-save-areas - "s" gnus-soup-send-replies - "p" gnus-soup-pack-packet - "r" nnsoup-pack-replies) - - (gnus-define-keys (gnus-group-sort-map "S" gnus-group-group-map) - "s" gnus-group-sort-groups - "a" gnus-group-sort-groups-by-alphabet - "u" gnus-group-sort-groups-by-unread - "l" gnus-group-sort-groups-by-level - "v" gnus-group-sort-groups-by-score - "r" gnus-group-sort-groups-by-rank - "m" gnus-group-sort-groups-by-method - "n" gnus-group-sort-groups-by-real-name) - - (gnus-define-keys (gnus-group-sort-selected-map "P" gnus-group-group-map) - "s" gnus-group-sort-selected-groups - "a" gnus-group-sort-selected-groups-by-alphabet - "u" gnus-group-sort-selected-groups-by-unread - "l" gnus-group-sort-selected-groups-by-level - "v" gnus-group-sort-selected-groups-by-score - "r" gnus-group-sort-selected-groups-by-rank - "m" gnus-group-sort-selected-groups-by-method - "n" gnus-group-sort-selected-groups-by-real-name) - - (gnus-define-keys (gnus-group-list-map "A" gnus-group-mode-map) - "k" gnus-group-list-killed - "z" gnus-group-list-zombies - "s" gnus-group-list-groups - "u" gnus-group-list-all-groups - "A" gnus-group-list-active - "a" gnus-group-apropos - "d" gnus-group-description-apropos - "m" gnus-group-list-matching - "M" gnus-group-list-all-matching - "l" gnus-group-list-level - "c" gnus-group-list-cached - "?" gnus-group-list-dormant) - - (gnus-define-keys (gnus-group-list-limit-map "/" gnus-group-list-map) - "k" gnus-group-list-limit - "z" gnus-group-list-limit - "s" gnus-group-list-limit - "u" gnus-group-list-limit - "A" gnus-group-list-limit - "m" gnus-group-list-limit - "M" gnus-group-list-limit - "l" gnus-group-list-limit - "c" gnus-group-list-limit - "?" gnus-group-list-limit) - - (gnus-define-keys (gnus-group-list-flush-map "f" gnus-group-list-map) - "k" gnus-group-list-flush - "z" gnus-group-list-flush - "s" gnus-group-list-flush - "u" gnus-group-list-flush - "A" gnus-group-list-flush - "m" gnus-group-list-flush - "M" gnus-group-list-flush - "l" gnus-group-list-flush - "c" gnus-group-list-flush - "?" gnus-group-list-flush) - - (gnus-define-keys (gnus-group-list-plus-map "p" gnus-group-list-map) - "k" gnus-group-list-plus - "z" gnus-group-list-plus - "s" gnus-group-list-plus - "u" gnus-group-list-plus - "A" gnus-group-list-plus - "m" gnus-group-list-plus - "M" gnus-group-list-plus - "l" gnus-group-list-plus - "c" gnus-group-list-plus - "?" gnus-group-list-plus) - - (gnus-define-keys (gnus-group-score-map "W" gnus-group-mode-map) - "f" gnus-score-flush-cache) - - (gnus-define-keys (gnus-group-help-map "H" gnus-group-mode-map) - "c" gnus-group-fetch-charter - "C" gnus-group-fetch-control - "d" gnus-group-describe-group - "f" gnus-group-fetch-faq - "v" gnus-version) - - (gnus-define-keys (gnus-group-sub-map "S" gnus-group-mode-map) - "l" gnus-group-set-current-level - "t" gnus-group-unsubscribe-current-group - "s" gnus-group-unsubscribe-group - "k" gnus-group-kill-group - "y" gnus-group-yank-group - "w" gnus-group-kill-region - "\C-k" gnus-group-kill-level - "z" gnus-group-kill-all-zombies)) +(gnus-define-keys gnus-group-mode-map + " " gnus-group-read-group + "=" gnus-group-select-group + "\r" gnus-group-select-group + "\M-\r" gnus-group-quick-select-group + "\M- " gnus-group-visible-select-group + [(meta control return)] gnus-group-select-group-ephemerally + "j" gnus-group-jump-to-group + "n" gnus-group-next-unread-group + "p" gnus-group-prev-unread-group + "\177" gnus-group-prev-unread-group + [delete] gnus-group-prev-unread-group + [backspace] gnus-group-prev-unread-group + "N" gnus-group-next-group + "P" gnus-group-prev-group + "\M-n" gnus-group-next-unread-group-same-level + "\M-p" gnus-group-prev-unread-group-same-level + "," gnus-group-best-unread-group + "." gnus-group-first-unread-group + "u" gnus-group-unsubscribe-current-group + "U" gnus-group-unsubscribe-group + "c" gnus-group-catchup-current + "C" gnus-group-catchup-current-all + "\M-c" gnus-group-clear-data + "l" gnus-group-list-groups + "L" gnus-group-list-all-groups + "m" gnus-group-mail + "i" gnus-group-news + "g" gnus-group-get-new-news + "\M-g" gnus-group-get-new-news-this-group + "R" gnus-group-restart + "r" gnus-group-read-init-file + "B" gnus-group-browse-foreign-server + "b" gnus-group-check-bogus-groups + "F" gnus-group-find-new-groups + "\C-c\C-d" gnus-group-describe-group + "\M-d" gnus-group-describe-all-groups + "\C-c\C-a" gnus-group-apropos + "\C-c\M-\C-a" gnus-group-description-apropos + "a" gnus-group-post-news + "\ek" gnus-group-edit-local-kill + "\eK" gnus-group-edit-global-kill + "\C-k" gnus-group-kill-group + "\C-y" gnus-group-yank-group + "\C-w" gnus-group-kill-region + "\C-x\C-t" gnus-group-transpose-groups + "\C-c\C-l" gnus-group-list-killed + "\C-c\C-x" gnus-group-expire-articles + "\C-c\M-\C-x" gnus-group-expire-all-groups + "V" gnus-version + "s" gnus-group-save-newsrc + "z" gnus-group-suspend + "q" gnus-group-exit + "Q" gnus-group-quit + "?" gnus-group-describe-briefly + "\C-c\C-i" gnus-info-find-node + "\M-e" gnus-group-edit-group-method + "^" gnus-group-enter-server-mode + gnus-mouse-2 gnus-mouse-pick-group + "<" beginning-of-buffer + ">" end-of-buffer + "\C-c\C-b" gnus-bug + "\C-c\C-n" gnus-namazu-search + "\C-c\C-s" gnus-group-sort-groups + "t" gnus-topic-mode + "\C-c\M-g" gnus-activate-all-groups + "\M-&" gnus-group-universal-argument + "#" gnus-group-mark-group + "\M-#" gnus-group-unmark-group) + +(gnus-define-keys (gnus-group-mark-map "M" gnus-group-mode-map) + "m" gnus-group-mark-group + "u" gnus-group-unmark-group + "w" gnus-group-mark-region + "b" gnus-group-mark-buffer + "r" gnus-group-mark-regexp + "U" gnus-group-unmark-all-groups) + +(gnus-define-keys (gnus-group-sieve-map "D" gnus-group-mode-map) + "u" gnus-sieve-update + "g" gnus-sieve-generate) + +(gnus-define-keys (gnus-group-group-map "G" gnus-group-mode-map) + "d" gnus-group-make-directory-group + "h" gnus-group-make-help-group + "u" gnus-group-make-useful-group + "a" gnus-group-make-archive-group + "k" gnus-group-make-kiboze-group + "l" gnus-group-nnimap-edit-acl + "m" gnus-group-make-group + "n" gnus-group-make-shimbun-group + "E" gnus-group-edit-group + "e" gnus-group-edit-group-method + "p" gnus-group-edit-group-parameters + "v" gnus-group-add-to-virtual + "V" gnus-group-make-empty-virtual + "D" gnus-group-enter-directory + "f" gnus-group-make-doc-group + "G" gnus-group-make-nnir-group + "w" gnus-group-make-web-group + "M" gnus-group-read-ephemeral-group + "r" gnus-group-rename-group + "R" gnus-group-make-rss-group + "c" gnus-group-customize + "x" gnus-group-nnimap-expunge + "\177" gnus-group-delete-group + [delete] gnus-group-delete-group) + +(gnus-define-keys (gnus-group-soup-map "s" gnus-group-group-map) + "b" gnus-group-brew-soup + "w" gnus-soup-save-areas + "s" gnus-soup-send-replies + "p" gnus-soup-pack-packet + "r" nnsoup-pack-replies) + +(gnus-define-keys (gnus-group-sort-map "S" gnus-group-group-map) + "s" gnus-group-sort-groups + "a" gnus-group-sort-groups-by-alphabet + "u" gnus-group-sort-groups-by-unread + "l" gnus-group-sort-groups-by-level + "v" gnus-group-sort-groups-by-score + "r" gnus-group-sort-groups-by-rank + "m" gnus-group-sort-groups-by-method + "n" gnus-group-sort-groups-by-real-name) + +(gnus-define-keys (gnus-group-sort-selected-map "P" gnus-group-group-map) + "s" gnus-group-sort-selected-groups + "a" gnus-group-sort-selected-groups-by-alphabet + "u" gnus-group-sort-selected-groups-by-unread + "l" gnus-group-sort-selected-groups-by-level + "v" gnus-group-sort-selected-groups-by-score + "r" gnus-group-sort-selected-groups-by-rank + "m" gnus-group-sort-selected-groups-by-method + "n" gnus-group-sort-selected-groups-by-real-name) + +(gnus-define-keys (gnus-group-list-map "A" gnus-group-mode-map) + "k" gnus-group-list-killed + "z" gnus-group-list-zombies + "s" gnus-group-list-groups + "u" gnus-group-list-all-groups + "A" gnus-group-list-active + "a" gnus-group-apropos + "d" gnus-group-description-apropos + "m" gnus-group-list-matching + "M" gnus-group-list-all-matching + "l" gnus-group-list-level + "c" gnus-group-list-cached + "?" gnus-group-list-dormant) + +(gnus-define-keys (gnus-group-list-limit-map "/" gnus-group-list-map) + "k" gnus-group-list-limit + "z" gnus-group-list-limit + "s" gnus-group-list-limit + "u" gnus-group-list-limit + "A" gnus-group-list-limit + "m" gnus-group-list-limit + "M" gnus-group-list-limit + "l" gnus-group-list-limit + "c" gnus-group-list-limit + "?" gnus-group-list-limit) + +(gnus-define-keys (gnus-group-list-flush-map "f" gnus-group-list-map) + "k" gnus-group-list-flush + "z" gnus-group-list-flush + "s" gnus-group-list-flush + "u" gnus-group-list-flush + "A" gnus-group-list-flush + "m" gnus-group-list-flush + "M" gnus-group-list-flush + "l" gnus-group-list-flush + "c" gnus-group-list-flush + "?" gnus-group-list-flush) + +(gnus-define-keys (gnus-group-list-plus-map "p" gnus-group-list-map) + "k" gnus-group-list-plus + "z" gnus-group-list-plus + "s" gnus-group-list-plus + "u" gnus-group-list-plus + "A" gnus-group-list-plus + "m" gnus-group-list-plus + "M" gnus-group-list-plus + "l" gnus-group-list-plus + "c" gnus-group-list-plus + "?" gnus-group-list-plus) + +(gnus-define-keys (gnus-group-score-map "W" gnus-group-mode-map) + "f" gnus-score-flush-cache) + +(gnus-define-keys (gnus-group-help-map "H" gnus-group-mode-map) + "c" gnus-group-fetch-charter + "C" gnus-group-fetch-control + "d" gnus-group-describe-group + "f" gnus-group-fetch-faq + "v" gnus-version) + +(gnus-define-keys (gnus-group-sub-map "S" gnus-group-mode-map) + "l" gnus-group-set-current-level + "t" gnus-group-unsubscribe-current-group + "s" gnus-group-unsubscribe-group + "k" gnus-group-kill-group + "y" gnus-group-yank-group + "w" gnus-group-kill-region + "\C-k" gnus-group-kill-level + "z" gnus-group-kill-all-zombies) (defun gnus-topic-mode-p () "Return non-nil in `gnus-topic-mode'." @@ -1504,7 +1504,7 @@ if it is a string, only list groups matching REGEXP." (active (gnus-active group)) (total (if active (1+ (- (cdr active) (car active))) 0)) (info (nth 2 entry)) - (method (gnus-server-get-method group (gnus-info-method info))) + (method (inline (gnus-server-get-method group (gnus-info-method info)))) (marked (gnus-info-marks info)) (mailp (apply 'append (mapcar @@ -2026,6 +2026,14 @@ If SELECT-ARTICLES, only select those articles. If PARAMETERS, use those as the group parameters. Return the name of the group if selection was successful." + (interactive + (list + ;; (gnus-read-group "Group name: ") + (completing-read + "Group: " gnus-active-hashtb + nil nil nil + 'gnus-group-history) + (gnus-read-method "From method: "))) ;; Transform the select method into a unique server. (when (stringp method) (setq method (gnus-server-to-method method))) @@ -3251,15 +3259,18 @@ Uses the process/prefix convention." (interactive (list current-prefix-arg - (string-to-int - (let ((s (read-string - (format "Level (default %s): " - (or (gnus-group-group-level) - gnus-level-default-subscribed))))) - (if (string-match "^\\s-*$" s) - (int-to-string (or (gnus-group-group-level) - gnus-level-default-subscribed)) - s))))) + (progn + (unless (gnus-group-process-prefix current-prefix-arg) + (error "No group on the current line")) + (string-to-int + (let ((s (read-string + (format "Level (default %s): " + (or (gnus-group-group-level) + gnus-level-default-subscribed))))) + (if (string-match "^\\s-*$" s) + (int-to-string (or (gnus-group-group-level) + gnus-level-default-subscribed)) + s)))))) (unless (and (>= level 1) (<= level gnus-level-killed)) (error "Invalid level: %d" level)) (let ((groups (gnus-group-process-prefix n)) diff --git a/lisp/gnus-logic.el b/lisp/gnus-logic.el index 20fe9e0..06c46fb 100644 --- a/lisp/gnus-logic.el +++ b/lisp/gnus-logic.el @@ -95,6 +95,7 @@ gnus-newsgroup-scored) (when trace (push (cons "A file" rule) + ;; Must be synced with `gnus-score-edit-file-at-point'. gnus-score-trace))))))) (defun gnus-advanced-score-rule (rule) diff --git a/lisp/gnus-nocem.el b/lisp/gnus-nocem.el index 38bd552..af7d085 100644 --- a/lisp/gnus-nocem.el +++ b/lisp/gnus-nocem.el @@ -298,7 +298,8 @@ valid issuer, which is much faster if you are selective about the issuers." (while (search-forward "\t" nil t) (cond ((not (ignore-errors - (setq group (let ((obarray gnus-active-hashtb)) (read buf))))) + (setq group (let ((obarray gnus-nocem-real-group-hashtb)) + (read buf))))) ;; An error. ) ((not (symbolp group)) diff --git a/lisp/gnus-score.el b/lisp/gnus-score.el index 7e580d6..d9015b6 100644 --- a/lisp/gnus-score.el +++ b/lisp/gnus-score.el @@ -1141,21 +1141,38 @@ EXTRA is the possible non-standard header." 4 (substitute-command-keys "\\\\[gnus-score-edit-exit] to save edits"))) -(defun gnus-score-edit-file-at-point () - "Edit score file at point. Useful especially after `V t'." - (interactive) - (let* ((string (ffap-string-at-point)) - ;; FIXME: Should be the full `match element', not just string at - ;; point. - file) - (save-excursion - (end-of-line) - (setq file (ffap-string-at-point))) - (gnus-score-edit-file file) - (unless (string= string file) - (goto-char (point-min)) - ;; Goto first match - (search-forward string nil t)))) +(defun gnus-score-edit-file-at-point (&optional format) + "Edit score file at point in Score Trace buffers. +If FORMAT, also format the current score file." + (let* ((rule (save-excursion + (beginning-of-line) + (read (current-buffer)))) + (sep "[ \n\r\t]*") + ;; Must be synced with `gnus-score-find-trace': + (reg " -> +") + (file (save-excursion + (end-of-line) + (if (and (re-search-backward reg (gnus-point-at-bol) t) + (re-search-forward reg (gnus-point-at-eol) t)) + (buffer-substring (point) (gnus-point-at-eol)) + nil)))) + (if (or (not file) + (string-match "\\<\\(non-file rule\\|A file\\)\\>" file) + ;; (see `gnus-score-find-trace' and `gnus-score-advanced') + (string= "" file)) + (gnus-error 3 "Can't find a score file in current line.") + (gnus-score-edit-file file) + (when format + (gnus-score-pretty-print)) + (when (consp rule) ;; the rule exists + (setq rule (mapconcat #'(lambda (obj) + (regexp-quote (format "%S" obj))) + rule + sep)) + (goto-char (point-min)) + (re-search-forward rule nil t) + ;; make it easy to use `kill-sexp': + (goto-char (1- (match-beginning 0))))))) (defun gnus-score-load-file (file) ;; Load score file FILE. Returns a list a retrieved score-alists. @@ -2389,7 +2406,10 @@ score in `gnus-newsgroup-scored' by SCORE." (let ((gnus-newsgroup-headers (list (gnus-summary-article-header))) (gnus-newsgroup-scored nil) - trace) + ;; Must be synced with `gnus-score-edit-file-at-point': + (frmt "%S [%s] -> %s\n") + trace + file) (save-excursion (nnheader-set-temp-buffer "*Score Trace*")) (setq gnus-score-trace nil) @@ -2399,18 +2419,44 @@ score in `gnus-newsgroup-scored' by SCORE." 1 "No score rules apply to the current article (default score %d)." gnus-summary-default-score) (set-buffer "*Score Trace*") - ;; ToDo: Use a keymap instead? + ;; Use a keymap instead? (local-set-key "q" (lambda () (interactive) (bury-buffer nil) (gnus-summary-expand-window))) - (local-set-key "e" 'gnus-score-edit-file-at-point) + (local-set-key "e" (lambda () + "Run `gnus-score-edit-file-at-point'." + (interactive) + (gnus-score-edit-file-at-point))) + (local-set-key "f" (lambda () + "Run `gnus-score-edit-file-at-point'." + (interactive) + (gnus-score-edit-file-at-point 'format))) + (local-set-key "t" 'toggle-truncate-lines) (setq truncate-lines t) - (while trace - (insert (format "%S -> %s\n" (cdar trace) - (or (caar trace) "(non-file rule)"))) - (setq trace (cdr trace))) + (dolist (entry trace) + (setq file (or (car entry) + ;; Must be synced with + ;; `gnus-score-edit-file-at-point': + "(non-file rule)")) + (insert + (format frmt + (cdr entry) + ;; Don't use `file-name-sans-extension' to see .SCORE and + ;; .ADAPT directly: + (file-name-nondirectory file) + (abbreviate-file-name file)))) + (insert + "\n\nQuick help: + +Type `e' to edit score file corresponding to the score rule on current line, +`f' to format (pretty print) the score file and edit it, +`t' toggle to truncate long lines in this buffer, +`q' to quit. + +The first sexp on each line is the score rule, followed by the file name of +the score file and its full name, including the directory.") (goto-char (point-min)) (gnus-configure-windows 'score-trace))) (set-buffer gnus-summary-buffer) diff --git a/lisp/gnus-start.el b/lisp/gnus-start.el index ec9adab..122288a 100644 --- a/lisp/gnus-start.el +++ b/lisp/gnus-start.el @@ -1557,7 +1557,7 @@ newsgroup." ;; If the agent is enabled, we may have to alter the active info. (when (and gnus-agent info) (gnus-agent-possibly-alter-active - (gnus-info-group info) active)) + (gnus-info-group info) active)) ;; Modify the list of read articles according to what articles ;; are available; then tally the unread articles and add the @@ -1645,7 +1645,10 @@ newsgroup." gnus-activate-foreign-newsgroups) (t 0)) level)) - scanned-methods info group active method retrieve-groups) + (methods-cache nil) + (type-cache nil) + scanned-methods info group active method retrieve-groups cmethod + method-type) (gnus-message 6 "Checking new news...") (while newsrc @@ -1664,12 +1667,25 @@ newsgroup." ;; nil for non-foreign groups that the user has requested not be checked ;; t for unchecked foreign groups or bogus groups, or groups that can't ;; be checked, for one reason or other. - (if (and (setq method (gnus-info-method info)) - (not (inline - (gnus-server-equal - gnus-select-method - (setq method (gnus-server-get-method nil method))))) - (not (gnus-secondary-method-p method))) + (when (setq method (gnus-info-method info)) + (if (setq cmethod (assoc method methods-cache)) + (setq method (cdr cmethod)) + (setq cmethod (inline (gnus-server-get-method nil method))) + (push (cons method cmethod) methods-cache) + (setq method cmethod))) + (when (and method + (not (setq method-type (cdr (assoc method type-cache))))) + (setq method-type + (cond + ((gnus-secondary-method-p method) + 'secondary) + ((inline (gnus-server-equal gnus-select-method method)) + 'primary) + (t + 'foreign))) + (push (cons method method-type) type-cache)) + (if (and method + (eq method-type 'foreign)) ;; These groups are foreign. Check the level. (when (and (<= (gnus-info-level info) foreign-level) (setq active (gnus-activate-group group 'scan))) diff --git a/lisp/gnus-sum.el b/lisp/gnus-sum.el index 885c42c..4cf3076 100644 --- a/lisp/gnus-sum.el +++ b/lisp/gnus-sum.el @@ -2185,20 +2185,20 @@ gnus-summary-show-article-from-menu-as-charset-%s" cs)))) gnus-article-outlook-deuglify-article t]) ) ("Output" - ["Save in default format" gnus-summary-save-article + ["Save in default format..." gnus-summary-save-article ,@(if (featurep 'xemacs) '(t) '(:help "Save article using default method"))] - ["Save in file" gnus-summary-save-article-file + ["Save in file..." gnus-summary-save-article-file ,@(if (featurep 'xemacs) '(t) '(:help "Save article in file"))] - ["Save in Unix mail format" gnus-summary-save-article-mail t] - ["Save in MH folder" gnus-summary-save-article-folder t] - ["Save in VM folder" gnus-summary-save-article-vm t] - ["Save in RMAIL mbox" gnus-summary-save-article-rmail t] - ["Save body in file" gnus-summary-save-article-body-file t] - ["Pipe through a filter" gnus-summary-pipe-output t] + ["Save in Unix mail format..." gnus-summary-save-article-mail t] + ["Save in MH folder..." gnus-summary-save-article-folder t] + ["Save in VM folder..." gnus-summary-save-article-vm t] + ["Save in RMAIL mbox..." gnus-summary-save-article-rmail t] + ["Save body in file..." gnus-summary-save-article-body-file t] + ["Pipe through a filter..." gnus-summary-pipe-output t] ["Add to SOUP packet" gnus-soup-add-article t] - ["Print with Muttprint" gnus-summary-muttprint t] + ["Print with Muttprint..." gnus-summary-muttprint t] ["Print" gnus-summary-print-article t]) ("Backend" ["Respool article..." gnus-summary-respool-article t] @@ -2632,7 +2632,7 @@ and backwards while displaying articles, type `\\[gnus-summary-next-unread-artic respectively. You can also post articles and send mail from this buffer. To -follow up an article, type `\\[gnus-summary-followup]'. To mail a reply to the author +follow up an article, type `\\[gnus-summary-followup]'. To mail a reply to the author of an article, type `\\[gnus-summary-reply]'. There are approx. one gazillion commands you can execute in this @@ -7447,7 +7447,7 @@ is a number, it is the line the article is to be displayed on." t)) (prog1 (if (and (stringp article) - (string-match "@" article)) + (string-match "@\\|%40" article)) (gnus-summary-refer-article article) (when (stringp article) (setq article (string-to-number article))) @@ -8119,6 +8119,9 @@ of what's specified by the `gnus-refer-thread-limit' variable." (setq message-id (concat "<" message-id))) (unless (string-match ">$" message-id) (setq message-id (concat message-id ">"))) + ;; People often post MIDs from URLs, so unhex it: + (unless (string-match "@" message-id) + (setq message-id (gnus-url-unhex-string message-id))) (let* ((header (gnus-id-to-header message-id)) (sparse (and header (gnus-summary-article-sparse-p diff --git a/lisp/gnus-util.el b/lisp/gnus-util.el index 61224a2..09cf62b 100644 --- a/lisp/gnus-util.el +++ b/lisp/gnus-util.el @@ -1514,6 +1514,7 @@ predicate on the elements." (defvar xemacs-codename)) (defun gnus-emacs-version () + "Stringified Emacs version." (let ((system-v (cond ((eq gnus-user-agent 'emacs-gnus-config) diff --git a/lisp/gnus-vers.el b/lisp/gnus-vers.el index 36a3822..b7c7171 100644 --- a/lisp/gnus-vers.el +++ b/lisp/gnus-vers.el @@ -40,10 +40,10 @@ ;; Product information of this gnus. (product-provide 'gnus-vers (product-define "T-gnus" nil - (list 6 16 3 + (list 6 16 4 (string-to-number gnus-revision-number)))) -(defconst gnus-original-version-number "5.10.3" +(defconst gnus-original-version-number "5.10.4" "Version number for this version of Gnus.") (provide 'running-pterodactyl-gnus-0_73-or-later) diff --git a/lisp/gnus.el b/lisp/gnus.el index bdb8680..49296f7 100644 --- a/lisp/gnus.el +++ b/lisp/gnus.el @@ -338,7 +338,9 @@ be set in `.emacs' instead." (:type xbm :file "gnus-pointer.xbm" :ascent center)))) gnus-mode-line-image-cache) - 'help-echo "This is Gnus") + 'help-echo (format + "This is %s, %s." + gnus-version (gnus-emacs-version))) str) (list str)) line))) @@ -3578,10 +3580,10 @@ You should probably use `gnus-find-method-for-group' instead." (defsubst gnus-secondary-method-p (method) "Return whether METHOD is a secondary select method." (let ((methods gnus-secondary-select-methods) - (gmethod (gnus-server-get-method nil method))) + (gmethod (inline (gnus-server-get-method nil method)))) (while (and methods (not (gnus-method-equal - (gnus-server-get-method nil (car methods)) + (inline (gnus-server-get-method nil (car methods))) gmethod))) (setq methods (cdr methods))) methods)) @@ -3992,21 +3994,19 @@ Disallow invalid group names." (cons (or default "") 0) 'gnus-group-history))) (let ((match (match-string 0 group))) - ;; `/' may be okay (e.g. for nnimap), so ask the user: - (unless (and (string-match "/" match) + ;; Might be okay (e.g. for nnimap), so ask the user: + (unless (and (not (string-match "^$\\|:" match)) (message-y-or-n-p "Proceed and create group anyway? " t "The group name \"" group "\" contains a forbidden character: \"" match "\". Usually, it's dangerous to create a group with this name, because it's not -supported by all back ends and servers. On some IMAP servers, it's valid to -use the character \"/\". - -If you are really sure, you can proceed anyway and create the group. +supported by all back ends and servers. On IMAP servers it should work, +though. If you are really sure, you can proceed anyway and create the group. You may customize the variable `gnus-invalid-group-regexp', which currently is set to \"" gnus-invalid-group-regexp -"\", if you want to get rid of this query.")) +"\", if you want to get rid of this query permanently.")) (setq prefix (format "Invalid group name: \"%s\". " group) group nil))))) group)) @@ -4151,7 +4151,7 @@ current display is used." (defun gnus (&optional arg dont-connect slave) "Read network news. If ARG is non-nil and a positive number, Gnus will use that as the -startup level. If ARG is non-nil and not a positive number, Gnus will +startup level. If ARG is non-nil and not a positive number, Gnus will prompt the user for the name of an NNTP server to use." (interactive "P") (unless (byte-code-function-p (symbol-function 'gnus)) diff --git a/lisp/message.el b/lisp/message.el index 07a5f06..45a0f06 100644 --- a/lisp/message.el +++ b/lisp/message.el @@ -5767,7 +5767,6 @@ If the current line has `message-yank-prefix', insert it on the new line." (error (split-line)))) - (defun message-fill-header (header value) (let ((begin (point)) (fill-column 78) diff --git a/lisp/mml-sec.el b/lisp/mml-sec.el index 757a0f8..c1a494b 100644 --- a/lisp/mml-sec.el +++ b/lisp/mml-sec.el @@ -1,5 +1,5 @@ ;;; mml-sec.el --- A package with security functions for MML documents -;; Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +;; Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ;; Author: Simon Josefsson @@ -40,8 +40,15 @@ ("pgpmime" mml-pgpmime-sign-buffer list)) "Alist of MIME signer functions.") -(defvar mml-default-sign-method (caar mml-sign-alist) - "Default sign method.") +(defcustom mml-default-sign-method "pgpmime" + "Default sign method. +The string must have an entry in `mml-sign-alist'." + :type '(choice (const "smime") + (const "pgp") + (const "pgpauto") + (const "pgpmime") + string) + :group 'message) (defvar mml-encrypt-alist '(("smime" mml-smime-encrypt-buffer mml-smime-encrypt-query) @@ -50,8 +57,15 @@ ("pgpmime" mml-pgpmime-encrypt-buffer list)) "Alist of MIME encryption functions.") -(defvar mml-default-encrypt-method (caar mml-encrypt-alist) - "Default encryption method.") +(defcustom mml-default-encrypt-method "pgpmime" + "Default encryption method. +The string must have an entry in `mml-encrypt-alist'." + :type '(choice (const "smime") + (const "pgp") + (const "pgpauto") + (const "pgpmime") + string) + :group 'message) (defcustom mml-signencrypt-style-alist '(("smime" separate) @@ -75,7 +89,7 @@ details." (string :tag "User defined")) (choice (const :tag "Separate" separate) (const :tag "Combined" combined))))) - + ;;; Configuration/helper functions (defun mml-signencrypt-style (method &optional style) diff --git a/lisp/mml.el b/lisp/mml.el index a2a487a..cdec507 100644 --- a/lisp/mml.el +++ b/lisp/mml.el @@ -430,8 +430,7 @@ If MML is non-nil, return the buffer up till the correspondent mml tag." (+ (match-beginning 0) 3)))))) (cond ((eq (car cont) 'mml) - (let ((mml-boundary (funcall mml-boundary-function - (incf mml-multipart-number))) + (let ((mml-boundary (mml-compute-boundary cont)) (mml-generate-default-type "text/plain")) (mml-to-mime)) (let ((mm-7bit-chars (concat mm-7bit-chars "\x1b"))) @@ -936,6 +935,19 @@ See Info node `(emacs-mime)Composing'. (setq description nil)) description)) +(defun mml-minibuffer-read-disposition (type &optional default) + (let* ((default (or default + (if (string-match "^text/.*" type) + "inline" + "attachment"))) + (disposition (completing-read "Disposition: " + '(("attachment") ("inline") ("")) + nil + nil))) + (if (not (equal disposition "")) + disposition + default))) + (defun mml-quote-region (beg end) "Quote the MML tags in the region." (interactive "r") @@ -978,7 +990,7 @@ See Info node `(emacs-mime)Composing'. ;;; Attachment functions. -(defun mml-attach-file (file &optional type description) +(defun mml-attach-file (file &optional type description disposition) "Attach a file to the outgoing MIME message. The file is not inserted or encoded until you send the message with `\\[message-send-and-exit]' or `\\[message-send]'. @@ -989,10 +1001,14 @@ description of the attachment." (interactive (let* ((file (mml-minibuffer-read-file "Attach file: ")) (type (mml-minibuffer-read-type file)) - (description (mml-minibuffer-read-description))) - (list file type description))) - (mml-insert-empty-tag 'part 'type type 'filename file - 'disposition "attachment" 'description description)) + (description (mml-minibuffer-read-description)) + (disposition (mml-minibuffer-read-disposition type))) + (list file type description disposition))) + (mml-insert-empty-tag 'part + 'type type + 'filename file + 'disposition (or disposition "attachment") + 'description description)) (defun mml-attach-buffer (buffer &optional type description) "Attach a buffer to the outgoing MIME message. @@ -1061,6 +1077,8 @@ If RAW, don't highlight the article." (switch-to-buffer (generate-new-buffer (concat (if raw "*Raw MIME preview of " "*MIME preview of ") (buffer-name)))) + (when (boundp 'gnus-buffers) + (push (current-buffer) gnus-buffers)) (erase-buffer) (insert-buffer-substring buf) (mml-preview-insert-mail-followup-to) diff --git a/lisp/mml2015.el b/lisp/mml2015.el index b7cdbcb..6bf4f4e 100644 --- a/lisp/mml2015.el +++ b/lisp/mml2015.el @@ -278,8 +278,7 @@ (defun mml2015-mailcrypt-sign (cont) (mc-sign-generic (message-options-get 'message-sender) nil nil nil nil) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number))) + (let ((boundary (mml-compute-boundary cont)) hash point) (goto-char (point-min)) (unless (re-search-forward "^-----BEGIN PGP SIGNED MESSAGE-----\r?$" nil t) @@ -342,8 +341,7 @@ (goto-char (point-min)) (unless (looking-at "-----BEGIN PGP MESSAGE-----") (error "Fail to encrypt the message")) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number)))) + (let ((boundary (mml-compute-boundary cont))) (insert (format "Content-Type: multipart/encrypted; boundary=\"%s\";\n" boundary)) (insert "\tprotocol=\"application/pgp-encrypted\"\n\n") @@ -545,8 +543,7 @@ mm-security-handle 'gnus-info "Failed"))) (defun mml2015-gpg-sign (cont) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number))) + (let ((boundary (mml-compute-boundary cont)) (text (current-buffer)) signature) (goto-char (point-max)) (unless (bolp) @@ -579,8 +576,7 @@ (goto-char (point-max))))) (defun mml2015-gpg-encrypt (cont &optional sign) - (let ((boundary - (funcall mml-boundary-function (incf mml-multipart-number))) + (let ((boundary (mml-compute-boundary cont)) (text (current-buffer)) cipher) (mm-with-unibyte-current-buffer @@ -808,7 +804,7 @@ (defun mml2015-pgg-sign (cont) (let ((pgg-errors-buffer mml2015-result-buffer) - (boundary (funcall mml-boundary-function (incf mml-multipart-number))) + (boundary (mml-compute-boundary cont)) (pgg-default-user-id (or (message-options-get 'mml-sender) pgg-default-user-id))) (unless (pgg-sign-region (point-min) (point-max)) @@ -830,7 +826,7 @@ (defun mml2015-pgg-encrypt (cont &optional sign) (let ((pgg-errors-buffer mml2015-result-buffer) - (boundary (funcall mml-boundary-function (incf mml-multipart-number)))) + (boundary (mml-compute-boundary cont))) (unless (pgg-encrypt-region (point-min) (point-max) (split-string (or diff --git a/lisp/nnml.el b/lisp/nnml.el index 9657e78..7b0ae9c 100644 --- a/lisp/nnml.el +++ b/lisp/nnml.el @@ -628,8 +628,12 @@ marks file will be regenerated properly by Gnus.") (defun nnml-save-mail (group-art) "Called narrowed to an article." - (let (chars headers) + (let (chars headers extension) (setq chars (nnmail-insert-lines)) + (setq extension + (and nnml-use-compressed-files + (> chars 1000) + ".gz")) (nnmail-insert-xref group-art) (run-hooks 'nnmail-prepare-save-mail-hook) (run-hooks 'nnml-prepare-save-mail-hook) @@ -644,7 +648,8 @@ marks file will be regenerated properly by Gnus.") (nnml-possibly-create-directory (caar ga)) (let ((file (concat (nnmail-group-pathname (caar ga) nnml-directory) - (int-to-string (cdar ga))))) + (int-to-string (cdar ga)) + extension))) (if first ;; It was already saved, so we just make a hard link. (funcall nnmail-crosspost-link-function first file t) diff --git a/lisp/smime.el b/lisp/smime.el index 436a475..908e696 100644 --- a/lisp/smime.el +++ b/lisp/smime.el @@ -184,6 +184,27 @@ and the files themself should be in PEM format." (const :tag "RC2 128 bits" "-rc2-128")) :group 'smime) +(defcustom smime-crl-check nil + "*Check revocation status of signers certificate using CRLs. +Enabling this will have OpenSSL check the signers certificate +against a certificate revocation list (CRL). + +For this to work the CRL must be up-to-date and since they are +normally updated quite often (ie. several times a day) you +probably need some tool to keep them up-to-date. Unfortunately +Gnus cannot do this for you. + +The CRL should either be appended (in PEM format) to your +`smime-CA-file' or be located in a file (also in PEM format) in +your `smime-certificate-directory' named to the X.509 hash of the +certificate with .r0 as file name extension. + +At least OpenSSL version 0.9.7 is required for this to work." + :type '(choice (const :tag "No check" nil) + (const :tag "Check certificate" "-crl_check") + (const :tag "Check certificate chain" "-crl_check_all")) + :group 'smime) + (defcustom smime-dns-server nil "*DNS server to query certificates from. If nil, use system defaults." @@ -348,6 +369,8 @@ Any details (stdout and stderr) are left in the buffer specified by (expand-file-name smime-CA-directory)))))) (unless CAs (error "No CA configured")) + (if smime-crl-check + (add-to-list 'CAs smime-crl-check)) (if (apply 'smime-call-openssl-region b e (list smime-details-buffer t) "smime" "-verify" "-out" "/dev/null" CAs) t diff --git a/lisp/spam.el b/lisp/spam.el index 751d7ed..9097dda 100644 --- a/lisp/spam.el +++ b/lisp/spam.el @@ -705,16 +705,12 @@ spam-use-* variable.") (defun spam-ham-copy-or-move-routine (copy groups) (gnus-summary-kill-process-mark) - (let ((articles gnus-newsgroup-articles) + (let ((todo (spam-list-articles gnus-newsgroup-articles 'ham)) (backend-supports-deletions (gnus-check-backend-function 'request-move-article gnus-newsgroup-name)) (respool-method (gnus-find-method-for-group gnus-newsgroup-name)) article mark todo deletep respool) - (dolist (article articles) - (when (spam-group-ham-mark-p gnus-newsgroup-name - (gnus-summary-article-mark article)) - (push article todo))) (when (member 'respool groups) (setq respool t) ; boolean for later @@ -1035,12 +1031,20 @@ functions") (let ((mark-check (if (eq classification 'spam) 'spam-group-spam-mark-p 'spam-group-ham-mark-p)) - mark list) + list mark-cache-yes mark-cache-no) (dolist (article articles) - (when (funcall mark-check - gnus-newsgroup-name - (gnus-summary-article-mark article)) - (push article list))) + (let ((mark (gnus-summary-article-mark article))) + (unless (memq mark mark-cache-no) + (if (memq mark mark-cache-yes) + (push article list) + ;; else, we have to actually check the mark + (if (funcall mark-check + gnus-newsgroup-name + mark) + (progn + (push article list) + (push mark mark-cache-yes)) + (push mark mark-cache-no)))))) list)) (defun spam-register-routine (classification diff --git a/texi/ChangeLog b/texi/ChangeLog index 3f340b0..82845ac 100644 --- a/texi/ChangeLog +++ b/texi/ChangeLog @@ -1,6 +1,55 @@ +2004-01-02 Teodor Zlatanov + + * gnus.texi (Top): updated menu with new manual nodes + (The problem of spam): more ranting + (Anti-Spam Basics): "spammers are wise to [filtering on From:]" + (SpamAssassin): mention spam.el + (Hashcash): do not a sentence end proposition with + (Filtering Spam Using The Spam ELisp Package): more and better + explanation, took lots of information out into subsections + (Spam ELisp Package Sequence of Events) + (Spam ELisp Package Filtering of Incoming Mail) + (Spam ELisp Package Global Variables): new or updated content all + around + (Spam ELisp Package Configuration Examples): promised new + section, empty for now + (Blacklists and Whitelists, BBDB Whitelists) + (Gmane Spam Reporting, Bogofilter, spam-stat spam filtering) + (SpamOracle): mention that spam/ham processor variables are being + obsoleted + (Extending the Spam ELisp package): add some new documentation + for adding a new backend to spam.el + +2004-01-02 Reiner Steib + + * gnus.texi (Foreign Groups): Add `gnus-group-read-ephemeral-group'. + (Oort Gnus): Ditto. + +2004-01-02 Lars Magne Ingebrigtsen + + * message.texi (Key Index): Untabified. + + * gnus.texi (RSS): kindex. + +2003-12-30 Reiner Steib + + * gnus.texi (Summary Score Commands): Add `f' to + `gnus-score-find-trace'. + (Score File Editing): Added `V t'. + +2003-12-31 Steve Youngs + + * gnus.texi (XEmacs): Update list of Gnus XEmacs package + requirements. + +2003-12-30 Reiner Steib + + * gnus.texi (Canceling and Superseding): Mention `Cancel-Lock'. + 2003-12-30 Lars Magne Ingebrigtsen * gnus.texi (Maildir): Filled. + (Key Index): Untabified. 2003-12-29 Lars Magne Ingebrigtsen diff --git a/texi/gnus-ja.texi b/texi/gnus-ja.texi index fbb57b2..2a50572 100644 --- a/texi/gnus-ja.texi +++ b/texi/gnus-ja.texi @@ -633,6 +633,9 @@ Marking Articles * Unread Articles:: $BL$FI5-;v$X$N0u(B * Read Articles:: $B4{FI5-;v$X$N0u(B * Other Marks:: $B9XFIEY$K1F6A$7$J$$0u(B + +Marking Articles + * Setting Marks:: $B0u$NIU$1J}$H>C$7J}(B * Generic Mark Commands:: $B0u$r$I$N$h$&$K%+%9%?%^%$%:$9$k$+(B * Setting Process Marks:: $B8e$No!"(B@code{gnus-activate-level} $B$+$=$l$h$j>.$5$$%l%Y%k$N%0%k!<% $B$F$-$^$9!#$h$j4JC1$K(B @acronym{NNTP} $B%0%k!<%W$r9XFI$9$kJ}K!$K$D$$$F$O!"(B @ref{Browse Foreign Server} $B$r;2>H$7$F2<$5$$!#(B +@item G M +@kindex G M ($B%0%k!<%W(B) +@findex gnus-group-read-ephemeral-group +$B0l;~%K%e!<%9%0%k!<%W$r:n@.$7$^(B +$B$9(B (@code{gnus-group-read-ephemeral-group})$B!#(B Gnus $B$O%W%m%s%W%H$rI=<($7(B +$B$F!"L>A0!"J}K!$*$h$S(B @dfn{address} $B$NF~NO$r5a$a$^$9!#(B + @item G n @kindex G n ($B%0%k!<%W(B) @findex gnus-group-make-shimbun-group @@ -4048,7 +4062,7 @@ Gnus $B%a!<%k$r$I$3$+$KAw$j$^$9(B (@code{gnus-group-mail})$B!#$b$7@\F,<-$,M?$($i$l(B $B$?$i8=:_0LCV$N%0%k!<%W$NEj9FMM<0(B (posting style) $B$r;H$$$^$9!#$b$7@\F,<-(B $B$,(B 1 $B$@$C$?$i!"$I$N%0%k!<%W$NEj9FMM<0$r;H$&$+$r?R$M$^$9!#(B -@xref{Composing Messages}$B!#(B +@xref{Composing Messages}. @item i @kindex i ($B%0%k!<%W(B) @@ -5448,6 +5462,10 @@ Gnus $B$O!"C$9$H$-$K!X8=:_!Y$NA*BrJ}K!$r;H$$$^$9!#I8=`$NEj9FJ}K!$r;H(B $B$$$?$$$N$G$"$l$P!"J8;z@\F,0z?t(B @samp{a} $B$r;H$C$F$/$@$5(B $B$$(B (@pxref{Symbolic Prefixes})$B!#(B +Gnus $B$O(B @code{Cancel-Lock} $B%X%C%@!<(B (@pxref{Canceling News, Canceling +News, , message, Message Manual}) $B$r;H$C$F!"$"$J$?$@$1$,$"$J$?$N%a%C%;!<(B +$B%8$r%-%c%s%;%k$G$-$k$3$H$rJ]>Z$7$^$9!#(B + $B$b$72?$+4V0c$$$r$7$?$N$K5$IU$$$F!"D{@5$r$7$?$$$N$G$"$l$P!"(B @dfn{$BBeBX(B} (@dfn{superseding}) $B5-;v$rEj9F$7$FK\5-;v$rCV$-49$($k$3$H$,$G(B $B$-$^$9!#(B @@ -14958,6 +14976,7 @@ http://w3m.sourceforge.net/ @acronym{RSS} $B$O$H$F$b5,B'E*$+$DNIo$K?7$7$/$7$F$*$/$?$a$N>pJs$rF@$k$3$H$,$G$-$^$9!#(B +@kindex G R ($B35N,(B) Feed $B$r9VFI$9$k$K$O!"35N,%P%C%U%!$+$i(B @kbd{G R} $B$r;H$C$F2<$5$$(B---feed $B$N(B $B=j:_$NF~NO$r5a$a$i$l$k$G$7$g$&!#(B @@ -17941,10 +17960,10 @@ Gnus $B$O35N,%P%C%U%!$r:n@.$9$kA0$K!"8=:_$N%0%k!<%W$KE,MQ$5$l$k$I$s(B @kindex V t ($B35N,(B) @findex gnus-score-find-trace $B8=:_$N5-;v$K;H$o$l$F$$$kA4$F$N%9%3%"K!B'(B (score rule) $B$rI=<($7$^(B -$B$9(B (@code{gnus-score-find-trace})$B!#(B@code{*Score Trace*} $B%P%C%U%!$G(B -$B$O(B @kbd{q} $B$G=*N;$9$k$3$H$,$G$-$^$9!#(B@kbd{e} $B$GBP1~$9$k%9%3%"%U%!%$%k$r(B -$BJT=8$7$^$9!#%]%$%s%H$,9gCW$7$?AG;R$NCf$NJ8;zNs>e$K$"$k$H$-!"(B@kbd{e} $B$O%9(B -$B%3%"%U%!%$%k$NCf$N$3$NJ8;zNs$N>l=j$X0\F0$7$h$&$H$7$^$9!#(B +$B$9(B (@code{gnus-score-find-trace})$B!#(B@code{*Score Trace*} $B%P%C%U%!(B +$B$G!"(B@kbd{e} $B$r%?%$%W$7$F8=:_9T$N%9%3%"K!B'$KBP1~$9$k%9%3%"%U%!%$%k$rJT=8(B +$B$9$k$3$H$,$G$-!"(B@kbd{f} $B$G$O%9%3%"%U%!%$%k$N%U%)!<%^%C(B +$B%H(B (@code{gnus-score-pretty-print}) $B$HJT=8$r9T$J$&$3$H$,$G$-$^$9!#(B @item V w @kindex V w ($B35N,(B) @@ -18657,8 +18676,8 @@ ignore)} $B$rE,1~%9%3%"$r$7$?$/$J$$%0%k!<%W$KA^F~$9$k$G$7$g$&!#>/$7$N%0%k!<(B @vindex gnus-score-mode-hook @code{gnus-score-menu-hook} $B$,%9%3%"%b!<%I%P%C%U%!$G$^$l$J$$>&MQEE;R%a!<%k(B -- $B$NF,J8(B $B3d9g$N?M!9$,(B UCE $B$K1~Ez$9$k$@$1$G9-9p@\$N_I2a$OM-1W$K$J$jF@$^$9!#(B +Spam $B$N=|5n(B (filtering) $B$X$N:G$bC1=c$J@\$N(B +$B_I2a$OM-1W$K$J$jF@$^$9!#(B $B$b$&0l$D$NEE;R%a!<%k_I2a$X$N&MQ$H!"%U%j!<$JJ,;67?(B spam $B=hM}%7%9%F%`$,$"$j$^$9!#J,;67?(B spam $B=hM}(B $B$O!"$=$l<+BN$N4m81$b$O$i$s$G$$$^$9!#Nc$($P!"@5Ev$JAw?.o$=$NJ,@O$O!"$*$=$i$/C18l$NBP$+;0$D(B @@ -21330,7 +21355,18 @@ Spam $B_I2a$X$NE}7WE*$Jl9g$K$H$F$b$h$/F/$/$N$G$9$,!";~$H$7$F@5Ev$JEE;R%a!<%k(B $B$r(B spam $B$H$7$FJ,N`$7$F$7$^$&$3$H$,$"$j$^$9!#J,@O$K$O;~4V$,$+$+$j$^$9!#$9(B $B$Y$F$N%a%C%;!<%8$rJ,@O$7$J$1$l$P$J$j$^$;$s!#$=$7$F%f!<%6!<$O(B spam $B$rJ,@O(B -$B$9$k$?$a$N%G!<%?%Y!<%9$rMQ0U$7$J$1$l$P$J$j$^$;$s!#(B +$B$9$k$?$a$N%G!<%?%Y!<%9$rMQ0U$7$J$1$l$P$J$j$^$;$s!#%5!<%P!<$G$NE}7WJ,@O$O(B +$B?M5$$rF@$F$$$^$9!#$3$l$K$O!"%f!<%6!<$OC1$K%a!<%k$rFI$a$PNI$$$H$$$&D9=j$H!"(B +$B$7$+$7%5!<%P!<$K$=$l$,2a$C$F%a!<%k$rJ,N`$7$?$3$H$rEA$($k$N$,:$Fq$@$H$$$&(B +$BC;=j$,$"$j$^$9!#(B + +$BM>?M$N8@$rBT$?$:$H$b!"(Bspam $B$H$N@o$$$O3Z$G$O$"$j$^$;$s!#%^%^$+$i$NEE;R%a!<(B +$B%k$H%P%$%"%0%i9-9p$r6hJL$9$kKbK!$N%9%$%C%A$O$"$j$^$;$s!#?M!9$O(B +$BHs(B-spam $B$H(B spam $B$r6hJL$9$k$N$KF$$$F$$$k$H$$$&$N$K!#$=$l$O!"(B +spammers $B$,7|L?$K$=$l$i$r%^%^$@$H;W$o$;$h$&$H$7$F$$$k$N$,K\$_$^$9!#(B @node Anti-Spam Basics @subsection Spam $BB`<#$N4pAC(B @@ -21398,6 +21434,8 @@ Spam $B$KBP=h$9$k0l$D$NJ}K!$O!"(Bgnus $B$KA4$F$N(B spam $B$r(B @samp{spam} $B$3$H$OA4$/$"$j$^$;$s!#F@!9>uBV$G$9!#;d$N0U8+$H$7$F$O!"(B@code{From} $B%X%C%@!<(B $B$r56B$$7$FB8:_$7$J$$%I%a%$%s$KAw$i$;$k$N$O%-%?%J%$$G$9!#(B +$B$3$N$N$[$H$s$I$NF;6q$K$b4JC1$KE,9g$9$k$O(B $B$:$G$9!#(B +$B$3$N9`$O(B @code{spam.el} $B%Q%C%1!<%8$H$O4X78L5$$$3$H$KCm0U$7$F2<$5$$!#$=$l(B +$B$Ol9g$N9M$(J}$r<($7$^(B @@ -21492,11 +21534,11 @@ Spam $B$H@o$&$?$a$N?7$7$$5;K!$O!"%a%C%;!<%8$rAw?.$9$k:]$K$$$/$P$/$+$NIiC4(B $B$3$H$O!">.$5$J%Q!<%;%s%F!<%8$N(B spam $B$,$$$D$bAGDL$j$7$F$7$^$&$3$H$r0UL#$7(B $B$^$9!#$=$l$O$^$?!"$I$3$+$G$@$l$+$,$=$l$i$NF;6q$r99?7$9$k$?$a$K!"$?$/$5$s(B $B$N(B spam $B$rFI$^$J$1$l$P$J$i$J$$$3$H$r$b0UL#$7$^$9!#(BHashcash $B$O$=$l$r2sHr(B -$B$7$^$9$,!"Be$o$j$K$"$J$?$,DL?.$9$k$9$Y$F$N?M$?$A$,!"$=$N;EAH$_$r;H$C$F$$(B -$B$k$3$H$,I,MW$G$9!#$"$J$?$Or(B (dogmatic) $B$NFs$D$N$N$P(B -$B$i$P$i$J$b$N$h$j6/NO$J$N$G$9!#(B +$B$7$^$9$,!"Be$o$j$K$"$J$?$,EE;R%a!<%k$GO"Mm$9$k$9$Y$F$N?M$?$A$K!"$J$k$Y$/(B +$B$=$N;EAH$_$r;H$C$F$b$i$&I,MW$,$"$j$^$9!#$"$J$?$Or(B (dogmatic) $B$NFs$D$N$N$P$i$P$i$J$b$N$h$j6/NO$J$N$G$9!#(B @cindex X-Hashcash $B!V$$$/$P$/$+$NIiC4!W$H$O(B CPU $B;~4V$r>CHq$9$k$3$H$G!"6qBNE*$K$O0lDj?t$N%S%C(B @@ -21554,9 +21596,9 @@ Spam $B$H@o$&$?$a$N?7$7$$5;K!$O!"%a%C%;!<%8$rAw?.$9$k:]$K$$$/$P$/$+$NIiC4(B @file{spam.el} $B$N??$NL\E*$O(B spam $B8!=P$H_I2a$N$?$a$N41@)%;%s%?!<(B $B$r(B gnus $B$NCf$K;}$D$3$H$G$9!#$=$N$?$a$K(B @file{spam.el} $B$OFs$D$N$3$H$r9T$J(B -$B$$$^$9(B: $BF~$C$F$/$k%a!<%k$r_I2a$7!"(Bspam $B$^$?$O(B ham $B$H$7$FCN$i$l$k%a!<%k$r(B -$BJ,@O$9$k$3$H$G$9!#(B@dfn{Ham} $B$O(B @file{spam.el} $B$N$$$?$k=j$G(B spam $B$G$O$J$$(B -$B%a%C%;!<%8$r<($9$?$a$K;H$&L>A0$G$9!#(B +$B$$$^$9(B: $B?7$7$$%a!<%k$r_I2a$7!"(Bspam $B$^$?$O(B ham $B$H$7$FCN$i$l$k%a!<%k$rJ,@O(B +$B$9$k$3$H$G$9!#(B@dfn{Ham} $B$O(B @file{spam.el} $B$N$$$?$k=j$G(B spam $B$G$O$J$$%a%C(B +$B%;!<%8$r<($9$?$a$K;H$&L>A0$G$9!#(B $BBh0l$K!"(B@code{spam.el} $B$r<+F0FI$_9~$_(B (autoload) $B$7$F(B @code{spam.el} $B$N(B $B3F%U%C%/$r%$%s%9%H!<%k$9$k$?$a$K!"4X(B @@ -21572,6 +21614,12 @@ spam filtering}) $B$N$G$"$l$P!"$=$l$r(B @code{spam-initialize} $B$h$jA0(B $B$G$O(B @file{spam.el} $B$rFI$_9~$`$H2?$,5/$-$k$G$7$g$&$+(B? +$BBh0l$K(B @code{spam-initialize} $B$K$h$C$F$$$/$D$+$N%U%C%/$,F0:n$9$k$h$&$K$J(B +$B$j$^$9!#(B@code{spam-stat} $B$,$=$l$i$N%G!<%?%Y!<%9$r%;!<%V$G$-$k$h$&$K$9$k(B +$B%U%C%/$H!"%0%k!<%W$KF~$k$H$-$HH4$1$k$H$-$K6=L#?<$$J*;v$r5/$3$9%U%C%/$,$"(B +$B$j$^$9!#%$%Y%s%H$N%7!<%1%s%9$K$D$$$F$N>\:Y$O8e=R(B (@pxref{Spam ELisp +Package Sequence of Events})$B!#(B + $B0J2<$N%-!<%\!<%IL?Na$,;H$($k$h$&$K$J$j$^$9(B: @table @kbd @@ -21607,6 +21655,224 @@ Spam $B5-;v$r8+$?$H$-$O$$$D$G$b!"%0%k!<%W$rH4$1$kA0$KI,$:(B @kbd{M-d} $B$G$=$ $B$-$k$h$&$K$J$j$^$9!#(B@samp{spam} $BJQ?t%0%k!<%W$K$D$$(B $B$F(B @code{customize-group} $B$r;n$7$F$_$F2<$5$$!#(B +@menu +* Spam ELisp Package Sequence of Events:: +* Spam ELisp Package Filtering of Incoming Mail:: +* Spam ELisp Package Global Variables:: +* Spam ELisp Package Configuration Examples:: +* Blacklists and Whitelists:: +* BBDB Whitelists:: +* Gmane Spam Reporting:: +* Anti-spam Hashcash Payments:: +* Blackholes:: +* Regular Expressions Header Matching:: +* Bogofilter:: +* ifile spam filtering:: +* spam-stat spam filtering:: +* SpamOracle:: +* Extending the Spam ELisp package:: +@end menu + +@node Spam ELisp Package Sequence of Events +@subsubsection Spam ELisp Package Sequence of Events +@cindex spam filtering +@cindex spam filtering sequence of events +@cindex spam + +$BI,$:$3$N9`$rFI$s$G2<$5$$!#(B@code{spam.el} $B$NF0:n$rM}2r$9$k$?$a$K!#FI$_Ht(B +$B$P$7!"B.FI!"$NItJ,$N4V$KFs$D$N@\E@(B +$B$,$"$j$^$9(B: spam $B$N$?$a$N?7Ce%a!<%k$N8!::!"$*$h$S%0%k!<%W$rH4$1$k>l9g$G(B +$B$9!#(B + +$B?7Ce%a!<%k$NH$7$F2<$5$$!#(B + +@code{nntp} $B$N$h$&$J%P%C%/%(%s%I$K$O$d$C$FMh$k%a!<%k$N%9%W!<%k$,L5$$$N$G!"(B +$BBe$o$j$N5!9=$r;H$o$J$1$l$P$J$j$^$;$s!#$3$l$O!"%5!<%P!<$,$d$C$FMh$?%a!<%k(B +$B$NJ,3d$rC4Ev$7$F$$$F!"(BGnus $B$,$5$i$KJ,3d$r9T$J$o$J$$%P%C%/%(%s%I$G$b5/$-(B +$B$k$+$b$7$l$^$;$s!#%0%k!<%W%Q%i%a!<(B +$B%?(B @code{spam-autodetect} $B$H(B @code{spam-autodetect-methods} ($BIaDL(B @kbd{G +c} and @kbd{G p} $B$GA`:n2D(B)$B!"$=$7$FBP1~$9$kJQ(B +$B?t(B @code{gnus-spam-autodetect-methods} $B$*$h(B +$B$S(B @code{gnus-spam-autodetect-methods} (@kbd{M-x customize-variable} $B$G(B +$BA`:n2D(B) $B$G$9!#(B + +@code{spam-autodetect} $B$,;H$o$l$k>l9g!"$=$l$O%0%k!<%W$KF~$k=hM}$K0z$C$+(B +$B$1$i$l$^$9!#$7$?$,$C$F!"$^$@FI$^$l$?$3$H$,L5$$!"$^$?$OL$FI$N5-;v$,$"$k%0(B +$B%k!<%W$KF~$k$3$H$O!"$d$C$FMh$?%a!<%k$N8!::$NBe$o$j$K$J$j$^$9!#$^$@FI$^$l(B +$B$?$3$H$,L5$$5-;v!"$^$?$O$9$Y$F$NL$FI$N5-;v$,=hM}$5$l$k$+$I$&$+$O!"(B +@code{spam-autodetect-recheck-messages} $B$K$h$C$F7h$^$j$^$9!#(Bt $B$K@_Dj$5$l(B +$B$k$H!"L$FI$N%a%C%;!<%8$,:F8!::$5$l$^$9!#(B + +@code{spam-autodetect} $B$O!"%f!<%6$K(B spam $B_I2a$NB?>/$N4IM}$rB(9oG'$a$^$9!#(B +$B%f!<%6$O3F%0%k!<%W$N(B spam $B$No$N(B spam $B$H$7$F(B +$B=hM}$5$l$^$9!#H`$,(B @code{spam-split} $B$G9T$J$C$F$bNI$$$h$&$K!"%f!<%6$O8!(B +$B::$N(B @emph{sequence} $B$r$h$j>/$J$/4IM}$7$^$9!#(B + +$B?7$?$KJ,3d$5$l$?%a!<%k$,%0%k!<%W$KF~$C$?!"$^$?$O%a%C%;!<%8$,(B ham $B$^$?(B +$B$O(B spam $B$H$7$F<+F08!CN$5$l$?>l9g!"8e$K(B spam $B=hM}$r9T$J$o$;$k$?$a$K!"$=$l(B +$B$i$N%0%k!<%W$r(B ($BI,MW$J$iF~$C$?8e$G(B) $BH4$1=P$J$/$F$O$J$j$^$;$s!#%0%k!<%W$,(B +$B$=$N(B @code{spam-content} $B%Q%i%a!<%?(B (@pxref{Spam ELisp Package Global +Variables}) $B$K4p$E$$$F(B ham $B$^$?$O(B spam $B%0%k!<%W$H9M$($i$l$k$+!"L$J,N`$+(B +$B$I$&$+$O=EMW$G$9!#(BSpam $B%0%k!<%W$O!"$=$3$KF~$k$H!"$^$@FI$^$l$?$3$H$,L5$$!"(B +$B$^$?$OL$FI$N5-;v$K(B spam $B$N0u$,IU$1$i$l$k(B ($BJQ(B +$B?t(B @code{spam-mark-only-unseen-as-spam} $B$K0MB8(B) $B$H$$$&DI2C$NFC@-$r;}$A$^(B +$B$9!#$3$N$h$&$K!"J,3d$5$l$F(B spam $B%0%k!<%W$KF~$l$i$l$?5-;v$K$O!"$"$J$?$,$=(B +$B$N%0%k!<%W$KF~$C$?$H$-$K<+F0E*$K(B spam $B$N0u$,IU$1$i$l$^$9!#(B + +$B$7$?$,$C$F!"%0%k!<%W$rH4$1$k$H(B @code{spam-processors} $B$,(B ($B2?$G$"$l@_Dj$5(B +$B$l$F$$$l$P(B) $BE,MQ$5$l!"=hM}$5$l$?%a!<%k$O5-;v$NJ,N`$K4p$E$$(B +$B$F(B @code{ham-process-destination} $B$+(B @code{spam-process-destination} $B$K(B +$B0\F0$5$;$i$l$^$9!#(B@code{ham-process-destination} $B$^$?(B +$B$O(B @code{spam-process-destination} $B$N$I$A$i$+$,(B ($BLuCp(B: $B0\F0@h$H$7$F(B) $BE,(B +$B@Z$G!"$=$l$i$,(B nil $B$@$C$?>l9g!"$=$N5-;v$O8=:_$N%0%k!<%W$K;D$5$l$^$9!#(B + +$B$I$l$+$N%0%k!<%W$G(B spam $B$,8+$D$+$C$?$i(B ($BHs(B-spam $B%0%k!<%W$K8B$C(B +$B$F(B @code{spam-move-spam-nonspam-groups-only} $B$GJQ992D(B)$B!"%0%k!<%W$rH4$1$k(B +$B$H$-$K3h$-$F$$$k(B @code{spam-processors} (@pxref{Spam ELisp Package +Global Variables}) $B$G=hM}$5$l$^$9!#$5$i$K!"8e$G%H%l!<%K%s%0$^$?$O:o=|$9(B +$B$k$?$a$K!"(Bspam $B$O(B @code{spam-process-destination} (@pxref{Spam ELisp +Package Global Variables}) $B$K0\F0$5$;$i$l$^$9!#(BSpam $B$,:F;0=hM}$5$l$k$3$H(B +$B$rK>$^$J$$$J$i$P!"(B@file{gnus-registry.el} $B%Q%C%1!<%8$rFI$_9~$_!"(B +@code{spam-log-to-registry} $BJQ?t$rM-8z$K$7$J$1$l$P$J$j$^$;$s!#$3$N$h$&(B +$B$K(B spam $B$O$I$3$G$b8!CN$5$l=hM}$5$l$^$9!#$=$l$O$[$H$s$I$N?M!9$,K>$`$b$N$G(B +$B$9!#(B + +Ham $B%0%k!<%W$G(B @code{ham-marks} $B%Q%i%a!<%?$G7hDj$5$l$k(B ham $B%a!<%k$,8+$D(B +$B$+$C$?$i!"%0%k!<%W$rH4$1$k$H$-$K3h$-$F$$$k(B ham @code{spam-processor} $B$G(B +$B=hM}$5$l$^$9!#$5$i$K!"JQ?t(B @code{spam-process-ham-in-spam-groups} $B$*$h(B +$B$S(B @code{spam-process-ham-in-nonham-groups} $B$K$h$C$F!"$I$3$G8+$D$+$C(B +$B$?(B ham $B$G$b=hM}$G$-$k$h$&$KF0:n$rJQ99$9$k$3$H$,$G$-$^$9!#(BHam $B$,:F;0=hM}(B +$B$5$l$k$3$H$rK>$^$J$$$J$i$P!"(B@file{gnus-registry.el} $B%Q%C%1!<%8$rFI$_9~$_!"(B +@code{spam-log-to-registry} $BJQ?t$rM-8z$K$7$J$1$l$P$J$j$^$;$s!#$3$N$h$&(B +$B$K(B ham $B$OI,MW$J>l9g$@$18!CN$5$l=hM}$5$l$^$9!#$=$l$O$[$H$s$I$N?M!9$,K>$`(B +$B$b$N$G$9!#$3$l$K4X$9$k>\:Y$O(B @xref{Spam ELisp Package Configuration +Examples}. + +$B$3$l$i$9$Y$F$,$o$1$,$o$+$i$J$/$F$b!"?4G[$OL5MQ$G$9(B ($BLuCm(B: $B$G$bLuJ8$,@53N(B +$B$G$O$J$$$+$b$7$l$J$$$N$G!"JQ$@$H;W$C$?$i86J8$r;2>H$N$3$H(B :-p)$B!#$9$0$K$=(B +$B$l$O?@7P%$%s%?!<%U%'!<%9>e$K(B Lisp $B<0$r%?%$%W$9$k$h$&$K<+A3$J$3$H$K$J$j$^(B +$B$9(B... $B$(!+$4$a$s!"$=$l$K$O$^$@(B 50$BG/Aa$$$G$9$M!#$?$@;d$?$A$r?.Mj$7$F2<$5(B +$B$$!#$=$l$OA0$N%0%k!<%W$KAw$j$^$9!#%G%#(B +$B%U%)%k%H$G$O$=$N%0%k!<%WL>$O(B @samp{spam} $B$G$9$,!"(B +@code{spam-split-group} $B$r%+%9%?%^%$%:$9$k$3$H$,2DG=$G$9!#(B +@code{spam-split-group} $B$NFbMF$,(B @emph{$B@dBP(B} $B%0%k!<%WL>$G$"$k$3$H!"Nc$((B +$B$P(B @samp{your-server} $B$H$$$&(B @code{nnimap} $B%5!<%P!<$N>l9g$O!"(B +@samp{spam} $BJQ?t$,:G=*E*$K(B @samp{nnimap+your-server:spam} $B$K$J$k$3$H$r3N(B +$B$+$a$F2<$5$$!#=>$C$F(B @samp{nnimap+server:spam} $B$H$$$&CM$O4V0c$$$G!"$=$l(B +$B$O$KBP$7(B +$B$F42MF$+$I$&$+$K0MB8$9$k$G$7$g$&!#(B + +$B$^$?!"(B@code{spam-split} $B$K%Q%i%a!<%?!"Nc$((B +$B$P(B @samp{spam-use-regex-headers} $B$^$?$O(B @samp{"maybe-spam"} $B$rM?$($k$3$H(B +$B$b$G$-$^$9!#$J$<$3$l$,M-MQ$J$N$G$7$g$&$+(B? + +$B$3$l$i$N(B (@code{spam-use-regex-headers} $B$H(B @code{spam-use-blackholes} $B$N(B +$B@_Dj$K$h$k(B) $BJ,3d$N5,B'$r8+$F2<$5$$(B: + +@example + nnimap-split-fancy '(| + (any "ding" "ding") + (: spam-split) + ;; default mailbox + "mail") +@end example + +$B$5$F!"LdBj$O(B ding $B08$F$N%a%C%;!<%8$r$9$Y$F(B ding $B%U%)%k%@!<$KF~$l$h$&$H$7(B +$B$F$$$k$3$H$G$9!#$G$b$=$l$O(B ding $B%a!<%j%s%0%j%9%H08$F$KAw$i$l$?(B spam ($BNc(B +$B$($P(B SpamAssassin $B$H(B @code{spam-use-regex-headers} $B$K$h$C$F8!=P$5$l(B +$B$k(B spam) $B$r5v$7$F$7$^$&$G$7$g$&!#0lJ}!"$$$/$D$+$N(B ding $B08$F$N%a%C%;!<%8(B +$B$O%V%i%C%/%[!<%k%j%9%H$K:\$C$F$$$k%a!<%k%5!<%P!<$+$i$d$C$FMh$k$N$G!"(B +ding $B$N5,B'$h$jA0$K(B @code{spam-split} $B$rH/F0$9$k$3$H$,$G$-$^$;$s!#(B + +SpamAssassin $B%X%C%@!<$K(B ding $B$N5,B'$rCV$-49$($5$;$k$3$H$O$G$-$^$9$,!"B>(B +$B$N$9$Y$F$N(B @code{spam-split} $B$N5,B'(B ($BBhFs$N@55,I=8=%X%C%@!<8!::$r4^(B +$B$`(B) $B$O(B ding $B$N5,B'$N8e$K$J$C$F$7$^$&$G$7$g$&!#(B + +@example + nnimap-split-fancy '(| +;;; spam-use-regex-headers $B$G8!=P$5$l$?$9$Y$F$N(B spam $B$O(B "regex-spam" $B$X!#(B + (: spam-split "regex-spam" 'spam-use-regex-headers) + (any "ding" "ding") +;;; spam-split $B$G8!=P$5$l$?B>$N$9$Y$F$N(B spam $B$O(B spam-split-group $B$X!#(B + (: spam-split) + ;; default mailbox + "mail") +@end example + +$B4pK\E*$K!"$3$l$OFC$K$"$J$?$NI,MW$K0MB8$7$?FCDj$N(B @code{spam-split} $B8!(B +$B::$r5/F0$5$;!"$=$l$i$N8!::$N7k2L$OFCDj$N(B spam $B%0%k!<%W$r;X$7<($7$^$9!#$9(B +$B$Y$F$N%a!<%k$r$9$Y$F$N(B spam $B%F%9%H$KEj$2$kI,MW$O$"$j$^$;$s!#$3$l$,NI$$JL(B +$B$NM}M3$O!"5,B'$r;}$C$F$$$k%a!<%j%s%0%j%9%H$X$N%a%C%;!<%8$KBP$7$F!";q8;=8(B +$BLsE*$J%V%i%C%/%[!<%k!&%A%'%C%/$rr7o(B +$BIU$-$NFI$_9~$_$,9T$o$l$k$+$i$G$9!#(B + +@emph{@acronym{IMAP} $BMxMQl9g$O!"%V!<(B +$B%kJQ?t(B @code{nnimap-split-download-body} $B$,@_Dj$5$l$kI,MW$,$"$j$^$9!#%G%#(B +$B%U%)%k%H$G$O!"(Bnnimap $B%P%C%/%(%s%I$O%a%C%;!<%8%X%C%@!<$@$1$rpJs(B +$B$rF@$k(B) $B$r;H$&$J$i$P!"$3$NJQ?t$r@_Dj$7$J$1$l$P$J$j$^$;$s!#$=$l(B +$B$O(B @acronym{IMAP} $B$NF0:n$rCY$/$7$F$7$^$$!"%f!<%6$rBeI=$9$k$N$K$U$5$o$7$$(B +$B7hDj$G$O$J$$$N$G!"%G%#%U%)%k%H$G$O@_Dj$5$l$F$$$^$;$s!#(B + +@xref{Splitting in IMAP}. + +@emph{TODO: spam.el $B$O$9$Y$F$NE}7W%G!<%?%Y!<%9$r%H%l!<%K%s%0$9$k$?$a$N0l(B +$BDjITJQ$NJ}K!$rDs6!$9$kI,MW$,$"$j$^$9!#$$$/$D$+$O$=$N5!G=$r<+A0$G;}$C$F$$(B +$B$^$9$,!"$=$&$G$J$$$b$N$b$"$j$^$9!#(B} + +@node Spam ELisp Package Global Variables +@subsubsection Spam ELisp Package Global Variables +@cindex spam filtering +@cindex spam filtering variables +@cindex spam variables +@cindex spam + @vindex gnus-spam-process-newsgroups Ham $B%W%m%;%C%5!<$H(B spam $B%W%m%;%C%5!<$N35G0$OHs>o$K=EMW$G$9!#$"$k%0%k!<%W(B $B$N(B ham $B%W%m%;%C%5!<$H(B spam $B%W%m%;%C%5!<$O!"(B@code{spam-process} $B%0%k!<%W(B @@ -21617,6 +21883,10 @@ ham $B%W%m%;%C%5!<$OHs(B spam (@emph{ham}) $B$G$"$k$3$H$,$o$+$C$F$$$k%a!<%k$r $B$N(B spam $B$,8!=P$5$l$k$h$&$K!"(Bspam $B$G$"$k$3$H$,$o$+$C$F$$$k%a!<%k$r\$7$/$O8D!9$N(B spam $B%W%m%;%C(B +$B%5!<$N9`$r;2>H$7$F2<$5$$!#(B + @vindex gnus-spam-newsgroup-contents gnus $B$O$"$J$?$,e$N(B spam $B%0(B $B%k!<%W$K(B spam $B5-;v$r=8$a$F!"JQ?t(B @code{spam-junk-mailgroups} $B$rE,@Z$K@_(B @@ -21663,12 +21933,17 @@ Spam $B%0%k!<%W$G$O!"%G%#%U%)%k%H$G$9$Y$F$N%a%C%;!<%8$,(B spam $B$G$"$k$H2rC5n(B (deleted)$B!"4{FI(B (read)$B!"(B $B:o=|(B (killed)$B!"(Bkill $B%U%!%$%k$K$"$k$b$N(B (kill-filed) $B$*$h$SDc$$%9%3(B -$B%"(B (low-score) $B0u$N%j%9%H$G$9!#(B +$B%"(B (low-score$B!"4{FI$@$1$l$I$b(B spam $B$G$O$J$$$H9M$($k(B) $B0u$N%j%9%H$G$9!#(B +Ham $B0u$N%j%9%H$K2D;k(B (tick) $B0u$r4^$a$k$3$H$,LrN)$D$3$H$b$"$j$^$9!#L$FI0u(B +$B$r(B ham $B0u$K$9$k$3$H$O!"DL>o$=$l$,J,N`$,B-$j$F$$$J$$$3$H$rI=$9$N$G!"4+$a(B +$B$i$l$^$;$s!#$7$+$7!"$"$J$?$,$=$l$r9T$J$&$3$H$O$G$-$k$7!";d$?$A$KITK~$O$"(B +$B$j$^$;$s!#(B @end defvar @defvar spam-marks $B$3$N%0%k!<%W$^$?$O%H%T%C%/%Q%i%a!<%?$r(B spam $B$G$"$k$H2r!$l$N(B $B%K%e!<%9%0%k!<%W$N;EMM@_Dj$O(B @code{(REGEXP PROCESSOR)} $B$N7A<0$NCM$r;}$A(B -$B$^$9!#:G=*E*$J>l=j$O%0%k!<%WL>$G$9!#(B@code{ham-process-destination} $B%Q%i(B -$B%a!<%?$,@_Dj$5$l$F$$$J$$$H!"(Bham $B5-;v$O$=$3$KN1$aCV$+$l$^$9!#(B +$B$^$9!#:G=*E*$J>l=j$O(B ($BC1?t$^$?$OJ#?t$N(B) $B%0%k!<%WL>$G$9!#(B +@code{ham-process-destination} $B%Q%i%a!<%?$,@_Dj$5$l$F$$$J$$$H!"(Bham $B5-;v(B +$B$O$=$3$KN1$aCV$+$l$^$9!#(B @code{spam-mark-ham-unread-before-move-from-spam-group} $B%Q%i%a!<%?$,@_Dj(B $B$5$l$F$$$k$H!"(Bham $B5-;v$O0\F0$5$;$i$l$kA0$KL$FI$N0u$,IU$1$i$l$^$9!#(B +$B%0%k!<%W$^$?$O@55,I=8=$4$H$KJ#?t$N0\F0@h$r;XDj$G$-$k$3$H$KCmL\$7$F2<$5$$(B! +$B$3$l$K$h$C$F(B ham $B5-;v$r@55,$N%a!<%k%0%k!<%W$H(B @emph{ham $B%H%l!<%K%s%0(B} $B%0(B +$B%k!<%W$KAw$k$3$H$,$G$-$^$9!#(B + @emph{Ham} $B%0%k!<%W$rH4$1$k$H$-$K!"(Bham $B0u$,IU$$$F$$$k$9$Y$F$N5-;v(B $B$O(B ham $B%W%m%;%C%5!<$KAw$i$l!"$=$l$i$r(B spam $B$G$O$J$$I8K\$H$7$F3X=,$7$^$9!#(B @@ -21721,122 +22001,48 @@ Spam $B%0%k!<%W$G$O!"%G%#%U%)%k%H$G$9$Y$F$N%a%C%;!<%8$,(B spam $B$G$"$k$H2r$l(B -$B$N%K%e!<%9%0%k!<%W$N;EMM@_Dj$O(B @code{(REGEXP PROCESSOR)} $B$N7A<0$NCM$r;}(B -$B$A$^$9!#:G=*E*$J>l=j$O%0%k!<%WL>$G$9!#(B@code{spam-process-destination} $B%Q(B -$B%i%a!<%?$,@_Dj$5$l$F$$$J$$$H!"(Bspam $B5-;v$OC1$K4|8B@Z$l>C5n$5$l$^$9!#(B - -$BF~$C$F$/$k%a!<%k$r_I2a$9$kL\E*$G(B @file{spam.el} $B$r;H$&$K$O!"FC5iJ,3d%j%9(B -$B%H(B @code{nnmail-split-fancy} $B$^$?$O(B @code{nnimap-split-fancy} $B$K0J2<$rDI(B -$B2C$7$J$1$l$P$J$j$^$;$s(B: - -@example -(: spam-split) -@end example - -$BFC5iJ,3d$O!"%a!<%k$NA0$N%0%k!<%W$KAw$j$^$9!#%G%#(B -$B%U%)%k%H$G$O$=$N%0%k!<%WL>$O(B @samp{spam} $B$G$9$,!"(B -@code{spam-split-group} $B$r%+%9%?%^%$%:$9$k$3$H$,2DG=$G$9!#(B -@code{spam-split-group} $B$NFbMF$,(B @emph{$B@dBP(B} $B%0%k!<%WL>$G$"$k$3$H!"Nc$((B -$B$P(B @samp{your-server} $B$H$$$&(B @code{nnimap} $B%5!<%P!<$N>l9g$O!"(B -@samp{spam} $BJQ?t$,:G=*E*$K(B @samp{nnimap+your-server:spam} $B$K$J$k$3$H$r3N(B -$B$+$a$F2<$5$$!#=>$C$F(B @samp{nnimap+server:spam} $B$H$$$&CM$O4V0c$$$G!"$=$l(B -$B$O$KBP$7(B -$B$F42MF$+$I$&$+$K0MB8$9$k$G$7$g$&!#(B - -$B$^$?!"(B@code{spam-split} $B$K%Q%i%a!<%?!"Nc$((B -$B$P(B @samp{spam-use-regex-headers} $B$^$?$O(B @samp{"maybe-spam"} $B$rM?$($k$3$H(B -$B$b$G$-$^$9!#$J$<$3$l$,M-MQ$J$N$G$7$g$&$+(B? - -$B$3$l$i$N(B (@code{spam-use-regex-headers} $B$H(B @code{spam-use-blackholes} $B$N(B -$B@_Dj$K$h$k(B) $BJ,3d$N5,B'$r8+$F2<$5$$(B: - -@example - nnimap-split-fancy '(| - (any "ding" "ding") - (: spam-split) - ;; default mailbox - "mail") -@end example - -$B$5$F!"LdBj$O(B ding $B08$F$N%a%C%;!<%8$r$9$Y$F(B ding $B%U%)%k%@!<$KF~$l$h$&$H$7(B -$B$F$$$k$3$H$G$9!#$G$b$=$l$O(B ding $B%a!<%j%s%0%j%9%H08$F$KAw$i$l$?(B spam ($BNc(B -$B$($P(B SpamAssassin $B$H(B @code{spam-use-regex-headers} $B$K$h$C$F8!=P$5$l(B -$B$k(B spam) $B$r5v$7$F$7$^$&$G$7$g$&!#0lJ}!"$$$/$D$+$N(B ding $B08$F$N%a%C%;!<%8(B -$B$O%V%i%C%/%[!<%k%j%9%H$K:\$C$F$$$k%a!<%k%5!<%P!<$+$i$d$C$FMh$k$N$G!"(B -ding $B$N5,B'$h$jA0$K(B @code{spam-split} $B$rH/F0$9$k$3$H$,$G$-$^$;$s!#(B - -SpamAssassin $B%X%C%@!<$K(B ding $B$N5,B'$rCV$-49$($5$;$k$3$H$O$G$-$^$9$,!"B>(B -$B$N$9$Y$F$N(B @code{spam-split} $B$N5,B'(B ($BBhFs$N@55,I=8=%X%C%@!<8!::$r4^(B -$B$`(B) $B$O(B ding $B$N5,B'$N8e$K$J$C$F$7$^$&$G$7$g$&!#(B - -@example - nnimap-split-fancy '(| -;;; spam-use-regex-headers $B$G8!=P$5$l$?$9$Y$F$N(B spam $B$O(B "regex-spam" $B$X!#(B - (: spam-split "regex-spam" 'spam-use-regex-headers) - (any "ding" "ding") -;;; spam-split $B$G8!=P$5$l$?B>$N$9$Y$F$N(B spam $B$O(B spam-split-group $B$X!#(B - (: spam-split) - ;; default mailbox - "mail") -@end example - -$B4pK\E*$K!"$3$l$OFC$K$"$J$?$NI,MW$K0MB8$7$?FCDj$N(B @code{spam-split} $B8!(B -$B::$r5/F0$5$;!"$=$l$i$N8!::$N7k2L$OFCDj$N(B spam $B%0%k!<%W$r;X$7<($7$^$9!#$9(B -$B$Y$F$N%a!<%k$r$9$Y$F$N(B spam $B%F%9%H$KEj$2$kI,MW$O$"$j$^$;$s!#$3$l$,NI$$JL(B -$B$NM}M3$O!"5,B'$r;}$C$F$$$k%a!<%j%s%0%j%9%H$X$N%a%C%;!<%8$KBP$7$F!";q8;=8(B -$BLsE*$J%V%i%C%/%[!<%k!&%A%'%C%/$rr7o(B -$BIU$-$NFI$_9~$_$,9T$o$l$k$+$i$G$9!#(B - -@emph{@acronym{IMAP} $BMxMQl9g$O!"%V!<(B -$B%kJQ?t(B @code{nnimap-split-download-body} $B$,@_Dj$5$l$kI,MW$,$"$j$^$9!#%G%#(B -$B%U%)%k%H$G$O!"(Bnnimap $B%P%C%/%(%s%I$O%a%C%;!<%8%X%C%@!<$@$1$rpJs(B -$B$rF@$k(B) $B$r;H$&$J$i$P!"$3$NJQ?t$r@_Dj$7$J$1$l$P$J$j$^$;$s!#$=$l(B -$B$O(B @acronym{IMAP} $B$NF0:n$rCY$/$7$F$7$^$$!"%f!<%6$rBeI=$9$k$N$K$U$5$o$7$$(B -$B7hDj$G$O$J$$$N$G!"%G%#%U%)%k%H$G$O@_Dj$5$l$F$$$^$;$s!#(B - -@xref{Splitting in IMAP}. - -@emph{TODO: $B8=>u(B spam.el $B$O5-;v$r%P%C%/%(%s%I$KEjF~$9$k$3$H$@$1$r%5%]!<(B -$B%H$7$^$9!#5-;v$,$b$O$d(B spam $B$^$?$O(B ham $B$G$O$J$$$H(B spam.el $B$KEA$($kJ}K!$O(B -$B$"$j$^$;$s!#(B} - -@emph{TODO: spam.el $B$O$9$Y$F$NE}7W%G!<%?%Y!<%9$r71N}$9$k$?$a$N0lDjITJQ$N(B -$BJ}K!$rDs6!$9$kI,MW$,$"$j$^$9!#$$$/$D$+$O$=$N5!G=$r<+A0$G;}$C$F$$$^$9$,!"(B -$B$=$&$G$J$$$b$N$b$"$j$^$9!#(B} +$B$N%K%e!<%9%0%k!<%W$N;EMM@_Dj$O(B @code{(REGEXP GROUP)} $B$N7A<0$NCM$r;}$A$^(B +$B$9!#:G=*E*$J>l=j$O(B ($BC1?t$^$?$OJ#?t$N(B) $B%0%k!<%WL>$G$9!#(B +@code{spam-process-destination} $B%Q%i%a!<%?$,@_Dj$5$l$F$$$J$$$H!"(Bspam $B5-(B +$B;v$OC1$K4|8B@Z$l>C5n$5$l$^$9!#%0%k!<%WL>$O40A47A$G$"$k$3$H!"$9$J$o$A%0%k!<(B +$B%W%P%C%U%!$G%0%k!<%WL>$NA0$K(B @samp{nntp:servername} $B$N$h$&$J$b$N$,8+$($k(B +$B>l9g$O!"$3$3$G$b$=$l$r;H$&I,MW$,$"$j$^$9!#(B + +$B%0%k!<%W$^$?$O@55,I=8=$4$H$KJ#?t$N0\F0@h$r;XDj$G$-$k$3$H$KCmL\$7$F2<$5$$(B! +$B$3$l$K$h$C$F(B spam $B5-;v$r@55,$N%a!<%k%0%k!<%W(B +$B$H(B @emph{spam $B%H%l!<%K%s%0(B} $B%0%k!<%W$KAw$k$3$H$,$G$-$^$9!#(B + +@vindex spam-log-to-registry +Ham $B$H(B spam $B$K4X$9$kLdBj$O!"(BGnus $B$,%G%#%U%)%k%H$G$O$3$N=hM}$rDI@W$7$F$/(B +$B$l$J$$$3$H$G$9!#=hM}$5$l$?5-;v$rDI@W$7!"$+$DJ#?t2s$K$o$?$C$F=hM}$9$k$3$H(B +$B$r2sHr$9$k$?$a$K(B @code{spam.el} $B$,(B @code{gnus-registry.el} $B$r;H$&$h$&$K!"(B +@code{spam-log-to-registry} $BJQ?t$rM-8z$K$7$F$/$@$5$$!#EPO??t$r@)8B$9$k$H!"(B +$B@)8B$,L5$$>l9g$N$h$&$KF0:n$7$J$$$3$H$r3P$($F$*$$$F2<$5$$!#(B + +@vindex spam-mark-only-unseen-as-spam +Spam $B%0%k!<%W$K$"$k!"$^$@FI$^$l$?$3$H$,L5$$5-;v$@$1$K(B spam $B$N0u$rIU$1$?(B +$B$$>l9g$O!"$3$NJQ?t$r%;%C%H$7$F2<$5$$!#%G%#%U%)%k%H$G$O%;%C%H$5$l$F$$$^$9!#(B +$B$3$l$r(B nil $B$K$9$k$H!"L$FI$N5-;v$K$b(B spam $B0u$,IU$1$i$l$^$9!#(B + +@vindex spam-mark-ham-unread-before-move-from-spam-group +Ham $B$,(B spam $B%0%k!<%W$+$i0\F0$5$l$kA0$K0u$r>C$7$?$$>l9g$O!"$3$NJQ?t$r%;%C(B +$B%H$7$F2<$5$$!#$3$l$O(B ham $B$K0u$rIU$1$k$?$a$K2D;k(B (tick) $B0u$N$h$&$J$b$N$r(B +$B;H$&>l9g$K!"$H$F$bLr$KN)$A$^$9!#5-;v$O$"$?$+$b$=$l$,%a!<%k%5!<%P$r=P$?$P(B +$B$+$j$N$h$&$K!"L50u$G(B ham $B=hM}>l$KCV$+$l$k$G$7$g$&!#(B + +@vindex spam-autodetect-recheck-messages +$B$3$NJQ?t$O(B @code{spam.el} $B$,(B spam $B$N<+F08!CN$r9T$J$&>l9g$K!"$^$@FI$^$l$?(B +$B$3$H$,L5$$5-;v$@$1!"$^$?$O$9$Y$F$NL$FI5-;v$N(B spam $B8!::$r9T$J$&$+$I$&$+$r(B +$B;X<($7$^$9!#$3$l$O$=$N$^$^$K$7$F$*$/$3$H$r4+$a$^$9!#(B + +@node Spam ELisp Package Configuration Examples +@subsubsection Spam ELisp Package Configuration Examples +@cindex spam filtering +@cindex spam filtering configuration examples +@cindex spam configuration examples +@cindex spam -$B0J2<$O(B @code{spam-split} $B$NF0:n$r@)8f$9$k$?$a$K;H$&$3$H$,$G$-$k3F $B$,%0%k!<%W$N(B @code{spam-process} $B%Q%i%a!<%?$K2C$($i$l$k$H!"(Bspam $B0u$,IU$$(B $B$?5-;v$NAw?.)$7$^$9!#$9$Y$FF1Ey$KF0(B +$B:n$9$k$3$H$OJ]>Z$5$l$^$9!#(B + @end defvar @defvar gnus-group-ham-exit-processor-whitelist @@ -21892,6 +22104,12 @@ SpamAssassin $B%X%C%@!<$K(B ding $B$N5,B'$rCV$-49$($5$;$k$3$H$O$G$-$^$9$,!"B> $B$N(B ham $B%W%m%;%C%5!<$O(B @emph{spam} $B$+(B @emph{$BL$J,N`(B} $B%0%k!<%W$K$O8z2L$r5Z(B $B$\$5$J$$$3$H$KCm0U$7$F2<$5$$!#(B +@emph{$B7Y9p(B} + +$BGQ$l$?(B @code{gnus-group-ham-exit-processor-whitelist} $B$NBe$o$j$K!"(B +@code{'(ham spam-use-whitelist)} $B$r;H$&$3$H$r?d>)$7$^$9!#$9$Y$FF1Ey$KF0(B +$B:n$9$k$3$H$OJ]>Z$5$l$^$9!#(B + @end defvar $B%V%i%C%/%j%9%H$O!"$"$J$?$,(B spam $B$NAw?. $B%m%;%C%5!<$O(B @emph{spam} $B$+(B @emph{$BL$J,N`(B} $B%0%k!<%W$K$O8z2L$r5Z$\$5$J$$$3(B $B$H$KCm0U$7$F2<$5$$!#(B +@emph{$B7Y9p(B} + +$BGQ$l$?(B @code{gnus-group-ham-exit-processor-BBDB} $B$NBe$o$j$K!"(B +@code{'(ham spam-use-BBDB)} $B$r;H$&$3$H$r?d>)$7$^$9!#$9$Y$FF1Ey$KF0:n$9$k(B +$B$3$H$OJ]>Z$5$l$^$9!#(B + @end defvar @node Gmane Spam Reporting @@ -21967,6 +22191,12 @@ SpamAssassin $B%X%C%@!<$K(B ding $B$N5,B'$rCV$-49$($5$;$k$3$H$O$G$-$^$9$,!"B> Gmane $B$O(B @uref{http://gmane.org} $B$G8+$D$1$k$3$H$,$G$-$^$9!#(B +@emph{$B7Y9p(B} + +$BGQ$l$?(B @code{gnus-group-spam-exit-processor-report-gmane} $B$NBe$o$j$K!"(B +@code{'(spam spam-use-gmane)} $B$r;H$&$3$H$r?d>)$7$^$9!#$9$Y$FF1Ey$KF0:n$9(B +$B$k$3$H$OJ]>Z$5$l$^$9!#(B + @end defvar @defvar spam-report-gmane-use-article-number @@ -22129,6 +22359,12 @@ Path $B$K(B @code{bogofilter} $B$Nl9g!"(BBogofilter $B$N $B$O(B @code{gnus-spam-process-newsgroups} $BJQ?t$K2C$($F2<$5$$!#$3$N%7%s%\%k(B $B$,%0%k!<%W$N(B @code{spam-process} $B%Q%i%a!<%?$K2C$($i$l$k$H!"(Bspam $B0u$,IU$$(B $B$?5-;v$,(B bogofilter $B$N(B spam $B%G!<%?%Y!<%9$K2C$($i$^$9!#(B + +@emph{$B7Y9p(B} + +$BGQ$l$?(B @code{gnus-group-spam-exit-processor-bogofilter} $B$NBe$o$j$K!"(B +@code{'(spam spam-use-bogofilter)} $B$r;H$&$3$H$r?d>)$7$^$9!#$9$Y$FF1Ey$K(B +$BF0:n$9$k$3$H$OJ]>Z$5$l$^$9!#(B @end defvar @defvar gnus-group-ham-exit-processor-bogofilter @@ -22139,6 +22375,12 @@ Path $B$K(B @code{bogofilter} $B$Nl9g!"(BBogofilter $B$N $B$?(B @emph{ham} $B%0%k!<%W$N5-;v$,Hs(B-spam $B5-;vMQ$N(B Bogofilter $B%G!<%?%Y!<%9$K(B $BDI2C$5$l$^$9!#$3$N(B ham $B%W%m%;%C%5!<$O(B @emph{spam} $B$+(B @emph{$BL$J,N`(B} $B%0%k!<(B $B%W$K$O8z2L$r5Z$\$5$J$$$3$H$KCm0U$7$F2<$5$$!#(B + +@emph{$B7Y9p(B} + +$BGQ$l$?(B @code{gnus-group-ham-exit-processor-bogofilter} $B$NBe$o$j$K!"(B +@code{'(ham spam-use-bogofilter)} $B$r;H$&$3$H$r?d>)$7$^$9!#$9$Y$FF1Ey$KF0(B +$B:n$9$k$3$H$OJ]>Z$5$l$^$9!#(B @end defvar @defvar spam-bogofilter-database-directory @@ -22174,8 +22416,8 @@ Bogofilter $B$K;w$?E}7WJ,@O4o$G$"(B @code{spam-use-ifile} $B$K!"C1$J$k(B spam/$BHs(B-spam $B$G$O$J$/$F(B ifile $B$N$9$Y$F(B $B$N%+%F%4%j!<$rM?$($F$b$i$$$?$$$J$i$P!"$3$NJQ?t$rM-8z$K$7$F2<$5$$!#$3$l$r(B -$B;H$&>l9g$O!"$=$NJ88%$K=q$+$l$F$$$k$h$&$K(B ifile $B$r71N}$7$F$*$+$J$1$l$P$J(B -$B$j$^$;$s!#(B +$B;H$&>l9g$O!"$=$NJ88%$K=q$+$l$F$$$k$h$&$K(B ifile $B$r%H%l!<%K%s%0$7$F$*$+$J(B +$B$1$l$P$J$j$^$;$s!#(B @end defvar @@ -22220,6 +22462,12 @@ Emacs Lisp $B$K$h$kE}7WJ,@O4o$G$"$k(B spam-stat.el $B$r(B @code{spam-split} $B$O(B @code{gnus-spam-process-newsgroups} $BJQ?t$K2C$($F2<$5$$!#$3$N%7%s%\%k(B $B$,%0%k!<%W$N(B @code{spam-process} $B%Q%i%a!<%?$K2C$($i$l$k$H!"(Bspam $B0u$,IU$$(B $B$?5-;v$,(B spam $B5-;vMQ$N(B spam-stat $B%G!<%?%Y!<%9$KDI2C$5$l$^$9!#(B + +@emph{$B7Y9p(B} + +$BGQ$l$?(B @code{gnus-group-spam-exit-processor-stat} $B$NBe$o$j$K!"(B +@code{'(spam spam-use-stat)} $B$r;H$&$3$H$r?d>)$7$^$9!#$9$Y$FF1Ey$KF0:n$9(B +$B$k$3$H$OJ]>Z$5$l$^$9!#(B @end defvar @defvar gnus-group-ham-exit-processor-stat @@ -22230,6 +22478,12 @@ Emacs Lisp $B$K$h$kE}7WJ,@O4o$G$"$k(B spam-stat.el $B$r(B @code{spam-split} $B$?(B @emph{ham} $B%0%k!<%W$N5-;v$,Hs(B-spam $B5-;vMQ$N(B spam-stat $B%G!<%?%Y!<%9$K(B $BDI2C$5$l$^$9!#$3$N(B ham $B%W%m%;%C%5!<$O(B @emph{spam} $B$+(B @emph{$BL$J,N`(B} $B%0%k!<(B $B%W$K$O8z2L$r5Z$\$5$J$$$3$H$KCm0U$7$F2<$5$$!#(B + +@emph{$B7Y9p(B} + +$BGQ$l$?(B @code{gnus-group-ham-exit-processor-stat} $B$NBe$o$j$K!"(B +@code{'(ham spam-use-stat)} $B$r;H$&$3$H$r?d>)$7$^$9!#$9$Y$FF1Ey$KF0:n$9$k(B +$B$3$H$OJ]>Z$5$l$^$9!#(B @end defvar $B$3$l$O(B @file{spam.el} $B$,(B @file{spam-stat.el} $B$HF/$-9g$&$3$H$r2DG=$K$7$^(B @@ -22299,13 +22553,14 @@ SpamOracle $B$O$=$N2r@O7k2L$r%G!<%?%Y!<%9$H$7$F3JG<$9$k$?$a$K!"%G%#%U%)%k(B @end defvar SpamOracle $B$O%a%C%;!<%8$,(B spam $B$+(B ham $B$+$r8+6K$a$k$?$a$KE}7WE*$J/$J$$NI$$7k2L$rF@$k$?$a$K!"(BSpamOracle $B$O71N}$r(B -$BI,MW$H$7$^$9!#(BSpamOracle $B$O(B spam $B%a!<%k$NFCD'$r3X$S$^$9!#(B@emph{add} $B%b!<(B -$B%I(B ($B71N}%b!<%I(B) $B$r;H$C$F!"NI$$%a!<%k(B (ham) $B$H(B spam $B$r(B SpamOracle $B$KM?$((B -$B$J$1$l$P$J$j$^$;$s!#$3$l$O!"35N,%P%C%U%!$G(B @kbd{|} $B$r2!$9$3$H$K$h$C$F%a!<(B -$B%k$r(B SpamOracle $B$N%W%m%;%9$K%Q%$%W$9$k$+!"$^$?(B -$B$O(B @file{spam.el} $B$N(B spam $B$*$h$S(B ham $B%W%m%;%C%5!<$r;H$&$3$H$K$h$C$F9T$J(B -$B$&$3$H$,$G$-$^$9!"(B@xref{Filtering Spam Using The Spam ELisp Package}. +$B$$$^$9!#4V0c$$$d8+F($7$N>/$J$$NI$$7k2L$rF@$k$?$a$K!"(BSpamOracle $B$O%H%l!<(B +$B%K%s%0$rI,MW$H$7$^$9!#(BSpamOracle $B$O(B spam $B%a!<%k$NFCD'$r3X$S$^$9!#(B +@emph{add} $B%b!<%I(B ($B%H%l!<%K%s%0!&%b!<%I(B) $B$r;H$C$F!"NI$$%a!<(B +$B%k(B (ham) $B$H(B spam $B$r(B SpamOracle $B$KM?$($J$1$l$P$J$j$^$;$s!#$3$l$O!"35N,%P%C(B +$B%U%!$G(B @kbd{|} $B$r2!$9$3$H$K$h$C$F%a!<%k$r(B SpamOracle $B$N%W%m%;%9$K%Q%$%W(B +$B$9$k$+!"$^$?$O(B @file{spam.el} $B$N(B spam $B$*$h$S(B ham $B%W%m%;%C%5!<$r;H$&$3$H(B +$B$K$h$C$F9T$J$&$3$H$,$G$-$^$9!"(B@xref{Filtering Spam Using The Spam ELisp +Package}. @defvar gnus-group-spam-exit-processor-spamoracle $B$3$N%7%s%\%k$r!"%0%k!<%W%Q%i%a!<%?$N%+%9%?%^%$%:$K$h$C$F%0%k!<%W(B @@ -22313,6 +22568,12 @@ SpamOracle $B$O%a%C%;!<%8$,(B spam $B$+(B ham $B$+$r8+6K$a$k$?$a$KE}7WE*$J< $B$O(B @code{gnus-spam-process-newsgroups} $BJQ?t$K2C$($F2<$5$$!#$3$N%7%s%\%k(B $B$,%0%k!<%W$N(B @code{spam-process} $B%Q%i%a!<%?$K2C$($i$l$k$H!"(Bspam $B0u$,IU$$(B $B$?5-;v$,(B spam $B$N%5%s%W%k$H$7$F(B SpamOracle $B$KAw$i$l$^$9!#(B + +@emph{$B7Y9p(B} + +$BGQ$l$?(B @code{gnus-group-spam-exit-processor-spamoracle} $B$NBe$o$j$K!"(B +@code{'(spam spam-use-spamoracle)} $B$r;H$&$3$H$r?d>)$7$^$9!#$9$Y$FF1Ey$K(B +$BF0:n$9$k$3$H$OJ]>Z$5$l$^$9!#(B @end defvar @defvar gnus-group-ham-exit-processor-spamoracle @@ -22324,6 +22585,12 @@ SpamOracle $B$O%a%C%;!<%8$,(B spam $B$+(B ham $B$+$r8+6K$a$k$?$a$KE}7WE*$J< $B$F(B SpamOracle $B$KAw$i$l$^$9!#$3$N(B ham $B%W%m%;%C%5!<(B $B$O(B @emph{spam} $B$+(B @emph{$BL$J,N`(B} $B%0%k!<%W$K$O8z2L$r5Z$\$5$J$$$3$H$KCm0U$7(B $B$F2<$5$$!#(B + +@emph{$B7Y9p(B} + +$BGQ$l$?(B @code{gnus-group-ham-exit-processor-spamoracle} $B$NBe$o$j$K!"(B +@code{'(ham spam-use-spamoracle)} $B$r;H$&$3$H$r?d>)$7$^$9!#$9$Y$FF1Ey$KF0(B +$B:n$9$k$3$H$OJ]>Z$5$l$^$9!#(B @end defvar @emph{$BNc(B:} $B$3$l$i$O(B ham $B%0%k!<%W$H$7$FJ,N`$5$l$?!"$D$^$j(B ham $B$N5-;v$7$+(B @@ -22331,20 +22598,19 @@ SpamOracle $B$O%a%C%;!<%8$,(B spam $B$+(B ham $B$+$r8+6K$a$k$?$a$KE}7WE*$J< @example ((spam-contents gnus-group-spam-classification-ham) - (spam-process - (gnus-group-spam-exit-processor-spamoracle))) + (spam-process ((ham spam-use-spamoracle) + (spam spam-use-spamoracle)))) @end example -$B$3$N%0%k!<%W$G$O(B @code{gnus-group-spam-exit-processor-spamoracle} $B$,;E;v(B -$B$r$7$^$9!#$3$N%0%k!<%W$K(B spam $B5-;v$,$"$C$F(B (SpamOracle $B$,==J,$J%5%s%W%k(B -$B$r?)$Y$5$;$F$b$i$C$F$$$J$1$l$P!"$=$&$J$j$^$9$M(B)$B!"$+$D%f!<%6$,$$$/$D$+$N(B -$B5-;v$K(B spam $B$N0u$rIU$1$?$J$i$P!"$=$l$i$N5-;v(B -$B$O(B @code{gnus-group-spam-exit-processor-spamoracle} $B$K$h$C$F=hM}$5$l$^$9!#(B -$B$3$N%W%m%;%C%5!<$O!"?7$7$$(B spam $B$N%5%s%W%k$H$7$F(B SpamOracle $B$K5-;v$rAw$j(B -$B$^$9!#(B +$B$3$N%0%k!<%W$G$O(B @code{spam-use-spamoracle} $B$,(B ham $B$H(B spam $BN>J}$N=hM}$r(B +$B9T$J$$$^$9!#$3$N%0%k!<%W$K(B spam $B5-;v$,$"$C$F(B (SpamOracle $B$,==J,$J%5%s%W(B +$B%k$r?)$Y$5$;$F$b$i$C$F$$$J$1$l$P!"$=$&$J$j$^$9$M(B)$B!"$+$D%f!<%6$,$$$/$D$+(B +$B$N5-;v$K(B spam $B$N0u$rIU$1$?$J$i$P!"$=$l$i$N5-;v$O(B SpamOracle $B$K$h$C$F=hM}(B +$B$5$l$^$9!#$=$N%W%m%;%C%5!<$O!"?7$7$$(B spam $B$N%5%s%W%k$H$7$F(B SpamOracle $B$K(B +$B5-;v$rAw$j$^$9!#(B -@node Extending the spam elisp package -@subsubsection Spam elisp $B%Q%C%1!<%8$N3HD%(B +@node Extending the Spam ELisp package +@subsubsection Spam ELisp $B%Q%C%1!<%8$N3HD%(B @cindex spam filtering @cindex spam elisp package, extending @cindex extending the spam elisp package @@ -22368,14 +22634,35 @@ SpamOracle $B$O%a%C%;!<%8$,(B spam $B$+(B ham $B$+$r8+6K$a$k$?$a$KE}7WE*$J< (spam-use-blackbox . spam-check-blackbox) @end example +$B$rDI2C!#(B@code{spam-list-of-processors} $B$K(B + +@example + (gnus-group-ham-exit-processor-blackbox ham spam-use-blackbox) + (gnus-group-spam-exit-processor-blackbox spam spam-use-blackbox) +@end example + +$B$rDI2C!#(B@code{spam-registration-functions} $B$K(B + +@example + (spam-use-blackbox spam-blackbox-register-routine + nil + spam-blackbox-unregister-routine + nil) +@end example + $B$rDI2C!#(B +$B$NEPO?(B/$B:o=|%k!<%A%s$r=q$$$F2<$5$$!#(B + @item $B4X?t(B @code{spam-check-blackbox} $B4X?t$r=q$$$F2<$5$$!#$=$l(B -$B$O(B @samp{nil} $B$+(B @code{spam-split-group} $B$rJV$5$J$1$l$P$J$j$^$;$s!#$"$J(B -$B$?$K$G$-$k$3$H$NNc$O!"4{B8$N(B @code{spam-check-*} $B4X?t$r;2>H$7$F$/$@$5$$!#(B +$B$OB>$N=,47$KJo$C$F(B @samp{nil} $B$+(B @code{spam-split-group} $B$rJV$5$J$1$l$P(B +$B$J$j$^$;$s!#$"$J$?$K$G$-$k$3$H$NNc$O!"4{B8$N(B @code{spam-check-*} $B4X?t$r(B +$B;2>H$7$F$/$@$5$$!#$^$?!"$"$J$?$,$=$&$G$J$$M}M3$r40A4$KM}2r$7$F$$$J$$$J$i(B +$B$P!"%F%s%W%l!<%H$Ksv$jIU$$$F2<$5$$!#(B $B%V%i%C%/%\%C%/%9$,!"$=$l$,F0:n$9$k$?$a$K%a%C%;!<%8A4BN$rI,MW$H$9$kE}7WE*(B $B%a!<%kJ,@O4o$G$"$k$N$J$i$P!"(B @@ -22394,48 +22681,42 @@ Spam $B$^$?$O(B ham $B$N%W%m%;%C%5!<$rMQ0U$9$kI,MW$O$"$j$^$;$s!#(B Blackbox $B$,(B spam $B$^$?$O(B ham $B$N=hM}$r%5%]!<%H$9$k>l9g$@$1!"$=$l$i$rMQ0U$7(B $B$F2<$5$$!#(B +$B$5$i$K(B ham $B$H(B spam $B$N%W%m%;%C%5!<$OC10l$NJQ?t$G$O$J$/$5$l$D$D$"$j!"Be$o(B +$B$j$K(B @code{'(spam spam-use-blackbox)} $B$^$?(B +$B$O(B @code{'(ham spam-use-blackbox)} $B$N7A<0$,?d>)$5$l$^$9!#:#$N$H$3(B +$B$m(B spam/ham $B%W%m%;%C%5!