labeler/labeler.py

96 lines
3.9 KiB
Python
Raw Normal View History

2019-01-24 22:33:10 +01:00
#!/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'))