summaryrefslogtreecommitdiff
path: root/src/mailman/commands/docs/inject.rst
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/commands/docs/inject.rst')
-rw-r--r--src/mailman/commands/docs/inject.rst226
1 files changed, 226 insertions, 0 deletions
diff --git a/src/mailman/commands/docs/inject.rst b/src/mailman/commands/docs/inject.rst
new file mode 100644
index 000000000..1c0843ff3
--- /dev/null
+++ b/src/mailman/commands/docs/inject.rst
@@ -0,0 +1,226 @@
+==============================
+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
+ ... keywords = []
+ >>> 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
+
+
+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
+
+
+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.
+::
+
+ >>> args = FakeArgs()
+ >>> args.filename = filename
+ >>> args.listname = ['test@example.com']
+ >>> args.keywords = ['foo=one', 'bar=two']
+ >>> command.process(args)
+
+ >>> items = get_queue_messages('in')
+ >>> dump_msgdata(items[0].msgdata)
+ _parsemsg : False
+ bar : two
+ foo : one
+ listname : test@example.com
+ original_size: 90
+ version : 3
+
+
+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
+
+
+..
+ # Clean up the tempfile.
+ >>> os.remove(filename)