1
4
5from __future__ import print_function
6import Milter
7import time
8import sys
10
11internal_tlds = ["corp", "personal"]
12
13
15def is_internal(hostname):
16 components = hostname.split(".")
17 return components.pop() in internal_tlds
18
19
20
21def are_mixed(hostnames):
22 hostnames_mapped = map(is_internal, hostnames)
23
24
25 num_internal_hosts = hostnames_mapped.count(True)
26
27
28 num_external_hosts = hostnames_mapped.count(False)
29
30 return num_external_hosts >= 1 and num_internal_hosts >= 1
31
33
34 def __init__(self):
36
37
38
39 @Milter.noreply
40 def envfrom(self, mailfrom, *str):
41 self.mailfrom = mailfrom
42 self.domains = []
43 t = parse_addr(mailfrom)
44 if len(t) > 1:
45 self.domains.append(t[1])
46 else:
47 self.domains.append('local')
48 self.internal = False
49 return Milter.CONTINUE
50
51
52 def envrcpt(self, to, *str):
53 self.R.append(to)
54 t = parse_addr(to)
55 if len(t) > 1:
56 self.domains.append(t[1])
57 else:
58 self.domains.append('local')
59
60 if are_mixed(self.domains):
61
62 self.setreply('550','5.7.1','Mixing internal and external TLDs')
63 return Milter.REJECT
64
65 return Milter.CONTINUE
66
67def main():
68 socketname = "/var/run/nomixsock"
69 timeout = 600
70
71 Milter.factory = NoMixMilter
72 print("%s milter startup" % time.strftime('%Y%b%d %H:%M:%S'))
73 sys.stdout.flush()
75 logq.put(None)
76 bt.join()
77 print("%s nomix milter shutdown" % time.strftime('%Y%b%d %H:%M:%S'))
78
79if __name__ == "__main__":
80 main()
A do "nothing" Milter base class representing an SMTP connection.
Definition __init__.py:265
Miscellaneous functions.
Definition utils.py:1
uniqueID()
Definition __init__.py:30
runmilter(name, socketname, timeout=0, rmsock=True)
Run the milter.
Definition __init__.py:835