~phil.pennock/mailman/dmarc-reject

« back to all changes in this revision

Viewing changes to Mailman/Utils.py

  • Committer: Jim Popovitch
  • Date: 2013-03-03 08:04:37 UTC
  • Revision ID: jimpop@gmail.com-20130303080437-rjqvq4cas36ieqv5
Hold/Reject/Discard moderation support for Senders with a DMARC p=reject policy

Show diffs side-by-side

added added

removed removed

Lines of Context:
71
71
    True = 1
72
72
    False = 0
73
73
 
 
74
try:
 
75
    import dns.resolver
 
76
    from dns.exception import DNSException
 
77
    dns_resolver = True
 
78
except ImportError:
 
79
    dns_resolver = False
 
80
 
74
81
EMPTYSTRING = ''
75
82
UEMPTYSTRING = u''
76
83
NL = '\n'
1057
1064
    else:
1058
1065
        return False
1059
1066
 
 
1067
 
 
1068
# This takes an email address, and returns True if DMARC policy is p=reject
 
1069
def IsDmarcProhibited(email):
 
1070
    if not dns_resolver:
 
1071
         return False
 
1072
 
 
1073
    email = email.lower()
 
1074
    at_sign = email.find('@')
 
1075
    if at_sign < 1:
 
1076
        return False
 
1077
    dmarc_domain = '_dmarc.' + email[at_sign+1:]
 
1078
 
 
1079
    try:
 
1080
        resolver = dns.resolver.Resolver()
 
1081
        resolver.timeout = 1
 
1082
        resolver.lifetime = 5
 
1083
        txt_recs = resolver.query(dmarc_domain, dns.rdatatype.TXT)
 
1084
    except dns.resolver.NXDOMAIN:
 
1085
        return False
 
1086
    except DNSException, e:
 
1087
        syslog('error', 'DNSException: Unable to query DMARC policy for %s (%s). %s',
 
1088
              email, dmarc_domain, e.__class__)
 
1089
        return False
 
1090
    else:
 
1091
        for txt_rec in txt_recs.response.answer:
 
1092
            assert( txt_rec.rdtype == dns.rdatatype.TXT)
 
1093
            if re.search(r"[^s]p=reject", "".join(txt_rec.items[0].strings), re.IGNORECASE):
 
1094
               return True
 
1095
    
 
1096
    return False
 
1097
 
 
1098