Add archive option to wiretap.
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
When bms.py can't find templates, it passes None to dsn.create_msg(),
|
||||||
|
which uses local variable as backup, which no longer exist.
|
||||||
|
|
||||||
|
Purge old GOSSiP records nightly.
|
||||||
|
|
||||||
|
Find and use X-GOSSiP: header for SPAM: and FP: submissions. Would need to
|
||||||
|
keep tags longer.
|
||||||
|
|
||||||
Generate DSNs according to RFC 3464
|
Generate DSNs according to RFC 3464
|
||||||
|
|
||||||
Parse incoming 3464 DSNs for "Action: failed" to recognize delayed
|
Parse incoming 3464 DSNs for "Action: failed" to recognize delayed
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
#!/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.73 2006/12/04 18:47:03 customdesigned
|
||||||
|
# Reject multiple recipients to DSN.
|
||||||
|
# Auto-disable gossip on DB error.
|
||||||
|
#
|
||||||
# Revision 1.72 2006/11/22 16:31:22 customdesigned
|
# Revision 1.72 2006/11/22 16:31:22 customdesigned
|
||||||
# SRS domains were missing srs_reject check when SES was active.
|
# SRS domains were missing srs_reject check when SES was active.
|
||||||
#
|
#
|
||||||
@@ -28,6 +32,7 @@ import time
|
|||||||
import socket
|
import socket
|
||||||
import struct
|
import struct
|
||||||
import re
|
import re
|
||||||
|
import shutil
|
||||||
import gc
|
import gc
|
||||||
import anydbm
|
import anydbm
|
||||||
import Milter.dsn as dsn
|
import Milter.dsn as dsn
|
||||||
@@ -85,6 +90,8 @@ reject_virus_from = ()
|
|||||||
wiretap_users = {}
|
wiretap_users = {}
|
||||||
discard_users = {}
|
discard_users = {}
|
||||||
wiretap_dest = None
|
wiretap_dest = None
|
||||||
|
mail_archive = None
|
||||||
|
_archive_lock = None
|
||||||
blind_wiretap = True
|
blind_wiretap = True
|
||||||
check_user = {}
|
check_user = {}
|
||||||
block_forward = {}
|
block_forward = {}
|
||||||
@@ -258,12 +265,13 @@ def read_config(list):
|
|||||||
reject_virus_from = cp.getlist('scrub','reject_virus_from')
|
reject_virus_from = cp.getlist('scrub','reject_virus_from')
|
||||||
|
|
||||||
# wiretap section
|
# wiretap section
|
||||||
global blind_wiretap, wiretap_users, wiretap_dest, discard_users
|
global blind_wiretap,wiretap_users,wiretap_dest,discard_users,mail_archive
|
||||||
blind_wiretap = cp.getboolean('wiretap','blind')
|
blind_wiretap = cp.getboolean('wiretap','blind')
|
||||||
wiretap_users = cp.getaddrset('wiretap','users')
|
wiretap_users = cp.getaddrset('wiretap','users')
|
||||||
discard_users = cp.getaddrset('wiretap','discard')
|
discard_users = cp.getaddrset('wiretap','discard')
|
||||||
wiretap_dest = cp.getdefault('wiretap','dest')
|
wiretap_dest = cp.getdefault('wiretap','dest')
|
||||||
if wiretap_dest: wiretap_dest = '<%s>' % wiretap_dest
|
if wiretap_dest: wiretap_dest = '<%s>' % wiretap_dest
|
||||||
|
mail_archive = cp.getdefault('wiretap','archive')
|
||||||
|
|
||||||
global smart_alias
|
global smart_alias
|
||||||
for sa,v in [
|
for sa,v in [
|
||||||
@@ -811,7 +819,8 @@ class bmsMilter(Milter.Milter):
|
|||||||
self.blacklist = True
|
self.blacklist = True
|
||||||
self.log("BLACKLIST",self.canon_from)
|
self.log("BLACKLIST",self.canon_from)
|
||||||
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:
|
||||||
if self.spf and self.spf.result == 'pass':
|
if self.spf and self.spf.result == 'pass':
|
||||||
qual = 'SPF'
|
qual = 'SPF'
|
||||||
else:
|
else:
|
||||||
@@ -1579,6 +1588,21 @@ class bmsMilter(Milter.Milter):
|
|||||||
if rc != Milter.CONTINUE:
|
if rc != Milter.CONTINUE:
|
||||||
return rc
|
return rc
|
||||||
|
|
||||||
|
if mail_archive:
|
||||||
|
global _archive_lock
|
||||||
|
if not _archive_lock:
|
||||||
|
import thread
|
||||||
|
_archive_lock = thread.allocate_lock()
|
||||||
|
_archive_lock.acquire()
|
||||||
|
try:
|
||||||
|
fin = open(self.tempname,'r')
|
||||||
|
fout = open(mail_archive,'a')
|
||||||
|
shutil.copyfileobj(fin,fout,8192)
|
||||||
|
finally:
|
||||||
|
_archive_lock.release()
|
||||||
|
fin.close()
|
||||||
|
fout.close()
|
||||||
|
|
||||||
if not defanged and not spam_checked:
|
if not defanged and not spam_checked:
|
||||||
os.remove(self.tempname)
|
os.remove(self.tempname)
|
||||||
self.tempname = None # prevent re-removal
|
self.tempname = None # prevent re-removal
|
||||||
|
|||||||
+4
-2
@@ -38,13 +38,13 @@ case_sensitive_localpart = true
|
|||||||
[defang]
|
[defang]
|
||||||
|
|
||||||
# do virus scanning on attached messages also
|
# do virus scanning on attached messages also
|
||||||
scan_rfc822 = 1
|
scan_rfc822 = 0
|
||||||
# do virus scanning on attached zipfiles also
|
# do virus scanning on attached zipfiles also
|
||||||
scan_zip = 0
|
scan_zip = 0
|
||||||
# Comment out scripts in HTML attachments. Can be CPU intensive.
|
# Comment out scripts in HTML attachments. Can be CPU intensive.
|
||||||
scan_html = 0
|
scan_html = 0
|
||||||
# reject messages with asian fonts because we can't read them
|
# reject messages with asian fonts because we can't read them
|
||||||
block_chinese = 1
|
block_chinese = 0
|
||||||
# list users who hate forwarded mail
|
# list users who hate forwarded mail
|
||||||
;block_forward = egghead@mycorp.com, busybee@mycorp.com
|
;block_forward = egghead@mycorp.com, busybee@mycorp.com
|
||||||
# reject mail with these case insensitive strings in the subject
|
# reject mail with these case insensitive strings in the subject
|
||||||
@@ -128,6 +128,8 @@ blind = 1
|
|||||||
# discard outgoing mail without alerting sender
|
# discard outgoing mail without alerting sender
|
||||||
# can be used in conjunction with wiretap to censor outgoing mail
|
# can be used in conjunction with wiretap to censor outgoing mail
|
||||||
;discard_users = canned@bigcorp.com
|
;discard_users = canned@bigcorp.com
|
||||||
|
# archive copies all delivered mail to a file
|
||||||
|
;mail_archive = /var/log/mail_archive
|
||||||
|
|
||||||
#
|
#
|
||||||
# smart aliases trigger on both sender and recipient
|
# smart aliases trigger on both sender and recipient
|
||||||
|
|||||||
Reference in New Issue
Block a user