Отправка необработанного письма с python и получение очереди отправки почты - PullRequest
0 голосов
/ 29 апреля 2019

Мне нужно принять входящее письмо, которое соответствует определенному набору правил в postfix, отправить его внешнему процессу Python, переписать письмо нескольким получателям на основе таблицы postfix postfix и повторно внедрить обратно в postfixцепь.Включенный питон отвечает этому основному требованию, за исключением одного, отслеживания очереди нового повторно введенного электронного письма.

Типичный метод повторной инъекции с / usr / sbin / sendmail не возвращает пригодный для использования очереди для правильного процесса.Это приводит к потере видимости вновь созданных электронных писем (журналы должны быть проанализированы вручную, чтобы создать отчет о подтверждении доставки для третьих лиц).

Поскольку процесс повторного внедрения выполняется на python, в идеале я хотел бы использовать для этого smtplib.Sendmail, но он также не возвращает queueid.

То, что я пробовал и работает, использует netcat в качестве подпроцесса в python (netcat_msg = "helo myserver \ nmail from:" + sender + "\ nrcpt to:" + receient + "\ ndata\ n "+ msg.as_string () +" \ n \ n. \ nquit \ n "), но я чувствую, что это взлом, и я получаю предупреждения о последовательностях команд в smtp (что ожидается, так как я не жду ответаперед выполнением следующей команды).

Есть ли способ выставить очередь, возвращенную с удаленного SMTP-сервера, когда процесс завершится?Любые рекомендуемые подходы к этому?

Моя цель состоит в том, чтобы записать эти очереди в конечную точку файла / API / любого другого, чтобы мы могли определить, что входящее электронное письмо на a@domain.tld было отправлено на bob@example.com, chris.@ example.com и отследите статус возврата сервера назначения.

(Извините, мой грубый питон)

#!/bin/python
#v 2.7.15

import email
import sys
from email.mime.text import MIMEText
import argparse
from subprocess import Popen
from subprocess import PIPE

#ignore this, it was just for debugging
def dump(obj):
   for attr in dir(obj):
       if hasattr( obj, attr ):
           print( "obj.%s = %s" % (attr, getattr(obj, attr)))

def process_message(data, sender, recipient):
   msg = email.message_from_string(data)

   newaddress = '"{recipient}" <{recipient}>'.format(recipient=recipient)
   oldaddress = ''
   if msg.has_key('To'):
      oldaddress = msg['To']
      msg.replace_header('To', newaddress)
   else:
      msg.add_header('To', newaddress)
      oldaddress = newaddress

   if msg.has_key('X-Original-To'):
      msg.replace_header('X-Original-To', oldaddress)
   else:
      msg.add_header('X-Original-To', oldaddress)

   #print(msg.as_string())
   try:
      # replace this with a re-inject that can return the queueid
      p = Popen(["/usr/sbin/sendmail", "-G", "-i", "-f " + sender, "--", recipient ], stdin=PIPE)
      p.communicate(msg.as_string())
      # end replacement
      # log original queueid, returned queueid and destination email here
   except Exception as ex:
      exit(69)

def main():
   parser = argparse.ArgumentParser(description='To field replacement for Email MIME.')
   parser.add_argument('--from', dest="sender", help="From email address", required=True)
   parser.add_argument('--recipient', dest="recipients", help="Recipient address to replace in To field (N+1)", nargs='+', required=True)
   args = parser.parse_args()

   #dump(args)
   data = sys.stdin.readlines()
   data = ''.join(data)

   for recipient in args.recipients:
      #print(recipient)
      process_message(data, args.sender, recipient)

   exit(0)

main()
...