diff --git a/labeler.py b/labeler.py new file mode 100644 index 0000000..c93d967 --- /dev/null +++ b/labeler.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import logging +from logging.handlers import SysLogHandler +from logging.handlers import RotatingFileHandler +import sys +import pprint +import re +import os +import io +import email +from email.message import EmailMessage +from email.parser import HeaderParser +from subprocess import Popen, PIPE + +messagecontent="".join(sys.stdin.readlines()) +log = logging.getLogger() +log.addHandler(SysLogHandler()) +handler = RotatingFileHandler('/var/spool/filter/labeler.log', maxBytes=1000000, backupCount=5) +formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s') +handler.setFormatter(formatter) +log.addHandler(handler) +# handler = logging.StreamHandler() +# formatter = logging.Formatter( +# '%(asctime)s %(name)-12s %(levelname)-8s %(message)s') +# handler.setFormatter(formatter) +# log.addHandler(handler) +log.setLevel(logging.DEBUG) +log.info('Writing {} bytes of message in /var/spool/filter/last_message.eml...'.format(len(messagecontent))) +if not os.path.exists('/var/spool/filter'): + log.error('Path /var/spool/filter not found.') +else: + with io.open('/var/spool/filter/last_message.eml', 'w') as fp: + try: + fp.write(messagecontent) + except UnicodeEncodeError as e: + log.error('There was an Unicode encode error writting file. {}'.format(e)) + + parser = HeaderParser() + log.debug('Obtaining headers from message...') + msg = email.message_from_string(messagecontent) + headers = parser.parsestr(messagecontent) + + log.debug('Headers: {}'.format(", ".join(headers.keys()))) + log.debug('From: {}'.format(headers.get('From',''))) + log.debug('To: {}'.format(headers.get('To',''))) + log.debug('Subject: {}'.format(headers.get('Subject',''))) + if 'Message-ID' not in headers.keys(): + if 'Message-Id' not in headers.keys(): + log.warning('Malformed header (no message-id).') + else: + log.debug('Processing message with ID: {}'.format(headers['Message-Id'])) + else: + log.debug('Processing message with ID: {}'.format(headers['Message-ID'])) + with open('/etc/postfix/filter_rules.conf','r') as fp: + strrules = fp.read() + + log.debug('Reading general filter rules...') + rules = list() + for rule in strrules.split('\n'): + if rule != "": + lrule = rule.split(':') + field = lrule[0] + match = lrule[1] + folder = lrule[2] + priority = lrule[4] + rules.append(lrule) + # log.debug('Checking rule: {}'.format(rule)) + if field in headers.keys(): + m = re.search(match, headers[field]) + if m is None: + # log.debug('Header "{}" with value "{}" does NOT match "{}"'.format(lrule[0], headers[lrule[0]], lrule[1])) + a = 1 + else: + msg['X-AD-Label'] = "{}:{}".format(folder, priority) + log.info('Added label "{}" due to rule "{}"'.format(folder, rule)) + # else: + # log.debug('Message does NOT have a header called "{}".'.format(lrule[0])) + messagecontent=msg.as_string() + if not os.path.exists('/var/spool/filter'): + log.error('Path /var/spool/filter not found.') + else: + log.info('Writing {} bytes of message in /var/spool/filter/last_message_altered.eml...'.format(len(messagecontent))) + with open('/var/spool/filter/last_message_altered.eml', 'w', encoding='utf8') as fp: + fp.write(messagecontent) + +args = list() +args = ["/usr/sbin/sendmail"] + sys.argv +args.pop(1) +log.debug('Running sendmail with command line: {}'.format(' '.join(args))) +if not os.path.exists("/usr/sbin/sendmail"): + log.error('Not found sendmail in "/usr/sbin/sendmail"') +else: + p = Popen(args, stdin=PIPE) + p.communicate(bytearray(messagecontent, 'utf-8')) \ No newline at end of file