[Solved] Разрешение на отправку почты в зависимости от списка

От: Заславский Андрей <CGatePro_at_mx_ru>
Дата: Thu 04 Dec 2008 - 12:18:01 MSK


Решил таки свою задачу, и публикую на всякий случай. Дано: коммунигейт, пачка юзеров.
Есть указание сделать возможной отправку почту за пределы своего домена только для указанных лиц.
Решил написав хелпер на питоне.
Код внизу.
в файле whitelist живет список адресов вида user@domain.com для фильтрации сотворено правило, гласящее, что хелпер применяется для писем из нашего домена в не наш :)
Ну и на всякий случай такие исходящие письма копируются в нужную папочку :)
Comments welcome ;)

код:
#!/usr/bin/python
# -*- coding: utf8 -*-
import sys,string,time,shutil
whitelist='/var/CommuniGate/mailfilter/whitelist' logfile='/opt/CommuniGate/test/pylog.log' FILE = open(logfile,"w")
FILE.write('starting..\n')
def checksender(sendermail):

    f = open(whitelist,"r")
    try:

        for line in f:
                if sendermail.lower()==line.strip():
                    return 1
    finally:
        f.close()

    return 0

def getsenderaddress(filename):

    #got msg.file
    msgfile = open(filename,"r")
    while 1:

        t=msgfile.readline()
        if t=='': return 0
        tlist=t.split();
        if (tlist[0]=='P') and (tlist[1]=='I'): return
tlist[7].strip('<>')

    msgfile.close()
    return 0

while 1:

   t=sys.stdin.readline()
    plist=t.split()
    FILE.write(t)
    FILE.flush()
    if plist[1]=='INTF':

        time.sleep(1)
        sys.stdout.write(plist[0]+' INTF 2\n')
        sys.stdout.flush()

    if plist[1]=='FILE':
        shutil.copyfile(plist[2],
'/opt/CommuniGate/test/archive/'+plist[0])
#       print plist[0]+' OK'
        if checksender(getsenderaddress(plist[2]))==1: print plist[0]+'
OK'
        else:
            print plist[0]+ ' ERROR
Вы_не_можете_отправлять_почту_за_пределы_домена'
        sys.stdout.flush()

    if plist[1]=='QUIT':
        print plist[0]+' OK'
        sys.stdout.flush()
        sys.exit(0)



# print (getsenderaddress('./archive/1.msg')) FILE.close() Получено Thu Dec 04 09:17:50 2008

Этот архив был сгенерирован hypermail 2.1.8 : Thu 04 Dec 2008 - 16:14:20 MSK