#!/usr/bin/python2 import rfc822 import StringIO import mimetools import multifile import sys import string import re import os import smtplib NUMBER="402xxxxxxx" PROVIDER="vmobl.com" def recurse(stream, mimetype): msg = mimetools.Message(stream) msgtype = msg.gettype() params = msg.getplist() print "message is", msgtype if msgtype.startswith("multipart/"): file = multifile.MultiFile(stream) file.push(msg.getparam("boundary")) try: while file.next(): result = recurse(file, mimetype) if result is not None: return result finally: file.pop() elif msgtype == mimetype: data = StringIO.StringIO() mimetools.decode(stream, data, msg.getencoding()) return data def extract_mime_part_matching(stream, mimetype): """Return the first element in a multipart MIME message on stream matching mimetype.""" data = recurse(stream, mimetype) if data is None: msg = mimetools.Message(stream) mimetools.decode(stream, data, msg.getencoding()) return data.getvalue() def send_message(number, sender, message): message = string.capwords(message) message = filter(lambda x: x not in " \r\n\t", message) message = ("%s:%s" % (sender.split("@")[0], message))[:160] if "-p" in sys.argv: print number, sender, message return myaddr = "%s@%s" % (NUMBER, PROVIDER) msg = "From: %s\r\nTo: %s\r\n\r\n%s" % (sender, myaddr, message) s = smtplib.SMTP("localhost") s.sendmail(sender, myaddr, msg) s.quit() def parse_message(f = sys.stdin): s = StringIO.StringIO() s.write(sys.stdin.read()) s.seek(0) message = rfc822.Message(s, 0) sender = message.getaddr("From") subject = message.getheader("Subject") or "" sender_name = sender[1] or "nobody@all" # string.split(sender[1], "@")[0] s.seek(0) body = extract_mime_part_matching(s, "text/plain") body = string.split(body, "\n") # filter all empty (all-ws lines) # filter all quoted lines body = map(lambda x: string.join(string.split(x)), body) # Remove blank lines body = filter(lambda x: not re.match(r"^\s*$", x), body) # Remove attribution line ("On blah blah, dude wrote:") if len(body) > 1 and body[0].endswith(":") and body[1].startswith(">"): del body[0] # Remove blank. I'm not sure what ^### is for. body = filter(lambda x: not re.match("^$|^>|^###", x), body) # No body -- send subject if len(body) == 0: send_message(NUMBER, sender_name, subject) sys.exit(0) body = string.join(body, " ") # short body -- send subject + body if len(body) + len(subject) < 200: body = subject+"/"+body send_message(NUMBER, sender_name, body) if __name__ == '__main__': parse_message()