gnus: Group Mail Splitting
6.4.7 Group Mail Splitting
--------------------------
If you subscribe to dozens of mailing lists but you don’t want to
maintain mail splitting rules manually, group mail splitting is for you.
You just have to set ‘to-list’ and/or ‘to-address’ in group parameters
or group customization and set ‘nnmail-split-methods’ to
‘gnus-group-split’. This splitting function will scan all groups for
those parameters and split mail accordingly, i.e., messages posted from
or to the addresses specified in the parameters ‘to-list’ or
‘to-address’ of a mail group will be stored in that group.
Sometimes, mailing lists have multiple addresses, and you may want
mail splitting to recognize them all: just set the ‘extra-aliases’ group
parameter to the list of additional addresses and it’s done. If you’d
rather use a regular expression, set ‘split-regexp’.
All these parameters in a group will be used to create an
‘nnmail-split-fancy’ split, in which the FIELD is ‘any’, the VALUE is a
single regular expression that matches ‘to-list’, ‘to-address’, all of
‘extra-aliases’ and all matches of ‘split-regexp’, and the SPLIT is the
name of the group. RESTRICTs are also supported: just set the
‘split-exclude’ parameter to a list of regular expressions.
If you can’t get the right split to be generated using all these
parameters, or you just need something fancier, you can set the
parameter ‘split-spec’ to an ‘nnmail-split-fancy’ split. In this case,
all other aforementioned parameters will be ignored by
‘gnus-group-split’. In particular, ‘split-spec’ may be set to ‘nil’, in
which case the group will be ignored by ‘gnus-group-split’.
‘gnus-group-split’ will do cross-posting on all groups that match, by
defining a single ‘&’ fancy split containing one split for each group.
If a message doesn’t match any split, it will be stored in the group
named in ‘gnus-group-split-default-catch-all-group’, unless some group
has ‘split-spec’ set to ‘catch-all’, in which case that group is used as
the catch-all group. Even though this variable is often used just to
name a group, it may also be set to an arbitrarily complex fancy split
(after all, a group name is a fancy split), and this may be useful to
split mail that doesn’t go to any mailing list to personal mail folders.
Note that this fancy split is added as the last element of a ‘|’ split
list that also contains a ‘&’ split with the rules extracted from group
parameters.
It’s time for an example. Assume the following group parameters have
been defined:
nnml:mail.bar:
((to-address . "bar@femail.com")
(split-regexp . ".*@femail\\.com"))
nnml:mail.foo:
((to-list . "foo@nowhere.gov")
(extra-aliases "foo@localhost" "foo-redist@home")
(split-exclude "bugs-foo" "rambling-foo")
(admin-address . "foo-request@nowhere.gov"))
nnml:mail.others:
((split-spec . catch-all))
Setting ‘nnmail-split-methods’ to ‘gnus-group-split’ will behave as
if ‘nnmail-split-fancy’ had been selected and variable
‘nnmail-split-fancy’ had been set as follows:
(| (& (any "\\(bar@femail\\.com\\|.*@femail\\.com\\)" "mail.bar")
(any "\\(foo@nowhere\\.gov\\|foo@localhost\\|foo-redist@home\\)"
- "bugs-foo" - "rambling-foo" "mail.foo"))
"mail.others")
If you’d rather not use group splitting for all your mail groups, you
may use it for only some of them, by using ‘nnmail-split-fancy’ splits
like this:
(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL)
GROUPS may be a regular expression or a list of group names whose
parameters will be scanned to generate the output split. NO-CROSSPOST
can be used to disable cross-posting; in this case, a single ‘|’ split
will be output. CATCH-ALL is the fall back fancy split, used like
‘gnus-group-split-default-catch-all-group’. If CATCH-ALL is ‘nil’, or
if ‘split-regexp’ matches the empty string in any selected group, no
catch-all split will be issued. Otherwise, if some group has
‘split-spec’ set to ‘catch-all’, this group will override the value of
the CATCH-ALL argument.
Unfortunately, scanning all groups and their parameters can be quite
slow, especially considering that it has to be done for every message.
But don’t despair! The function ‘gnus-group-split-setup’ can be used to
enable ‘gnus-group-split’ in a much more efficient way. It sets
‘nnmail-split-methods’ to ‘nnmail-split-fancy’ and sets
‘nnmail-split-fancy’ to the split produced by ‘gnus-group-split-fancy’.
Thus, the group parameters are only scanned once, no matter how many
messages are split.
However, if you change group parameters, you’d have to update
‘nnmail-split-fancy’ manually. You can do it by running
‘gnus-group-split-update’. If you’d rather have it updated
automatically, just tell ‘gnus-group-split-setup’ to do it for you. For
example, add to your ‘~/.gnus.el’:
(gnus-group-split-setup AUTO-UPDATE CATCH-ALL)
If AUTO-UPDATE is non-‘nil’, ‘gnus-group-split-update’ will be added
to ‘nnmail-pre-get-new-mail-hook’, so you won’t ever have to worry about
updating ‘nnmail-split-fancy’ again. If you don’t omit CATCH-ALL (it’s
optional, equivalent to ‘nil’),
‘gnus-group-split-default-catch-all-group’ will be set to its value.
Because you may want to change ‘nnmail-split-fancy’ after it is set
by ‘gnus-group-split-update’, this function will run
‘gnus-group-split-updated-hook’ just before finishing.