From 45e37537620e594f0fb77210a9163e3da246666d Mon Sep 17 00:00:00 2001 From: Daniel Dehennin Date: Thu, 12 Apr 2018 00:40:13 +0200 Subject: [PATCH] Gnus Group Mail Spliting on mailing-list headers * texi/gnus.texi: Document the new `list' split abbreviation and `match-list' group parameter (bug#25346). * lisp/gnus-mlspl.el: Use the `list' abbreviation when the new `match-list' group parameter is set to `t'. The split regexp is modified to match either `@` or `.` as domain separator to comply with RFC2919 IDs too. * lisp/nnmail.el: Add new `list' split abbreviation matching common mailing-list headers. --- doc/misc/gnus.texi | 18 ++++++++++++++++++ etc/NEWS | 5 +++++ lisp/gnus/gnus-mlspl.el | 25 +++++++++++++++++++------ lisp/gnus/nnmail.el | 3 ++- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi index cc4b2342be6..de219c6e56e 100644 --- a/doc/misc/gnus.texi +++ b/doc/misc/gnus.texi @@ -3102,6 +3102,21 @@ interest in relation to the sieve parameter. The Sieve language is described in RFC 3028. @xref{Top, Emacs Sieve, Top, sieve, Emacs Sieve}. +@item match-list +@cindex match-list +If this parameter is set to @code{t} and @code{nnmail-split-method} is +set to @code{gnus-group-split}, Gnus will match @code{to-address}, +@code{to-list}, @code{extra-aliases} and @code{split-regexp} against +the @code{list} split abbreviation. The split regexp is modified to +match either a @code{@@} or a dot @code{.} in mail addresses to +conform to RFC2919 @code{List-ID}. + +See @code{nnmail-split-abbrev-alist} for the regular expression +matching mailing-list headers. + +See @pxref{Group Mail Splitting} to automatically split on group +parameters. + @item (agent parameters) If the agent has been enabled, you can set any of its parameters to control the behavior of the agent in individual groups. See Agent @@ -15475,6 +15490,9 @@ Matches the @samp{To}, @samp{Cc}, @samp{Apparently-To}, @item any Is the union of the @code{from} and @code{to} entries. @end table +@item list +Matches the @samp{List-ID}, @samp{List-Post}, @samp{X-Mailing-List}, +@samp{X-BeenThere} and @samp{X-Loop} fields. @vindex nnmail-split-fancy-syntax-table @code{nnmail-split-fancy-syntax-table} is the syntax table in effect diff --git a/etc/NEWS b/etc/NEWS index 059c6ee9f63..caa67c90b27 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -190,6 +190,11 @@ from 'gnus-score-find-favourite-words'. *** Gmane has been removed as an nnir backend, since Gmane no longer has a search engine. ++++ +*** Splitting mail on common mailing list has been added. See the +concept index in the Gnus manual for the `match-list' entry. + + ** Htmlfontify *** The functions 'hfy-color', 'hfy-color-vals' and 'hfy-fallback-color-values' and the variables 'hfy-fallback-color-map' diff --git a/lisp/gnus/gnus-mlspl.el b/lisp/gnus/gnus-mlspl.el index fb45007c126..599b9c61dcf 100644 --- a/lisp/gnus/gnus-mlspl.el +++ b/lisp/gnus/gnus-mlspl.el @@ -182,7 +182,8 @@ Calling (gnus-group-split-fancy nil nil \"mail.others\") returns: (to-list (cdr (assoc 'to-list params))) (extra-aliases (cdr (assoc 'extra-aliases params))) (split-regexp (cdr (assoc 'split-regexp params))) - (split-exclude (cdr (assoc 'split-exclude params)))) + (split-exclude (cdr (assoc 'split-exclude params))) + (match-list (cdr (assoc 'match-list params)))) (when (or to-address to-list extra-aliases split-regexp) ;; regexp-quote to-address, to-list and extra-aliases ;; and add them all to split-regexp @@ -202,16 +203,28 @@ Calling (gnus-group-split-fancy nil nil \"mail.others\") returns: "\\|") "\\)")) ;; Now create the new SPLIT - (push (append - (list 'any split-regexp) + (let ((split-regexp-with-list-ids + (replace-regexp-in-string "@" "[@.]" split-regexp t t)) + (exclude ;; Generate RESTRICTs for SPLIT-EXCLUDEs. (if (listp split-exclude) (apply #'append (mapcar (lambda (arg) (list '- arg)) split-exclude)) - (list '- split-exclude)) - (list group-clean)) - split) + (list '- split-exclude)))) + + (if match-list + ;; Match RFC2919 IDs or mail addresses + (push (append + (list 'list split-regexp-with-list-ids) + exclude + (list group-clean)) + split) + (push (append + (list 'any split-regexp) + exclude + (list group-clean)) + split))) ;; If it matches the empty string, it is a catch-all (when (string-match split-regexp "") (setq catch-all nil))))))))) diff --git a/lisp/gnus/nnmail.el b/lisp/gnus/nnmail.el index b2c86d35d19..5083fa2487f 100644 --- a/lisp/gnus/nnmail.el +++ b/lisp/gnus/nnmail.el @@ -488,7 +488,8 @@ Example: (to . "to\\|cc\\|apparently-to\\|resent-to\\|resent-cc") (from . "from\\|sender\\|resent-from") (nato . "to\\|cc\\|resent-to\\|resent-cc") - (naany . "from\\|to\\|cc\\|sender\\|resent-from\\|resent-to\\|resent-cc")) + (naany . "from\\|to\\|cc\\|sender\\|resent-from\\|resent-to\\|resent-cc") + (list . "list-id\\|list-post\\|x-mailing-list\||x-beenthere\\|x-loop")) "Alist of abbreviations allowed in `nnmail-split-fancy'." :group 'nnmail-split :type '(repeat (cons :format "%v" symbol regexp))) -- 2.39.5