Next: Incorporating Old Mail, Previous: Fancy Mail Splitting, Up: Getting Mail [Contents][Index]

#### 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.

Next: Incorporating Old Mail, Previous: Fancy Mail Splitting, Up: Getting Mail [Contents][Index]