Fail template, move most header fields into template.
This commit is contained in:
@@ -166,9 +166,6 @@ def create_msg(q,rcptlist,origmsg=None,template=None):
|
|||||||
|
|
||||||
msg = Message()
|
msg = Message()
|
||||||
|
|
||||||
msg.add_header('To',sender)
|
|
||||||
msg.add_header('From','postmaster@%s'%receiver)
|
|
||||||
msg.add_header('Auto-Submitted','auto-generated (configuration error)')
|
|
||||||
msg.add_header('X-Mailer','PyMilter-'+Milter.__version__)
|
msg.add_header('X-Mailer','PyMilter-'+Milter.__version__)
|
||||||
msg.set_type('text/plain')
|
msg.set_type('text/plain')
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
Auto_whitelist is checked in check_spf(), but check_spf() is not called for
|
Received-SPF header field should show identity that was checked.
|
||||||
trusted_relay. Hence, mail relayed via trusted relay is not whitelisted.
|
|
||||||
Should also check auto_whitelist for trusted relay - but need to extract
|
|
||||||
relay SPF result from Received-SPF or X-Guessed-SPF header field.
|
|
||||||
|
|
||||||
FIXME: DSN for Permerror shows 'None' for error.
|
Check SPF for outgoing mail (including local policy for internal addresses).
|
||||||
|
This could also solve the second part of the mail from relay problem below.
|
||||||
|
|
||||||
|
Whitelisted sender from trusted relay get PROBATION. Need to extracted
|
||||||
|
SPF result from headers - and in the case of mail internal to relay
|
||||||
|
(e.g. bmsi.com), supply 'pass' result.
|
||||||
|
|
||||||
|
FIXME: DSN for Permerror shows 'None' for error under some condition.
|
||||||
|
|
||||||
Another metaDSN format:
|
Another metaDSN format:
|
||||||
Subject: Delivery Report
|
Subject: Delivery Report
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
#!/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.61 2006/05/17 21:28:07 customdesigned
|
||||||
|
# Create GOSSiP record only when connection will procede to DATA.
|
||||||
|
#
|
||||||
# Revision 1.60 2006/05/12 16:14:48 customdesigned
|
# Revision 1.60 2006/05/12 16:14:48 customdesigned
|
||||||
# Don't require SPF pass for white/black listing mail from trusted relay.
|
# Don't require SPF pass for white/black listing mail from trusted relay.
|
||||||
# Support localpart wildcard for white and black lists.
|
# Support localpart wildcard for white and black lists.
|
||||||
@@ -248,7 +251,8 @@ subjpats = (
|
|||||||
r'\buser unknown\b',
|
r'\buser unknown\b',
|
||||||
r'^failed',
|
r'^failed',
|
||||||
r'^echec de distribution',
|
r'^echec de distribution',
|
||||||
r'^fallo en la entrega'
|
r'^fallo en la entrega',
|
||||||
|
r'\bfehlgeschlagen\b'
|
||||||
)
|
)
|
||||||
refaildsn = re.compile('|'.join(subjpats),re.IGNORECASE)
|
refaildsn = re.compile('|'.join(subjpats),re.IGNORECASE)
|
||||||
import logging
|
import logging
|
||||||
@@ -1155,6 +1159,7 @@ class bmsMilter(Milter.Milter):
|
|||||||
if users and not newaddr and not user.lower() in users:
|
if users and not newaddr and not user.lower() in users:
|
||||||
self.log('REJECT: RCPT TO:',to)
|
self.log('REJECT: RCPT TO:',to)
|
||||||
return Milter.REJECT
|
return Milter.REJECT
|
||||||
|
# FIXME: should dspam_exempt be case insensitive?
|
||||||
if user in block_forward.get(domain,()):
|
if user in block_forward.get(domain,()):
|
||||||
self.forward = False
|
self.forward = False
|
||||||
exempt_users = dspam_exempt.get(domain,())
|
exempt_users = dspam_exempt.get(domain,())
|
||||||
@@ -1446,7 +1451,7 @@ class bmsMilter(Milter.Milter):
|
|||||||
if self.spf and self.mailfrom != '<>':
|
if self.spf and self.mailfrom != '<>':
|
||||||
# check that sender accepts quarantine DSN
|
# check that sender accepts quarantine DSN
|
||||||
msg = mime.message_from_file(StringIO.StringIO(txt))
|
msg = mime.message_from_file(StringIO.StringIO(txt))
|
||||||
rc = self.send_dsn(self.spf,msg,'quarantine.txt')
|
rc = self.send_dsn(self.spf,msg,'quarantine')
|
||||||
del msg
|
del msg
|
||||||
if rc != Milter.CONTINUE:
|
if rc != Milter.CONTINUE:
|
||||||
return rc
|
return rc
|
||||||
@@ -1508,7 +1513,7 @@ class bmsMilter(Milter.Milter):
|
|||||||
# check that sender accepts quarantine DSN
|
# check that sender accepts quarantine DSN
|
||||||
self.fp.seek(0)
|
self.fp.seek(0)
|
||||||
msg = mime.message_from_file(self.fp)
|
msg = mime.message_from_file(self.fp)
|
||||||
rc = self.send_dsn(self.spf,msg,'quarantine.txt')
|
rc = self.send_dsn(self.spf,msg,'quarantine')
|
||||||
if rc != Milter.CONTINUE:
|
if rc != Milter.CONTINUE:
|
||||||
self.fp = None
|
self.fp = None
|
||||||
return rc
|
return rc
|
||||||
@@ -1668,13 +1673,13 @@ class bmsMilter(Milter.Milter):
|
|||||||
if self.cbv_needed:
|
if self.cbv_needed:
|
||||||
q,res = self.cbv_needed
|
q,res = self.cbv_needed
|
||||||
if res in ('softfail','fail','deny'):
|
if res in ('softfail','fail','deny'):
|
||||||
template_name = 'softfail.txt'
|
template_name = 'softfail'
|
||||||
elif res in ('unknown','permerror'):
|
elif res in ('unknown','permerror'):
|
||||||
template_name = 'permerror.txt'
|
template_name = 'permerror'
|
||||||
elif res == 'neutral':
|
elif res == 'neutral':
|
||||||
template_name = 'neutral.txt'
|
template_name = 'neutral'
|
||||||
else:
|
else:
|
||||||
template_name = 'strike3.txt'
|
template_name = 'strike3'
|
||||||
rc = self.send_dsn(q,msg,template_name)
|
rc = self.send_dsn(q,msg,template_name)
|
||||||
self.cbv_needed = None
|
self.cbv_needed = None
|
||||||
if rc == Milter.REJECT:
|
if rc == Milter.REJECT:
|
||||||
@@ -1727,7 +1732,7 @@ class bmsMilter(Milter.Milter):
|
|||||||
else:
|
else:
|
||||||
self.log('CBV:',sender)
|
self.log('CBV:',sender)
|
||||||
try:
|
try:
|
||||||
template = file(template_name).read()
|
template = file(template_name+'.txt').read()
|
||||||
except IOError: template = None
|
except IOError: template = None
|
||||||
m = dsn.create_msg(q,self.recipients,msg,template)
|
m = dsn.create_msg(q,self.recipients,msg,template)
|
||||||
if srs:
|
if srs:
|
||||||
@@ -1735,7 +1740,7 @@ class bmsMilter(Milter.Milter):
|
|||||||
m.add_header('Message-Id','<%s>'%msgid)
|
m.add_header('Message-Id','<%s>'%msgid)
|
||||||
#m.add_header('Sender','"Python Milter" <%s>'%msgid)
|
#m.add_header('Sender','"Python Milter" <%s>'%msgid)
|
||||||
m = m.as_string()
|
m = m.as_string()
|
||||||
print >>open('last_dsn','w'),m
|
print >>open(template_name+'.last_dsn','w'),m
|
||||||
res = dsn.send_dsn(sender,self.receiver,m)
|
res = dsn.send_dsn(sender,self.receiver,m)
|
||||||
if res:
|
if res:
|
||||||
desc = "CBV: %d %s" % res[:2]
|
desc = "CBV: %d %s" % res[:2]
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
|
To: %(sender)s
|
||||||
|
From: postmaster@%(receiver)s
|
||||||
Subject: SPF %(result)s (POSSIBLE FORGERY)
|
Subject: SPF %(result)s (POSSIBLE FORGERY)
|
||||||
|
Auto-Submitted: auto-generated (sender verification)
|
||||||
|
|
||||||
This is an automatically generated Delivery Status Notification.
|
This is an automatically generated Delivery Status Notification.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
|
To: %(sender)s
|
||||||
|
From: postmaster@%(receiver)s
|
||||||
Subject: Critical SPF configuration error
|
Subject: Critical SPF configuration error
|
||||||
|
Auto-Submitted: auto-generated (configuration error)
|
||||||
|
|
||||||
This is an automatically generated Delivery Status Notification.
|
This is an automatically generated Delivery Status Notification.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
|
To: %(sender)s
|
||||||
|
From: postmaster@%(receiver)s
|
||||||
Subject: DELIVERY STATUS (POSSIBLE SPAM)
|
Subject: DELIVERY STATUS (POSSIBLE SPAM)
|
||||||
|
Auto-Submitted: auto-generated (content analysis)
|
||||||
|
|
||||||
This is an automatically generated Delivery Status Notification.
|
This is an automatically generated Delivery Status Notification.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
|
To: %(sender)s
|
||||||
|
From: postmaster@%(receiver)s
|
||||||
Subject: SPF %(result)s (POSSIBLE FORGERY)
|
Subject: SPF %(result)s (POSSIBLE FORGERY)
|
||||||
|
Auto-Submitted: auto-generated (configuration error)
|
||||||
|
|
||||||
This is an automatically generated Delivery Status Notification.
|
This is an automatically generated Delivery Status Notification.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
|
To: %(sender)s
|
||||||
|
From: postmaster@%(receiver)s
|
||||||
Subject: Critical mail server configuration error
|
Subject: Critical mail server configuration error
|
||||||
|
Auto-Submitted: auto-generated (configuration error)
|
||||||
|
|
||||||
This is an automatically generated Delivery Status Notification.
|
This is an automatically generated Delivery Status Notification.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user