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>