Mailing list configuration¶
Mailing lists can be configured via the REST API.
>>> mlist = create_list('ant@example.com')
>>> transaction.commit()
Reading a configuration¶
All readable attributes for a list are available on a sub-resource.
>>> dump_json('http://localhost:9001/3.0/lists/ant@example.com/config')
acceptable_aliases: []
admin_immed_notify: True
admin_notify_mchanges: False
administrivia: True
advertised: True
allow_list_posts: True
anonymous_list: False
archive_policy: public
autorespond_owner: none
autorespond_postings: none
autorespond_requests: none
autoresponse_grace_period: 90d
autoresponse_owner_text:
autoresponse_postings_text:
autoresponse_request_text:
bounces_address: ant-bounces@example.com
collapse_alternatives: True
convert_html_to_plaintext: False
created_at: 20...T...
default_member_action: defer
default_nonmember_action: hold
description:
digest_last_sent_at: None
digest_size_threshold: 30.0
display_name: Ant
filter_content: False
first_strip_reply_to: False
fqdn_listname: ant@example.com
http_etag: "..."
include_rfc2369_headers: True
join_address: ant-join@example.com
last_post_at: None
leave_address: ant-leave@example.com
list_name: ant
mail_host: example.com
next_digest_number: 1
no_reply_address: noreply@example.com
owner_address: ant-owner@example.com
post_id: 1
posting_address: ant@example.com
posting_pipeline: default-posting-pipeline
reply_goes_to_list: no_munging
reply_to_address:
request_address: ant-request@example.com
scheme: http
send_welcome_message: True
subject_prefix: [Ant]
subscription_policy: confirm
volume: 1
web_host: lists.example.com
welcome_message_uri: mailman:///welcome.txt
Changing the full configuration¶
Not all of the readable attributes can be set through the web interface. The
ones that can, can either be set via PUT
or PATCH
. PUT
changes
all the writable attributes in one request.
When using PUT
, all writable attributes must be included.
>>> dump_json('http://localhost:9001/3.0/lists/'
... 'ant@example.com/config',
... dict(
... acceptable_aliases=['one@example.com', 'two@example.com'],
... admin_immed_notify=False,
... admin_notify_mchanges=True,
... administrivia=False,
... advertised=False,
... anonymous_list=True,
... archive_policy='never',
... autorespond_owner='respond_and_discard',
... autorespond_postings='respond_and_continue',
... autorespond_requests='respond_and_discard',
... autoresponse_grace_period='45d',
... autoresponse_owner_text='the owner',
... autoresponse_postings_text='the mailing list',
... autoresponse_request_text='the robot',
... display_name='Fnords',
... description='This is my mailing list',
... include_rfc2369_headers=False,
... allow_list_posts=False,
... digest_size_threshold=10.5,
... posting_pipeline='virgin',
... filter_content=True,
... first_strip_reply_to=True,
... convert_html_to_plaintext=True,
... collapse_alternatives=False,
... reply_goes_to_list='point_to_list',
... reply_to_address='bee@example.com',
... send_welcome_message=False,
... subject_prefix='[ant]',
... subscription_policy='moderate',
... welcome_message_uri='mailman:///welcome.txt',
... default_member_action='hold',
... default_nonmember_action='discard',
... ),
... 'PUT')
content-length: 0
date: ...
server: WSGIServer/...
status: 204
These values are changed permanently.
>>> dump_json('http://localhost:9001/3.0/lists/'
... 'ant@example.com/config')
acceptable_aliases: ['one@example.com', 'two@example.com']
admin_immed_notify: False
admin_notify_mchanges: True
administrivia: False
advertised: False
allow_list_posts: False
anonymous_list: True
archive_policy: never
autorespond_owner: respond_and_discard
autorespond_postings: respond_and_continue
autorespond_requests: respond_and_discard
autoresponse_grace_period: 45d
autoresponse_owner_text: the owner
autoresponse_postings_text: the mailing list
autoresponse_request_text: the robot
...
collapse_alternatives: False
convert_html_to_plaintext: True
...
default_member_action: hold
default_nonmember_action: discard
description: This is my mailing list
...
digest_size_threshold: 10.5
display_name: Fnords
filter_content: True
first_strip_reply_to: True
...
include_rfc2369_headers: False
...
posting_pipeline: virgin
reply_goes_to_list: point_to_list
reply_to_address: bee@example.com
...
send_welcome_message: False
subject_prefix: [ant]
subscription_policy: moderate
...
welcome_message_uri: mailman:///welcome.txt
Changing a partial configuration¶
Using PATCH
, you can change just one attribute.
>>> dump_json('http://localhost:9001/3.0/lists/'
... 'ant@example.com/config',
... dict(display_name='My List'),
... 'PATCH')
content-length: 0
date: ...
server: ...
status: 204
These values are changed permanently.
>>> print(mlist.display_name)
My List
Sub-resources¶
Mailing list configuration variables are actually available as sub-resources on the mailing list. Their values can be retrieved and set through the sub-resource.
Simple resources¶
You can view the current value of the sub-resource.
>>> dump_json('http://localhost:9001/3.0/lists/ant.example.com'
... '/config/display_name')
display_name: My List
http_etag: ...
The resource can be changed by PUTting to it. Note that the value still requires a dictionary, and that dictionary must have a single key matching the name of the resource.
>>> dump_json('http://localhost:9001/3.0/lists/ant.example.com'
... '/config/display_name',
... dict(display_name='Your List'),
... 'PUT')
content-length: 0
date: ...
server: ...
status: 204
>>> dump_json('http://localhost:9001/3.0/lists/ant.example.com'
... '/config/display_name')
display_name: Your List
http_etag: ...
PATCH works the same way, with the same effect, so you can choose to use either method.
>>> dump_json('http://localhost:9001/3.0/lists/ant.example.com'
... '/config/display_name',
... dict(display_name='Their List'),
... 'PATCH')
content-length: 0
date: ...
server: ...
status: 204
>>> dump_json('http://localhost:9001/3.0/lists/ant.example.com'
... '/config/display_name')
display_name: Their List
http_etag: ...
Acceptable aliases¶
These are recipient aliases that can be used in the To:
and CC:
headers instead of the posting address. They are often used in forwarded
emails. By default, a mailing list has no acceptable aliases.
>>> from mailman.interfaces.mailinglist import IAcceptableAliasSet
>>> IAcceptableAliasSet(mlist).clear()
>>> transaction.commit()
>>> dump_json('http://localhost:9001/3.0/lists/'
... 'ant@example.com/config/acceptable_aliases')
acceptable_aliases: []
http_etag: "..."
We can add a few by PUT
-ing them on the sub-resource. The keys in the
dictionary are ignored.
>>> dump_json('http://localhost:9001/3.0/lists/'
... 'ant@example.com/config/acceptable_aliases',
... dict(acceptable_aliases=['foo@example.com',
... 'bar@example.net']),
... 'PUT')
content-length: 0
date: ...
server: WSGIServer/...
status: 204
Aliases are returned as a list on the aliases
key.
>>> response = call_http(
... 'http://localhost:9001/3.0/lists/'
... 'ant@example.com/config/acceptable_aliases')
>>> for alias in response['acceptable_aliases']:
... print(alias)
bar@example.net
foo@example.com
The mailing list has its aliases set.
>>> from mailman.interfaces.mailinglist import IAcceptableAliasSet
>>> aliases = IAcceptableAliasSet(mlist)
>>> for alias in sorted(aliases.aliases):
... print(alias)
bar@example.net
foo@example.com