+def parse_arguments():
+ parser = OptionParser(usage='usage: %prog [options] cc_addr template recipients')
+ parser.add_option('-q', '--rt-queue', dest='rt_queue',
+ help='Automatically create a ticket in queue QUEUE',
+ metavar='QUEUE',
+ )
+ parser.add_option('-o', '--rt-owner', dest='rt_owner',
+ help='Set RT owner and AdminCC to USER',
+ metavar='USER',
+ )
+ (options, args) = parser.parse_args()
+ if len(args) != 3:
+ parser.error("incorrect number of arguments")
+ if options.rt_owner and not options.rt_queue:
+ parser.error("--rt-owner requires specifying a queue")
+ return options, args
+
+def msg_filter_factory(opts):
+ if not opts.rt_queue:
+ return lambda rcpt, body: body
+
+ import rtkit.tracker, rtkit.authenticators, rtkit.errors
+ cookie = rtkit.authenticators.CookieAuthenticator
+ resource = rtkit.resource.RTResource.from_rtrc(cookie)
+ parser = email.parser.Parser()
+
+ def filter_rt(rcpt, body, ):
+ msg = parser.parsestr(body)
+ content = {
+ 'content': {
+ 'Requestors': rcpt,
+ 'Queue': opts.rt_queue,
+ 'Subject' : msg['Subject'],
+ 'Text' : '',
+ }
+ }
+ if opts.rt_owner:
+ content['content']['AdminCC'] = opts.rt_owner
+ content['content']['Owner'] = opts.rt_owner
+
+ try:
+ response = resource.post(path='ticket/new', payload=content,)
+ results = dict(response.parsed[0])
+ ticket, ticket_number = results['id'].split('/')
+ assert ticket == 'ticket', 'unexpected value "%s" instead of ticket' % (ticket, )
+ subject = "%s [help.mit.edu #%s]" % (msg['Subject'], ticket_number)
+ del msg['Subject']
+ msg['Subject'] = subject
+ except rtkit.errors.RTResourceError as e:
+ logger.error(e.response.status_int)
+ logger.error(e.response.status)
+ logger.error(e.response.parsed)
+
+ return msg.as_string()
+
+ return filter_rt
+
+def mail_merge(opts, cc_addr, email_file, recipients_file):