#!/usr/local/bin/python import os import re import sys import yaml import pushover import email.header import email.parser try: # Use argv[1] as path to config file if specified cfg = sys.argv[1] except IndexError: # Fall back to push.cfg in the same direcetory cfg = os.path.dirname(os.path.realpath(__file__)) + '/push.cfg' with open(cfg, 'r') as fh: maps = yaml.load(fh) try: sender_map = maps['senders'] except KeyError: print >>sys.stderr, "Found no senders." sys.exit(1) try: recipient_map = maps['recipients'] except KeyError: print >>sys.stderr, "Found no recipients." sys.exit(1) try: recipient = os.environ['RECIPIENT'] except KeyError: print >>sys.stderr, "Recipient missing." sys.exit(1) try: sender = os.environ['SENDER'] except KeyError: print >>sys.stderr, "Sender missing." sys.exit(1) # Select api key from map based on sender for s in sender_map: try: if re.match(s['re'], sender): try: api_token = s['key'] except KeyError: print >>sys.stderr, "Found no key for sender." sys.exit(1) else: break except KeyError: next else: print >>sys.stderr, "Found no matching sender." sys.exit(1) # Select user key(s) from map based on sender for r in recipient_map: try: if re.match(r['re'], recipient): try: user_tokens = r['keys'] except KeyError: print >>sys.stderr, "Found no key(s) for recipient." sys.exit(1) else: break except KeyError: next else: print >>sys.stderr, "Found no matching receiver." sys.exit(1) # Read an email from stdin parser = email.parser.Parser() mail = parser.parse(sys.stdin) # Try to get the subject from the email and recode to utf-8 if possible title, encoding = email.header.decode_header(mail.get('subject'))[0] try: title = title.decode(encoding).encode('utf-8') except (NameError, TypeError): pass # Lets at least try to handle mime multipart if mail.is_multipart(): # Try to find something plain text for current in mail.walk(): if current.get_content_type() == 'text/plain': payload = current.get_payload(decode=True) encoding = current.get_charsets()[0] break else: # A realy stupid fallback payload = mail.get_payload(0) encoding = mail.get_charsets()[0] else: # Hurray no multipart payload = mail.get_payload(decode=True) encoding = mail.get_charsets()[0] # Recode payload to utf-8 if possible try: payload = payload.decode(encoding).encode('utf-8') except (NameError, TypeError): pass msg = payload.strip() # Send notification to each user key for user_token in user_tokens: if type(user_token) is dict: k = user_token.keys()[0] device = user_token.get(k, None) user_token = k else: device = None p = pushover.Client(user_token, api_token=api_token) p.send_message(msg, title=title, device=device)