(eval-when-compile (require 'cl))
(eval-when-compile (require 'spam-report))
(eval-when-compile (require 'hashcash))
+(eval-when-compile (require 'ietf-drums))
(require 'gnus-sum)
(defcustom spam-mark-new-messages-in-spam-group-as-spam t
"Whether new messages in a spam group should get the spam-mark."
:type 'boolean
+ ;; :version "22.1" ;; Gnus 5.10.8 / No Gnus 0.3
:group 'spam)
(defcustom spam-log-to-registry nil
(push 'X-Spam-Status list))
(when spam-use-bogofilter
(push 'X-Bogosity list))
+ (when spam-use-crm114
+ (push 'X-CRM114-Status list))
list))
(defun spam-user-format-function-S (headers)
(return))))
result))
+(defvar spam-spamassassin-score-regexp
+ ".*\\b\\(?:score\\|hits\\)=\\(-?[0-9.]+\\)"
+ "Regexp matching SpamAssassin score header.
+The first group must match the number.")
+;; "score" for Spamassassin 3.0 or later:
+;; X-Spam-Status: Yes, score=13.1 required=5.0 tests=DNS_FROM_RFC_ABUSE,
+;; [...],UNDISC_RECIPS autolearn=disabled version=3.0.3
+
+
(defun spam-extra-header-to-number (header headers)
"Transform an extra HEADER to a number, using list of HEADERS.
Note this has to be fast."
- (if (gnus-extra-header header headers)
- (cond
- ((eq header 'X-Spam-Status)
- (string-to-number (gnus-replace-in-string
- (gnus-extra-header header headers)
- ".*hits=" "")))
- ;; for CRM checking, it's probably faster to just do the string match
- ((and spam-use-crm114 (string-match "( pR: \\([0-9.-]+\\)" header))
- (match-string 1 header))
- ((eq header 'X-Bogosity)
- (string-to-number (gnus-replace-in-string
- (gnus-replace-in-string
- (gnus-extra-header header headers)
- ".*spamicity=" "")
- ",.*" "")))
- (t nil))
- nil))
+ (let ((header-content (gnus-extra-header header headers)))
+ (if header-content
+ (cond
+ ((eq header 'X-Spam-Status)
+ (string-to-number (gnus-replace-in-string
+ header-content
+ spam-spamassassin-score-regexp
+ "\\1")))
+ ;; for CRM checking, it's probably faster to just do the string match
+ ((and spam-use-crm114 (string-match "( pR: \\([0-9.-]+\\)" header-content))
+ (string-to-number (match-string 1 header-content)))
+ ((eq header 'X-Bogosity)
+ (string-to-number (gnus-replace-in-string
+ (gnus-replace-in-string
+ header-content
+ ".*spamicity=" "")
+ ",.*" "")))
+ (t nil))
+ nil)))
(defun spam-summary-score (headers &optional specific-header)
"Score an article for the summary buffer, as fast as possible.
"Enter an address into the BBDB; implies ham (non-spam) sender"
(dolist (from addresses)
(when (stringp from)
- (let* ((parsed-address (gnus-extract-address-components from))
- (name (or (nth 0 parsed-address) "Ham Sender"))
+ (let* ((parsed-address (ietf-drums-parse-address from))
+ (name (or (nth 1 parsed-address) "Ham Sender"))
(remove-function (if remove
'bbdb-delete-record-internal
'ignore))
- (net-address (nth 1 parsed-address))
+ (net-address (nth 0 parsed-address))
(record (and net-address
(bbdb-search-simple nil net-address))))
(when net-address
bbdb-hashtable))))
(puthash 'spam-use-BBDB bbdb-cache spam-caches)))
(when who
- (setq who (nth 1 (gnus-extract-address-components who)))
+ (setq who (car (ietf-drums-parse-address who)))
(if
(if spam-cache-lookups
(intern-soft (downcase who) bbdb-cache)
(forward-line 1)
;; insert the e-mail address if detected, otherwise the raw data
(unless (zerop (length address))
- (let ((pure-address (nth 1 (gnus-extract-address-components address))))
+ (let ((pure-address (car (ietf-drums-parse-address address))))
(push (or pure-address address) contents)))))
(nreverse contents))))
(if db `("-d" ,db "-v") `("-v"))))
(setq return (spam-check-bogofilter-headers score))))
return)
- (gnus-error "`spam.el' doesnt support obsolete bogofilter versions")))
+ (gnus-error 5 "`spam.el' doesn't support obsolete bogofilter versions")))
(defun spam-bogofilter-register-with-bogofilter (articles
spam
spam-bogofilter-path
nil nil nil switch
(if db `("-d" ,db "-v") `("-v")))))))
- (gnus-error "`spam.el' doesnt support obsolete bogofilter versions")))
+ (gnus-error 5 "`spam.el' doesn't support obsolete bogofilter versions")))
(defun spam-bogofilter-register-spam-routine (articles &optional unregister)
(spam-bogofilter-register-with-bogofilter articles t unregister))
(if score ; scoring mode
(let ((header (message-fetch-field spam-spamassassin-spam-status-header)))
(when header
- (if (string-match "\\(?:score\\|hits\\)=\\(-?[0-9.]+\\)" header)
- ;; "score" for Spamassassin 3.0 or later.
+ (if (string-match spam-spamassassin-score-regexp header)
(match-string 1 header)
"0")))
;; spam detection mode