Filter EMails with python


title: “Filter EMails with python”
date: 2020-07-15T08:53:47
slug: filter-emails-with-python


Listen to Port 587 and call the external filter script /home/filter/filter.py (add user “filter” and put it in his home directory )

/etc/postfix/master.cf
smtp inet n - n - - smtp -v
submission inet n - n - - smtpd
 -o content\_filter=filter:dummy
filter unix - n n - 10 pipe
 flags=Rq user=filter null\_sender=
 argv=/home/filter/filter.py -f ${sender} -- ${recipient}
#smtps inet n - n - - smtpd
#628 inet n - n - - qmqpd
pickup fifo n - n 60 1 pickup

The Filter Script: /home/filter/filter.py

#!/usr/bin/python2.7

from email import Parser
import smtplib
import sys
import logging
from subprocess import Popen, PIPE
logging.basicConfig(level=logging.DEBUG,
 format='%(asctime)s %(levelname)s %(message)s',
 filename='/home/filter/content-filter.log',
 filemode='a')

# Get the CLI arguments.
try:
 cli\_from = sys.argv[2].lower()
 cli\_to = sys.argv[4:]
 logging.debug("To / From : %r" % sys.argv)
except:
 logging.error("Invalid to / from : %r" % sys.argv)
 sys.exit(69) # postfix will bounce the mail. retrying bad args won't work

logging.debug("From : %s, to : %r" % (cli\_from, cli\_to))
# Get the email content from STDIN.
content = ''.join(sys.stdin.readlines())
p = Parser.Parser()
parsed = p.parsestr(content, True)

if parsed.get('X-Jenkins-Job'):
 #logging.debug("email source : %s" % parsed.as\_string())
 parsed.add\_header('X-noris-Ticket-Queue', 'OSA::AOP::VW')
 parsed.add\_header('X-noris-Ticket-Kunde', 'vw-rv-cod')
 parsed.add\_header('X-noris-Ticket-Autoreply', 'no')
 parsed.add\_header('X-noris-Ticket-AppendKey', 'jenkines-pipelines')
 parsed.add\_header('X-noris-Ticket-Type', 'Event')
 parsed.add\_header('X-noris-Ticket-Priority', '4')
 parsed.add\_header('X-noris-Ticket-Status', 'open')
 parsed.add\_header('X-noris-Ticket-Autodispatch', 'Alarming')
 to = "root-manager@noris.de"
else:
 to = "osa-aop-vw-d@noris.de"

content = str(parsed)
# and let's try reinjecting it into Postfix.
command = ["/usr/sbin/sendmail", "-G", "-i", "-f", cli\_from, to]
stdout = ''
stderr = ''
retval = 0
try :
 process = Popen(command, stdin=PIPE)
 (stdout, stderr) = process.communicate(content);
 retval = process.wait()
 if retval == 0:
 logging.debug("Mail resent via sendmail, stdout: %s, stderr: %s" % (stdout, stderr))
 sys.exit(0)
 else:
 raise Exception("retval not zero - %s" % retval)
except Exception, e:
 print "Error re-injecting via /usr/sbin/sendmail."
 logging.error("Error resending mail %s -- stdout:%s, stderr:%s, retval: %s" % (e, stdout, stderr, retval))
 sys.exit(75) # tempfail, we hope.
Print Friendly, PDF & Email