⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 postfixproxy.py

📁 用python实现的邮件过滤器
💻 PY
字号:
#!/usr/bin/env python"""Proxy class used to insert Spambayes training between two Postfix servers.For details, see <http://www.postfix.org/SMTPD_PROXY_README.html>."""import os# This module is generally going to be imported from smtpd which will be run# as the main program and thus be named __main__.  Importing smtpd directly# will override any global object definitions.  In particular, the# DEBUGSTREAM setting might get hosed.import __main__ as smtpdif not hasattr(smtpd, "PureProxy"):    import smtpdimport timeimport email.Parserfrom spambayes import Options, hammie, storage__all__ = ['SpambayesProxy']# stolen from sb_filter.py# XXX should probably be enhanced to select training database based upon# message recipients, but let's see how far a single database gets us.class HammieFilter(object):    def __init__(self):        options = Options.options        # This is a bit of a hack to counter the default for        # persistent_storage_file changing from ~/.hammiedb to hammie.db        # This will work unless a user:        #   * had hammie.db as their value for persistent_storage_file, and        #   * their config file was loaded by Options.py.        if options["Storage", "persistent_storage_file"] == \           options.default("Storage", "persistent_storage_file"):            options["Storage", "persistent_storage_file"] = \                                    "~/.hammiedb"        options.merge_files(['/etc/hammierc',                            os.path.expanduser('~/.hammierc')])        self.dbname, self.usedb = storage.database_type([])        self.modtime = os.path.getmtime(self.dbname)        self.h = None    def open(self):        mtime = os.path.getmtime(self.dbname)        if self.h is None or self.modtime < mtime:            self.h = hammie.open(self.dbname, self.usedb, 'r')            self.modtime = mtime    def __del__(self):        self.h = None    def score_and_filter(self, msg):        self.open()        return self.h.score_and_filter(msg)class SpambayesProxy(smtpd.PureProxy):    def __init__(self, *args, **kwds):        smtpd.PureProxy.__init__(self, *args, **kwds)        self.h = HammieFilter()        self.spam_cutoff = Options.options["Categorization", "spam_cutoff"]    def log_message(self, data):        """log message to unix mbox for later review"""        # XXX where should we log it?        pass    def process_message(self, peer, mailfrom, rcpttos, data):        t1 = time.time()        try:            msg = email.Parser.Parser().parsestr(data)        except:            pass        else:            t2 = time.time()            msg.add_header("X-Peer", peer[0])            prob, data = self.h.score_and_filter(msg)            t3 = time.time()            try:                if prob >= self.spam_cutoff:                    self.log_message(data)                    print >> smtpd.DEBUGSTREAM, 'probable spam: %.2f' % prob                    return '503 Error: probable spam'                refused = self._deliver(mailfrom, rcpttos, data)                t4 = time.time()                # TBD: what to do with refused addresses?                print >> smtpd.DEBUGSTREAM, 'we got some refusals:', refused                print >> smtpd.DEBUGSTREAM, 'deliver time:', t4-t3            finally:                print >> smtpd.DEBUGSTREAM, 'parse time:', t2-t1                print >> smtpd.DEBUGSTREAM, 'score time:', t3-t2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -