milter-nomix.py
import Milter
import time
import sys
from Milter.utils import parse_addr
internal_tlds = ["corp", "personal"]
def is_internal(hostname):
    components = hostname.split(".")
    return components.pop() in internal_tlds:
def are_mixed(hostnames):
    hostnames_mapped = map(is_internal, hostnames)
    
    num_internal_hosts = hostnames_mapped.count(True)
    
    num_external_hosts = hostnames_mapped.count(False)
    return num_external_hosts >= 1 and num_internal_hosts >= 1
class NoMixMilter(Milter.Base):
  def __init__(self):  
    self.id = Milter.uniqueID()  
  
  @Milter.noreply
  def envfrom(self, mailfrom, *str):
    self.mailfrom = mailfrom
    self.domains = []
    t = parse_addr(mailfrom)
    if len(t) > 1:
      self.domains.append(t[1])
    else:
      self.domains.append('local')
    self.internal = False
    return Milter.CONTINUE
  
  def envrcpt(self, to, *str):
    self.R.append(to)
    t = parse_addr(to)
    if len(t) > 1:
      self.domains.append(t[1])
    else:
      self.domains.append('local')
    if are_mixed(self.domains):
      
      self.setreply('550','5.7.1','Mixing internal and external TLDs')
      return Milter.REJECT
        
    return Milter.CONTINUE
    
def main():
  socketname = "/var/run/nomixsock"
  timeout = 600
  
  Milter.factory = NoMixMilter
  print "%s milter startup" % time.strftime('%Y%b%d %H:%M:%S')
  sys.stdout.flush()
  Milter.runmilter("nomixfilter",socketname,timeout)
  logq.put(None)
  bt.join()
  print "%s nomix milter shutdown" % time.strftime('%Y%b%d %H:%M:%S')
if __name__ == "__main__":
  main()