[Top][All Lists]

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

bug#25346: [PATCH] Gnus Group Mail Spliting on mailing-list headers

From: Daniel Dehennin
Subject: bug#25346: [PATCH] Gnus Group Mail Spliting on mailing-list headers
Date: Tue, 03 Jan 2017 18:59:11 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux)

Package: emacs
Severity: wishlist
Tags: patch


This patch implement Group Mail Spliting on mailing-list headers, I'm
using it since a long time now.

This avoid the burden of cross-mailing-list posting when a mail is
sent to 4 mailing-lists and finish duplicated 4 times in each
mailing-list group.

The trick is to to mangle the split-regexp to conform with RFC2919 list

The following `gnus-parameters`:

#+begin_src emacs-lisp
     (to-list . "address@hidden")
     (match-list . t)
     (subscribed . t))

Produce the following fancy split:

#+begin_src emacs-lisp
    (list "\\(address@hidden)" "gnu.emacs.gnus.ding")

From 20bc756adcb8864fa5ec43d22b19db3ec2efaafc Mon Sep 17 00:00:00 2001
From: Daniel Dehennin <address@hidden>
Date: Tue, 3 Jan 2017 18:44:18 +0100
Subject: [PATCH] Gnus Group Mail Spliting on mailing-list headers

This avoid the burden of cross-mailing-list posting when a mail is
sent to 4 mailing-lists and finish duplicated 4 times in each
mailing-list group.

* lisp/nnmail.el: Add new `list' split abbreviation matching common
  mailing-list headers.

* 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 address@hidden or `.` as domain
  separator to comply with RFC2919 IDs too.

* texi/gnus.texi: Document the new `list' split abbreviation and
  `match-list' group parameter.
 doc/misc/gnus.texi      | 18 ++++++++++++++++++
 lisp/gnus/gnus-mlspl.el | 25 +++++++++++++++++++------
 lisp/gnus/nnmail.el     |  3 ++-
 3 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index 05159d4b2f..dba51f1dda 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -3108,6 +3108,21 @@ interest in relation to the sieve parameter.
 The Sieve language is described in RFC 3028.  @xref{Top, Emacs Sieve,
 Top, sieve, Emacs Sieve}.
address@hidden match-list
address@hidden 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},
address@hidden, @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
 @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
@@ -15469,6 +15484,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
address@hidden list
+Matches the @samp{List-ID}, @samp{List-Post}, @samp{X-Mailing-List},
address@hidden 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/lisp/gnus/gnus-mlspl.el b/lisp/gnus/gnus-mlspl.el
index c42c34adce..378a06100e 100644
--- a/lisp/gnus/gnus-mlspl.el
+++ b/lisp/gnus/gnus-mlspl.el
@@ -184,7 +184,8 @@ Calling (gnus-group-split-fancy nil nil \"mail.others\") 
                    (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
@@ -204,16 +205,28 @@ Calling (gnus-group-split-fancy nil nil \"mail.others\") 
                  ;; Now create the new SPLIT
-                 (push (append
-                        (list 'any split-regexp)
+                 (let ((split-regexp-with-list-ids
+                        (replace-regexp-in-string "@" "address@hidden" 
split-regexp t t))
+                       (exclude
                         ;; Generate RESTRICTs for SPLIT-EXCLUDEs.
                         (if (listp split-exclude)
                             (apply #'append
                                    (mapcar (lambda (arg) (list '- arg))
-                          (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 3f2e08171e..96be94922c 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)))

Daniel Dehennin
Récupérer ma clef GPG: gpg --recv-keys 0xCC1E9E5B7A6FE2DF
Fingerprint: 3E69 014E 5C23 50E8 9ED6  2AAD CC1E 9E5B 7A6F E2DF

Attachment: signature.asc
Description: PGP signature

reply via email to

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