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.