Messages

Mailman has its own Message classes, derived from the standard email.message.Message class, but providing additional useful methods.

User notifications

When Mailman needs to send a message to a user, it creates a UserNotification instance, and then calls the .send() method on this object. This method requires a mailing list instance.

>>> mlist = create_list('test@example.com')

The UserNotification constructor takes the recipient address, the sender address, an optional subject, optional body text, and optional language.

>>> from mailman.email.message import UserNotification
>>> msg = UserNotification(
...     'aperson@example.com',
...     'test@example.com',
...     'Something you need to know',
...     'I needed to tell you this.')
>>> msg.send(mlist)

The message will end up in the virgin queue.

>>> from mailman.testing.helpers import get_queue_messages
>>> messages = get_queue_messages('virgin')
>>> len(messages)
1
>>> print(messages[0].msg.as_string())
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Subject: Something you need to know
From: test@example.com
To: aperson@example.com
Message-ID: ...
Date: ...
Precedence: bulk

I needed to tell you this.

The message above got a Precedence: bulk header added by default. If the message we’re sending already has a Precedence: header, it shouldn’t be changed.

>>> del msg['precedence']
>>> msg['Precedence'] = 'list'
>>> msg.send(mlist)

Again, the message will end up in the virgin queue but with the original Precedence: header.

>>> messages = get_queue_messages('virgin')
>>> len(messages)
1
>>> print(messages[0].msg['precedence'])
list

Sometimes we want to send the message without a Precedence: header such as when we send a probe message.

>>> del msg['precedence']
>>> msg.send(mlist, add_precedence=False)

Again, the message will end up in the virgin queue but without the Precedence: header.

>>> messages = get_queue_messages('virgin')
>>> len(messages)
1
>>> print(messages[0].msg['precedence'])
None

However, if the message already has a Precedence: header, setting the precedence=False argument will have no effect.

>>> msg['Precedence'] = 'junk'
>>> msg.send(mlist, add_precedence=False)
>>> messages = get_queue_messages('virgin')
>>> len(messages)
1
>>> print(messages[0].msg['precedence'])
junk