You can inject a message directly into a queue directory via the command line.
>>> from mailman.commands.cli_inject import Inject
>>> command = Inject()
>>> class FakeArgs:
... queue = None
... show = False
... filename = None
... listname = None
>>> args = FakeArgs()
>>> class FakeParser:
... def error(self, message):
... print message
>>> command.parser = FakeParser()
It’s easy to find out which queues are available.
>>> args.show = True
>>> command.process(args)
Available queues:
archive
bad
bounces
command
digest
in
lmtp
maildir
news
out
pipeline
rest
retry
shunt
virgin
>>> args.show = False
Usually, the text of the message to inject is in a file.
>>> import os, tempfile
>>> fd, filename = tempfile.mkstemp()
>>> with os.fdopen(fd, 'w') as fp:
... print >> fp, """\
... From: aperson@example.com
... To: test@example.com
... Subject: testing
...
... This is a test message.
... """
However, the mailing list name is always required.
>>> args.filename = filename
>>> command.process(args)
List name is required
Let’s provide a list name and try again.
>>> mlist = create_list('test@example.com')
>>> transaction.commit()
>>> in_queue = config.switchboards['in']
>>> len(in_queue.files)
0
>>> args.listname = ['test@example.com']
>>> command.process(args)
By default, the incoming queue is used.
>>> len(in_queue.files)
1
>>> from mailman.testing.helpers import get_queue_messages
>>> item = get_queue_messages('in')[0]
>>> print item.msg.as_string()
From: aperson@example.com
To: test@example.com
Subject: testing
Message-ID: ...
Date: ...
<BLANKLINE>
This is a test message.
<BLANKLINE>
<BLANKLINE>
>>> dump_msgdata(item.msgdata)
_parsemsg : False
listname : test@example.com
original_size: 90
version : 3
But a different queue can be specified on the command line.
>>> args.queue = 'virgin'
>>> command.process(args)
>>> len(in_queue.files)
0
>>> virgin_queue = config.switchboards['virgin']
>>> len(virgin_queue.files)
1
>>> item = get_queue_messages('virgin')[0]
>>> print item.msg.as_string()
From: aperson@example.com
To: test@example.com
Subject: testing
Message-ID: ...
Date: ...
<BLANKLINE>
This is a test message.
<BLANKLINE>
<BLANKLINE>
>>> dump_msgdata(item.msgdata)
_parsemsg : False
listname : test@example.com
original_size: 90
version : 3
# Clean up the tempfile.
>>> os.remove(filename)
The message text can also be provided on standard input.
>>> from StringIO import StringIO
# Remember: we've got unicode literals turned on.
>>> standard_in = StringIO(str("""\
... From: bperson@example.com
... To: test@example.com
... Subject: another test
...
... This is another test message.
... """))
>>> import sys
>>> sys.stdin = standard_in
>>> args.filename = '-'
>>> args.queue = None
>>> command.process(args)
>>> len(in_queue.files)
1
>>> item = get_queue_messages('in')[0]
>>> print item.msg.as_string()
From: bperson@example.com
To: test@example.com
Subject: another test
Message-ID: ...
Date: ...
<BLANKLINE>
This is another test message.
<BLANKLINE>
<BLANKLINE>
>>> dump_msgdata(item.msgdata)
_parsemsg : False
listname : test@example.com
original_size: 100
version : 3
# Clean up.
>>> sys.stdin = sys.__stdin__
>>> args.filename = filename
It is an error to specify a queue that doesn’t exist.
>>> args.queue = 'xxbogusxx'
>>> command.process(args)
No such queue: xxbogusxx
It is also an error to specify a mailing list that doesn’t exist.
>>> args.queue = None
>>> args.listname = ['bogus']
>>> command.process(args)
No such list: bogus