Command line message injection
You can inject a message directly into a queue directory via the command line.
>>> from mailman.testing.documentation import cli
>>> command = cli('mailman.commands.cli_inject.inject')
It’s easy to find out which queues are available.
>>> command('mailman inject --show')
Available queues:
archive
bad
bounces
command
digest
in
nntp
out
pipeline
retry
shunt
virgin
Usually, the text of the message to inject is in a file.
>>> from tempfile import NamedTemporaryFile
>>> filename = cleanups.enter_context(NamedTemporaryFile()).name
>>> with open(filename, 'w', encoding='utf-8') as fp:
... print("""\
... From: aperson@example.com
... To: ant@example.com
... Subject: testing
... Message-ID: <aardvark>
...
... This is a test message.
... """, file=fp)
Create a mailing list to inject this message into.
>>> from mailman.app.lifecycle import create_list
>>> mlist = create_list('ant@example.com')
>>> from mailman.config import config
>>> transaction = config.db
>>> transaction.commit()
The mailing list’s incoming queue is empty.
>>> from mailman.testing.helpers import get_queue_messages
>>> get_queue_messages('in')
[]
By default, messages are injected into the incoming queue.
>>> command('mailman inject --filename ' + filename + ' ant@example.com')
>>> items = get_queue_messages('in')
>>> len(items)
1
>>> print(items[0].msg.as_string())
From: aperson@example.com
To: ant@example.com
Subject: testing
Message-ID: ...
Date: ...
This is a test message.
And the message is destined for ant@example.com.
>>> from mailman.testing.documentation import dump_msgdata
>>> dump_msgdata(items[0].msgdata)
_parsemsg : False
listid : ant.example.com
original_size: 252
version : 3
But a different queue can be specified on the command line.
>>> command('mailman inject --queue virgin --filename ' +
... filename + ' ant@example.com')
>>> get_queue_messages('in')
[]
>>> items = get_queue_messages('virgin')
>>> len(items)
1
>>> print(items[0].msg.as_string())
From: aperson@example.com
To: ant@example.com
Subject: testing
Message-ID: ...
Date: ...
This is a test message.
>>> dump_msgdata(items[0].msgdata)
_parsemsg : False
listid : ant.example.com
original_size: 252
version : 3
Standard input
The message text can also be provided on standard input.
>>> stdin = """\
... From: bperson@example.com
... To: ant@example.com
... Subject: another test
... Message-ID: <badger>
...
... This is another test message.
... """
>>> command('mailman inject --filename - ant@example.com', input=stdin)
>>> items = get_queue_messages('in')
>>> len(items)
1
>>> print(items[0].msg.as_string())
From: bperson@example.com
To: ant@example.com
Subject: another test
Message-ID: ...
Date: ...
This is another test message.
>>> dump_msgdata(items[0].msgdata)
_parsemsg : False
listid : ant.example.com
original_size: 260
version : 3
Metadata
Additional metadata keys can be provided on the command line. These key/value pairs get added to the message metadata dictionary when the message is injected.
>>> command('mailman inject --filename ' + filename +
... ' -m foo=one -m bar=two ant@example.com')
>>> items = get_queue_messages('in')
>>> dump_msgdata(items[0].msgdata)
_parsemsg : False
bar : two
foo : one
listid : ant.example.com
original_size: 252
version : 3