10 from __future__
import print_function
13 from StringIO
import StringIO
15 from io
import StringIO
19 from socket
import AF_INET, AF_INET6
22 from multiprocessing
import Process
as Thread, Queue
24 from threading
import Thread
25 from Queue
import Queue
27 logq = Queue(maxsize=4)
38 def connect(self, IPname, family, hostaddr):
43 self.port = hostaddr[1]
44 if family == AF_INET6:
45 self.flow = hostaddr[2]
46 self.scope = hostaddr[3]
53 self.receiver = self.getsymval(
'j')
54 self.log(
"connect from %s at %s" % (IPname, hostaddr) )
56 return Milter.CONTINUE
60 def hello(self, heloname):
63 self.log(
"HELO %s" % heloname)
64 if heloname.find(
'.') < 0:
66 self.setreply(
'550',
'5.7.1',
'Sheesh people! Use a proper helo name!')
69 return Milter.CONTINUE
72 def envfrom(self, mailfrom, *str):
76 self.user = self.getsymval(
'{auth_authen}')
77 self.log(
"mail from:", mailfrom, *str)
82 self.canon_from =
'@'.join(parse_addr(mailfrom))
83 self.fp.write(
'From %s %s\n' % (self.canon_from,time.ctime()))
84 return Milter.CONTINUE
89 def envrcpt(self, to, *str):
91 self.R.append(rcptinfo)
93 return Milter.CONTINUE
97 def header(self, name, hval):
98 self.fp.write(
"%s: %s\n" % (name,hval))
99 return Milter.CONTINUE
104 return Milter.CONTINUE
107 def body(self, chunk):
109 return Milter.CONTINUE
113 msg = email.message_from_file(self.fp)
116 self.addrcpt(
'<%s>' %
'spy@example.com')
122 return Milter.CONTINUE
126 return Milter.CONTINUE
131 logq.put((msg,self.id,time.time()))
138 print(
"%s [%d]" % (time.strftime(
'%Y%b%d %H:%M:%S',time.localtime(ts)),id),
141 for i
in msg: print(i,end=
None)
148 bt = Thread(target=background)
150 socketname =
"/home/stuart/pythonsock" 153 Milter.factory = myMilter
154 flags = Milter.CHGBODY + Milter.CHGHDRS + Milter.ADDHDRS
155 flags += Milter.ADDRCPT
156 flags += Milter.DELRCPT
157 Milter.set_flags(flags)
158 print(
"%s milter startup" % time.strftime(
'%Y%b%d %H:%M:%S'))
163 print(
"%s bms milter shutdown" % time.strftime(
'%Y%b%d %H:%M:%S'))
165 if __name__ ==
"__main__":