From c7d4427c4e3c1c9294e06d3bdfef0d40eda1ac01 Mon Sep 17 00:00:00 2001 From: "W. Trevor King" Date: Tue, 14 Jul 2009 17:10:51 -0400 Subject: Added be-handle-mail and some example emails. So far, it parses the emails and executes the specified task. Todo: email the sender back with the output/errors/exit-status/etc. --- interfaces/email/interactive/be-handle-mail | 83 ++++++++++++++++++++++ interfaces/email/interactive/examples/blank | 0 interfaces/email/interactive/examples/comment | 9 +++ .../email/interactive/examples/invalid_command | 9 +++ .../email/interactive/examples/invalid_subject | 9 +++ interfaces/email/interactive/examples/list | 9 +++ .../email/interactive/examples/missing_command | 9 +++ interfaces/email/interactive/examples/new | 9 +++ interfaces/email/interactive/examples/show | 9 +++ 9 files changed, 146 insertions(+) create mode 100755 interfaces/email/interactive/be-handle-mail create mode 100644 interfaces/email/interactive/examples/blank create mode 100644 interfaces/email/interactive/examples/comment create mode 100644 interfaces/email/interactive/examples/invalid_command create mode 100644 interfaces/email/interactive/examples/invalid_subject create mode 100644 interfaces/email/interactive/examples/list create mode 100644 interfaces/email/interactive/examples/missing_command create mode 100644 interfaces/email/interactive/examples/new create mode 100644 interfaces/email/interactive/examples/show diff --git a/interfaces/email/interactive/be-handle-mail b/interfaces/email/interactive/be-handle-mail new file mode 100755 index 0000000..a524389 --- /dev/null +++ b/interfaces/email/interactive/be-handle-mail @@ -0,0 +1,83 @@ +#!/usr/bin/env python +# +# Copyright +"""Provide and email interface to the distributed bugtracker Bugs +Everywhere. Recieves incoming email via procmail and allows users to +select actions with their subject lines. Subject lines follow the +format + [be-bug] command (options) (args) +With the body of the email being used as the final argument for the +commands "new" and "comment", and ignored otherwise. The options and +arguments are split on whitespace, so don't use whitespace inside a +single argument. + +Eventually we'll commit after every message. +""" + +import libbe.cmdutil +import email +import sys + +ALLOWED_COMMANDS = ["new", "comment", "list", "show", "help"] + +class InvalidEmail (ValueError): + def __init__(self, msg, message): + ValueError.__init__(self, message) + self.msg = msg + +class InvalidSubject (InvalidEmail): + pass + +class InvalidCommand (InvalidEmail): + def __init__(self, msg, command): + message = "Invalid command '%s'" % command + ValueError.__init__(self, msg, message) + self.command = command + +def get_body_type(msg): + for part in msg.walk(): + if part.is_multipart(): + continue + return (part.get_payload(decode=1), part.get_content_type()) + +def handle_message(msg_text): + p=email.Parser.Parser() + msg=p.parsestr(msg_text) + + if "subject" not in msg: + raise InvalidSubject(msg, "Email must contain a subject") + author = msg['from'] + args = msg["subject"].split() + if len(args) < 1 or args[0] != "[be-bug]": + raise InvalidSubject(msg, "Subject must start with '[be-bug] '") + elif len(args) < 2: + raise InvalidCommand(msg, "") + command = args[1] + if command not in ALLOWED_COMMANDS: + raise InvalidCommand(msg, command) + if len(args) > 2: + command_args = args[2:] + else: + command_args = [] + if command in ["new", "comment"]: + body,type = get_body_type(msg) + if command == "new": + if "--reporter" not in args and "-r" not in args: + command_args = ["--reporter", author] + command_args + body = body.strip().split("\n", 1)[0] # only take first line + elif command == "comment": + if "--author" not in args and "-a" not in args: + command_args = ["--author", author] + command_args + if "--content-type" not in args and "-c" not in args: + command_args = ["--content-type", type] + command_args + if "--alt-id" not in args: + command_args = ["--alt-id", msg["message-id"]] + command_args + command_args.append(body) + return libbe.cmdutil.execute(command, command_args) + +def main(): + msg_text = sys.stdin.read() + sys.exit(handle_message(msg_text)) + +if __name__ == "__main__": + main() diff --git a/interfaces/email/interactive/examples/blank b/interfaces/email/interactive/examples/blank new file mode 100644 index 0000000..e69de29 diff --git a/interfaces/email/interactive/examples/comment b/interfaces/email/interactive/examples/comment new file mode 100644 index 0000000..1d60748 --- /dev/null +++ b/interfaces/email/interactive/examples/comment @@ -0,0 +1,9 @@ +From jdoe@example.com Fri Apr 18 11:18:58 2008 +Message-ID: +Date: Fri, 18 Apr 2008 12:00:00 +0000 +From: John Doe +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Subject: [be-bug] comment a1d + +We sure do. diff --git a/interfaces/email/interactive/examples/invalid_command b/interfaces/email/interactive/examples/invalid_command new file mode 100644 index 0000000..4d18f09 --- /dev/null +++ b/interfaces/email/interactive/examples/invalid_command @@ -0,0 +1,9 @@ +From jdoe@example.com Fri Apr 18 11:18:58 2008 +Message-ID: +Date: Fri, 18 Apr 2008 12:00:00 +0000 +From: John Doe +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Subject: [be-bug] close + +Dummy content diff --git a/interfaces/email/interactive/examples/invalid_subject b/interfaces/email/interactive/examples/invalid_subject new file mode 100644 index 0000000..e148d0b --- /dev/null +++ b/interfaces/email/interactive/examples/invalid_subject @@ -0,0 +1,9 @@ +From jdoe@example.com Fri Apr 18 11:18:58 2008 +Message-ID: +Date: Fri, 18 Apr 2008 12:00:00 +0000 +From: John Doe +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Subject: Spam! + +Dummy content diff --git a/interfaces/email/interactive/examples/list b/interfaces/email/interactive/examples/list new file mode 100644 index 0000000..333315f --- /dev/null +++ b/interfaces/email/interactive/examples/list @@ -0,0 +1,9 @@ +From jdoe@example.com Fri Apr 18 11:18:58 2008 +Message-ID: +Date: Fri, 18 Apr 2008 12:00:00 +0000 +From: John Doe +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Subject: [be-bug] list --status all + +Dummy content diff --git a/interfaces/email/interactive/examples/missing_command b/interfaces/email/interactive/examples/missing_command new file mode 100644 index 0000000..fefe41b --- /dev/null +++ b/interfaces/email/interactive/examples/missing_command @@ -0,0 +1,9 @@ +From jdoe@example.com Fri Apr 18 11:18:58 2008 +Message-ID: +Date: Fri, 18 Apr 2008 12:00:00 +0000 +From: John Doe +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Subject: [be-bug] abcde + +Dummy content diff --git a/interfaces/email/interactive/examples/new b/interfaces/email/interactive/examples/new new file mode 100644 index 0000000..7ac6dce --- /dev/null +++ b/interfaces/email/interactive/examples/new @@ -0,0 +1,9 @@ +From jdoe@example.com Fri Apr 18 11:18:58 2008 +Message-ID: +Date: Fri, 18 Apr 2008 12:00:00 +0000 +From: John Doe +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Subject: [be-bug] new + +Need tests for the email interface. diff --git a/interfaces/email/interactive/examples/show b/interfaces/email/interactive/examples/show new file mode 100644 index 0000000..3ff56f4 --- /dev/null +++ b/interfaces/email/interactive/examples/show @@ -0,0 +1,9 @@ +From jdoe@example.com Fri Apr 18 11:18:58 2008 +Message-ID: +Date: Fri, 18 Apr 2008 12:00:00 +0000 +From: John Doe +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Subject: [be-bug] show --xml 361 + +Dummy content -- cgit