Command line message injection

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)

Standard input

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

Errors

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

Table Of Contents

Previous topic

Getting information

Next topic

Command line list display

This Page