Deleting members

The mailman delmembers command allows a site administrator to delete members from a mailing list.

>>> from mailman.testing.documentation import cli
>>> command = cli('mailman.commands.cli_delmembers.delmembers')

Usage

Here is the complete usage for the command.

>>> command('mailman delmembers --help')
Usage: delmembers [OPTIONS]

  Delete members from a mailing list.

Options:
  -l, --list LISTSPEC             The list to operate on.  Required unless
                                  --fromall is specified.

  -f, --file FILENAME             Delete list members whose addresses are in
                                  FILENAME in addition to those specified with
                                  -m/--member if any.  FILENAME can be '-' to
                                  indicate standard input.  Blank lines and
                                  lines that start with a '#' are ignored.

  -m, --member ADDRESS            Delete the list member whose address is
                                  ADDRESS in addition to those specified with
                                  -f/--file if any.  This option may be repeated
                                  for multiple addresses.

  -a, --all                       Delete all the members of the list.  If
                                  specified, none of -f/--file, -m/--member or
                                  --fromall may be specified.

  --fromall                       Delete the member(s) specified by -m/--member
                                  and/or -f/--file from all lists in the
                                  installation.  This may not be specified
                                  together with -a/--all or -l/--list.

  -g, --goodbye-msg / -G, --no-goodbye-msg
                                  Override the list's setting for
                                  send_goodbye_message to deleted members.

  -n, --admin-notify / -N, --no-admin-notify
                                  Override the list's setting for
                                  admin_notify_mchanges.

  --help                          Show this message and exit.

Examples

You can delete members from a mailing list from the command line. To do so, you need a file containing email addresses and optional display names that can be parsed by email.utils.parseaddr(). All mail addresses in the file will be deleted from the mailing list. You can also specify members with command options on the command line.

First we need a list with some members.

>>> from mailman.app.lifecycle import create_list
>>> bee = create_list('bee@example.com')
>>> from mailman.testing.helpers import subscribe
>>> subscribe(bee, 'Anne')
<Member: Anne Person <aperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Bart')
<Member: Bart Person <bperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Cate')
<Member: Cate Person <cperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Doug')
<Member: Doug Person <dperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Elly')
<Member: Elly Person <eperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Fred')
<Member: Fred Person <fperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Greg')
<Member: Greg Person <gperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Irma')
<Member: Irma Person <iperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Jeff')
<Member: Jeff Person <jperson@example.com> on bee@example.com
         as MemberRole.member>

Now we can delete some members.

>>> from tempfile import NamedTemporaryFile
>>> filename = cleanups.enter_context(NamedTemporaryFile()).name
>>> with open(filename, 'w', encoding='utf-8') as fp:
...     print("""\
... aperson@example.com
... cperson@example.com (Cate Person)
... """, file=fp)

>>> command('mailman delmembers -f ' + filename + ' -l  bee.example.com')

>>> from operator import attrgetter
>>> from mailman.testing.documentation import dump_list
>>> dump_list(bee.members.addresses, key=attrgetter('email'))
Bart Person <bperson@example.com>
Doug Person <dperson@example.com>
Elly Person <eperson@example.com>
Fred Person <fperson@example.com>
Greg Person <gperson@example.com>
Irma Person <iperson@example.com>
Jeff Person <jperson@example.com>

You can also specify - as the filename, in which case the addresses are taken from standard input.

>>> stdin = """\
... dperson@example.com
... Elly Person <eperson@example.com>
... """
>>> command('mailman delmembers -f - -l bee.example.com', input=stdin)

>>> from mailman.testing.documentation import dump_list
>>> dump_list(bee.members.addresses, key=attrgetter('email'))
Bart Person <bperson@example.com>
Fred Person <fperson@example.com>
Greg Person <gperson@example.com>
Irma Person <iperson@example.com>
Jeff Person <jperson@example.com>

Blank lines and lines that begin with ‘#’ are ignored.

>>> with open(filename, 'w', encoding='utf-8') as fp:
...     print("""\
... # cperson@example.com
...
... bperson@example.com
... """, file=fp)

>>> command('mailman delmembers -f ' + filename + ' -l bee.example.com')

>>> dump_list(bee.members.addresses, key=attrgetter('email'))
Fred Person <fperson@example.com>
Greg Person <gperson@example.com>
Irma Person <iperson@example.com>
Jeff Person <jperson@example.com>

Addresses which are not subscribed are ignored, although a warning is printed.

>>> with open(filename, 'w', encoding='utf-8') as fp:
...     print("""\
... kperson@example.com
... iperson@example.com
... """, file=fp)

>>> command('mailman delmembers -f ' + filename + ' -l bee.example.com')
Member not subscribed (skipping): kperson@example.com

>>> dump_list(bee.members.addresses, key=attrgetter('email'))
Fred Person <fperson@example.com>
Greg Person <gperson@example.com>
Jeff Person <jperson@example.com>

Addresses to delete can be specified on the command line.

>>> command('mailman delmembers -m gperson@example.com -l bee.example.com')

>>> dump_list(bee.members.addresses, key=attrgetter('email'))
Fred Person <fperson@example.com>
Jeff Person <jperson@example.com>

All members can be deleted as well.

>>> command('mailman delmembers --all -l bee.example.com')

>>> dump_list(bee.members.addresses, key=attrgetter('email'))
*Empty*

You can also delete members from all lists in the installation. Lets create another list and populate our lists.

>>> ant = create_list('ant@example.com')
>>> subscribe(ant, 'Anne')
<Member: Anne Person <aperson@example.com> on ant@example.com
         as MemberRole.member>
>>> subscribe(ant, 'Bart')
<Member: Bart Person <bperson@example.com> on ant@example.com
         as MemberRole.member>
>>> subscribe(ant, 'Cate')
<Member: Cate Person <cperson@example.com> on ant@example.com
         as MemberRole.member>
>>> subscribe(ant, 'Doug')
<Member: Doug Person <dperson@example.com> on ant@example.com
         as MemberRole.member>
>>> subscribe(ant, 'Elly')
<Member: Elly Person <eperson@example.com> on ant@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Cate')
<Member: Cate Person <cperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Doug')
<Member: Doug Person <dperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Elly')
<Member: Elly Person <eperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Fred')
<Member: Fred Person <fperson@example.com> on bee@example.com
         as MemberRole.member>
>>> subscribe(bee, 'Greg')
<Member: Greg Person <gperson@example.com> on bee@example.com
         as MemberRole.member>

Now lets remove Bart, Cate and Doug from all lists. Note that Bart is not a member of bee, but that’s OK, and we don’t get a message about that if we’re doing all lists. Also, we can build the deletion list from a file and the command line combined.

>>> with open(filename, 'w', encoding='utf-8') as fp:
...     print("""\
... Bart <bperson@example.com>
... cperson@example.com (Cate Person)
... """, file=fp)
>>> command('mailman delmembers -f ' + filename + ' -m dperson@example.com '
... '--fromall')

>>> dump_list(ant.members.addresses, key=attrgetter('email'))
Anne Person <aperson@example.com>
Elly Person <eperson@example.com>

>>> dump_list(bee.members.addresses, key=attrgetter('email'))
Elly Person <eperson@example.com>
Fred Person <fperson@example.com>
Greg Person <gperson@example.com>