================================= Application level list life cycle ================================= The low-level way to create and delete a mailing list is to use the IListManager interface. This interface simply adds or removes the appropriate database entries to record the list's creation. There is a higher level interface for creating and deleting mailing lists which performs additional tasks such as: * validating the list's posting address (which also serves as the list's fully qualified name); * ensuring that the list's domain is registered; * applying all matching styles to the new list; * creating and assigning list owners; * notifying watchers of list creation; * creating ancillary artifacts (such as the list's on-disk directory) >>> from mailman.app.lifecycle import create_list Posting address validation ========================== If you try to use the higher-level interface to create a mailing list with a bogus posting address, you get an exception. >>> create_list('not a valid address') Traceback (most recent call last): ... InvalidEmailAddress: u'not a valid address' If the posting address is valid, but the domain has not been registered with Mailman yet, you get an exception. >>> create_list('test@example.org') Traceback (most recent call last): ... BadDomainSpecificationError: example.org Creating a list applies its styles ================================== Start by registering a test style. >>> from zope.interface import implements >>> from mailman.interfaces.styles import IStyle >>> class TestStyle(object): ... implements(IStyle) ... name = 'test' ... priority = 10 ... def apply(self, mailing_list): ... # Just does something very simple. ... mailing_list.msg_footer = 'test footer' ... def match(self, mailing_list, styles): ... # Applies to any test list ... if 'test' in mailing_list.fqdn_listname: ... styles.append(self) >>> config.style_manager.register(TestStyle()) Using the higher level interface for creating a list, applies all matching list styles. >>> mlist_1 = create_list('test_1@example.com') >>> print mlist_1.fqdn_listname test_1@example.com >>> print mlist_1.msg_footer test footer Creating a list with owners =========================== You can also specify a list of owner email addresses. If these addresses are not yet known, they will be registered, and new users will be linked to them. However the addresses are not verified. >>> owners = ['aperson@example.com', 'bperson@example.com', ... 'cperson@example.com', 'dperson@example.com'] >>> mlist_2 = create_list('test_2@example.com', owners) >>> print mlist_2.fqdn_listname test_2@example.com >>> print mlist_2.msg_footer test footer >>> sorted(addr.address for addr in mlist_2.owners.addresses) [u'aperson@example.com', u'bperson@example.com', u'cperson@example.com', u'dperson@example.com'] None of the owner addresses are verified. >>> any(addr.verified_on is not None for addr in mlist_2.owners.addresses) False However, all addresses are linked to users. >>> # The owners have no names yet >>> len(list(mlist_2.owners.users)) 4 If you create a mailing list with owner addresses that are already known to the system, they won't be created again. >>> from mailman.interfaces.usermanager import IUserManager >>> from zope.component import getUtility >>> user_manager = getUtility(IUserManager) >>> user_a = user_manager.get_user('aperson@example.com') >>> user_b = user_manager.get_user('bperson@example.com') >>> user_c = user_manager.get_user('cperson@example.com') >>> user_d = user_manager.get_user('dperson@example.com') >>> user_a.real_name = 'Anne Person' >>> user_b.real_name = 'Bart Person' >>> user_c.real_name = 'Caty Person' >>> user_d.real_name = 'Dirk Person' >>> mlist_3 = create_list('test_3@example.com', owners) >>> sorted(user.real_name for user in mlist_3.owners.users) [u'Anne Person', u'Bart Person', u'Caty Person', u'Dirk Person'] Removing a list =============== Removing a mailing list deletes the list, all its subscribers, and any related artifacts. >>> from mailman.app.lifecycle import remove_list >>> remove_list(mlist_2.fqdn_listname, mlist_2, True) >>> from mailman.interfaces.listmanager import IListManager >>> from zope.component import getUtility >>> print getUtility(IListManager).get('test_2@example.com') None We should now be able to completely recreate the mailing list. >>> mlist_2a = create_list('test_2@example.com', owners) >>> sorted(addr.address for addr in mlist_2a.owners.addresses) [u'aperson@example.com', u'bperson@example.com', u'cperson@example.com', u'dperson@example.com']