Skip to content
Snippets Groups Projects
Commit 393aa614 authored by Stuart Gathman's avatar Stuart Gathman
Browse files

Doc update.

Parse From header for delayed failure detection.
Don't check reputation of trusted host.
Track IP reputation only when missing PTR.
parent 2a6a6823
Branches
Tags
No related merge requests found
Need to exclude robot users from autowhitelist. Don't want to have to
list all users, so implement something like !*-admin@bmsi.com,@bmsi.com.
Feedback from user training is ignored because UMIS has already been Milter won't start when a whitelist/blacklist file is missing.
Milter won't start when it can't change permissions on *.lock to match
*.log. Should maybe ignore that error - the effect will be to set
the permissions to default.
GOSSiP feedback from user training is ignored because UMIS has already been
removed from queue. Maybe keep UMIS in queue, and add method to removed from queue. Maybe keep UMIS in queue, and add method to
alter last feedback for ID. alter last feedback for ID.
...@@ -145,6 +153,8 @@ Need a test module to feed sample messages to a milter though a live ...@@ -145,6 +153,8 @@ Need a test module to feed sample messages to a milter though a live
sendmail and SMTP. The mockup currently used is probably not very accurate, sendmail and SMTP. The mockup currently used is probably not very accurate,
and doesn't test the threading code. and doesn't test the threading code.
DONE Delayed failure detection should parse From header to find email address.
DONE When bms.py can't find templates, it passes None to dsn.create_msg(), DONE When bms.py can't find templates, it passes None to dsn.create_msg(),
which uses local variable as backup, which no longer exist. Do plain which uses local variable as backup, which no longer exist. Do plain
CBV in that case instead. CBV in that case instead.
......
#!/usr/bin/env python #!/usr/bin/env python
# A simple milter that has grown quite a bit. # A simple milter that has grown quite a bit.
# $Log$ # $Log$
# Revision 1.86 2007/01/16 05:17:29 customdesigned
# REJECT after data for blacklisted emails - so in case of mistakes, a
# legitimate sender will know what happened.
#
# Revision 1.85 2007/01/11 04:31:26 customdesigned # Revision 1.85 2007/01/11 04:31:26 customdesigned
# Negative feedback for bad headers. Purge cache logs on startup. # Negative feedback for bad headers. Purge cache logs on startup.
# #
...@@ -77,7 +81,7 @@ from Milter.config import MilterConfigParser ...@@ -77,7 +81,7 @@ from Milter.config import MilterConfigParser
from fnmatch import fnmatchcase from fnmatch import fnmatchcase
from email.Header import decode_header from email.Header import decode_header
from email.Utils import getaddresses from email.Utils import getaddresses,parseaddr
# Import gossip if available # Import gossip if available
try: try:
...@@ -108,6 +112,7 @@ subjpats = ( ...@@ -108,6 +112,7 @@ subjpats = (
r'^undeliver', r'^undeliver',
r'^delivery\b.*\bfail', r'^delivery\b.*\bfail',
r'^delivery problem', r'^delivery problem',
r'\bnot\bbe\bdelivered',
r'\buser unknown\b', r'\buser unknown\b',
r'^failed', r'^failed',
r'^echec de distribution', r'^echec de distribution',
...@@ -674,7 +679,7 @@ class bmsMilter(Milter.Milter): ...@@ -674,7 +679,7 @@ class bmsMilter(Milter.Milter):
else: else:
global gossip global gossip
if gossip and domain and rc == Milter.CONTINUE \ if gossip and domain and rc == Milter.CONTINUE \
and not self.internal_connection: and not (self.internal_connection or self.trusted_relay):
if self.spf and self.spf.result == 'pass': if self.spf and self.spf.result == 'pass':
qual = 'SPF' qual = 'SPF'
elif res == 'pass': elif res == 'pass':
...@@ -682,6 +687,9 @@ class bmsMilter(Milter.Milter): ...@@ -682,6 +687,9 @@ class bmsMilter(Milter.Milter):
elif hres == 'pass': elif hres == 'pass':
qual = 'HELO' qual = 'HELO'
domain = self.spf.h domain = self.spf.h
elif self.missing_ptr and self.spf.result == 'none':
qual = 'IP'
domain = self.connectip
else: else:
qual = self.connectip qual = self.connectip
try: try:
...@@ -976,7 +984,9 @@ class bmsMilter(Milter.Milter): ...@@ -976,7 +984,9 @@ class bmsMilter(Milter.Milter):
# if confirmed by finding our signed Message-ID, # if confirmed by finding our signed Message-ID,
# original sender (encoded in Message-ID) is blacklisted # original sender (encoded in Message-ID) is blacklisted
elif lname == 'from' and val.lower().startswith('postmaster@'): elif lname == 'from':
name,email = parseaddr(val)
if email.lower().startswith('postmaster@'):
# Yes, if From header comes last, this might not help much. # Yes, if From header comes last, this might not help much.
# But this is a heuristic - if MTAs would send proper DSNs in # But this is a heuristic - if MTAs would send proper DSNs in
# the first place, none of this would be needed. # the first place, none of this would be needed.
......
...@@ -13,6 +13,13 @@ Title: Python Milter FAQ ...@@ -13,6 +13,13 @@ Title: Python Milter FAQ
<h3> <a name="compiling">Compiling Python Milter </a> </h3> <h3> <a name="compiling">Compiling Python Milter </a> </h3>
<li> Q. I have tried to download the current milter code and my virus scan
traps several viruses in the download.
<p> A. The milter source includes a number of deactivated viruses in
the test directory. All but the first and last lines of the base64
encoded virus data has been removed. I suppose I should randomize
the first and last lines as well, since pymilter just deletes executables,
and doesn't look for signatures.
<li> Q. I have installed sendmail from source, but Python milter won't <li> Q. I have installed sendmail from source, but Python milter won't
compile. compile.
<p> A. Even though libmilter is officially supported in sendmail-8.12, <p> A. Even though libmilter is officially supported in sendmail-8.12,
......
...@@ -17,5 +17,6 @@ ...@@ -17,5 +17,6 @@
<li><a href="http://www.openspf.org/">SPF</a> <li><a href="http://www.openspf.org/">SPF</a>
<li><a href="pysrs.html">pysrs</a> <li><a href="pysrs.html">pysrs</a>
<li><a href="http://cheeseshop.python.org/pypi/pyspf">pyspf</a> <li><a href="http://cheeseshop.python.org/pypi/pyspf">pyspf</a>
<li><a href="http://bmsi.com/python/pygossip.html">pygossip</a>
<li><a href="http://bmsi.com/python/dspam.html">pydspam</a> <li><a href="http://bmsi.com/python/dspam.html">pydspam</a>
<li><a href="http://bmsi.com/libdspam/dspam.html">libdspam</a> <li><a href="http://bmsi.com/libdspam/dspam.html">libdspam</a>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment