==============================
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
