TableOfContents

freebsd

qmail下使用python编写脚本来过滤邮件和发送短信

实现qmail下邮件过滤和邮件到达短信通知 作者:梅劲松 时间:2004年9月10日 感谢:HD、刘鑫 短信这么火热,如果自己的邮件服务器也能和短信结合起来,那多么好啊?在qmail下,我用qmail_queue来解决邮件过滤和短信到达通知。 本邮件系统在freebsd 4.10上实施成功。 1、对于邮件系统的安装,没有太多说的。建议大家看HD的http://bsd.huangdong.com/server/mail/qmail.html来安装。如果已经安装了有qmail+vpopmail+qmail_queue补丁的,请直接跳到4继续安装。在新装邮件服务器时有几点需要注意的是,安装qmail的时候应该将步骤改为: cd /usr/ports/mail/qmail make WITH_QMAILQUEUE_PATCH=yes WITH_BIG_TODO_PATCH=yes WITH_OUTGOINGIP_PATCH=yes WITH_PRESERVE_CONFIG_FILES=yes extract cd /usr/ports/mail/qmail/work/qmail-1.03 fetch http://www.nimh.org/dl/qmail-smtpd.c cd /usr/ports/mail/qmail make WITH_QMAILQUEUE_PATCH=yes WITH_BIG_TODO_PATCH=yes WITH_OUTGOINGIP_PATCH=yes WITH_PRESERVE_CONFIG_FILES=yes install make disable-sendmail make enable-qmail make clean

在安装vpopmail的时候可能因为port更新的原因让使用vpopmail的时候出现奇怪问题,最好是安装webmin将建立的vpopmail数据库删除后,重新建立,并指定数据库的用户权限。由于webmin的安装不是本文重点,这里将忽略。

2、关于文章里面的杀毒部分因为系统效率问题,我没有安装。各位请自行决定是否安装。

3、反垃圾邮件当然需要,我用的是http://anti-spam.org.cn的cbl+服务。使用的时候只需要将smtpd的脚本改为: #!/bin/sh QMAILDUID=/usr/bin/id -u qmaild NOFILESGID=/usr/bin/id -g qmaild exec /usr/local/bin/tcpserver -H -R -l 0 -p -x \

从http://anti-spam.org.cn/cgi-bin/rblclient/(你的邮件服务器的dns服务器IP地址)看到你的邮件服务器的流量和使用cbl+服务的情况。

4、这里是重点了。过滤和短信到达是需要qmail_queue来完成的,一定要打这个包。

使用python来实现这个功能,当然需要安装python啦。 cd /usr/ports/lang/python make;make install;make clean 一般来讲这个安装是非常顺利的。 安装结束后。 cd /var/qmail/bin 编辑qmfilt.py,内容如下:

#!/usr/local/bin/python --

import os, sys, string, time, traceback, re, socket

Version = '1.1' PyVersion = '1.0' Logging = 1 Debug = 0 QmailD = 82#这里需要和你/etc/password里面qmaild用户的一样 LogFile = None TestMode = None Filters = [] MailEnvelope = MailData = ValidActions = { 'trap': , 'drop' : , 'block' : }

#这里是你通过ucp协议将消息发送到哪个服务器的哪个端口 def mail_sms(msg):

def openlog():

def log(message):

def showFilters():

def readFilters():

def readDescriptor(desc):

def writeDescriptor(desc, data):

def filterHits():

def storeInTrap(hit):

def sendToQmailQueue():

def conver(msg):

def main(argv, stdout, environ):

if name == "main":

然后在cd /var/qmail/control 编辑qmfilt内容如下: # # This is the qmfilt control file # If any email comes in that matches this # filter, the mail will be redirected # to the filter directory # # A filter regular expression must be on a single # line and in between a pair of '::' # # Valid actions: # trap - store in the trap directory # block - tell the smtp sender that we won't take the mail # drop - accept the mail, but don't queue it #

# This will match any executable Visual Basic Scripts VisualBasic::block::^Content-Type: application/octet-stream;\s+name="(.*\.vbs)":: SHS::block::^Content-Type: application/octet-stream;\s+name="(.*\.shs)":: SHB::block::^Content-Type: application/octet-stream;\s+name="(.*\.shb)":: COM::block::^Content-Type: application/octet-stream;\s+name="(.*\.com)":: EXE::block::^Content-Type: application/octet-stream;\s+name="(.*\.exe)":: SCR::block::^Content-Type: application/octet-stream;\s+name="(.*\.scr)":: PIF::block::^Content-Type: application/octet-stream;\s+name="(.*\.pif)":: BAT::block::^Content-Type: application/octet-stream;\s+name="(.*\.bat)"::

# This is the Outlook date overflow bug DATE::block::^Date:.{160,}::

在/var/log下建立qmfilt文件,内容为空 chown qmaild qmfilt 在/var/qmail下建立qmfilt目录。 chown -R qmaild qmfilt 好了,来让我们的程序启用吧 先测试一把 /var/qmail/bin/qmfilt.py --test 如果返回了先定义的qmfilt里面的内容,恭喜成功了一半了。内容应该和下面的相似: Filter - VisualBasic - Action: block Regex: ^Content-Type: application/octet-stream;\s+name="(.*\.vbs)" Filter - SHS - Action: block Regex: ^Content-Type: application/octet-stream;\s+name="(.*\.shs)" Filter - SHB - Action: block Regex: ^Content-Type: application/octet-stream;\s+name="(.*\.shb)" Filter - COM - Action: block Regex: ^Content-Type: application/octet-stream;\s+name="(.*\.com)" Filter - EXE - Action: block Regex: ^Content-Type: application/octet-stream;\s+name="(.*\.exe)" Filter - SCR - Action: block Regex: ^Content-Type: application/octet-stream;\s+name="(.*\.scr)" Filter - PIF - Action: block Regex: ^Content-Type: application/octet-stream;\s+name="(.*\.pif)" Filter - BAT - Action: block Regex: ^Content-Type: application/octet-stream;\s+name="(.*\.bat)" Filter - DATE - Action: block Regex: ^Date:.{160,} 好了,让我们的过滤器用起来吧 cd /usr/local/vpopmail/etc 编译tcp.smtp内容如下 127.:allow,RELAYCLIENT="",QMAILQUEUE="bin/qmfilt.py" :allow,QMAILQUEUE="bin/qmfilt.py" 然后生成tcp.smtp.cdb文件 tcprules tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp ,发个带exe为附件的邮件看看。如果成功过滤,应该在/var/log/qmfilt里面看到如下信息: Fri Sep 10 14:37:01 2004 - Matched filter [ EXE] and email was BLOCKED/Refused delivery Fri Sep 10 14:38:09 2004 - Matched [SCR] 如果你是用foxmail等客户端发送带exe为结尾的邮件的话,服务器会提示你拒绝接收的。 到这里,你的邮件过滤已经成功了。 你可以在/var/qmail/control的qmfilt文件里面定义你需要过滤的指定代码,然后测试规则是否生效了。

关于短信到达通知,因为安全和商业上的问题。不能将服务器端的代码贴出来。我将机制给大家讲一下。 qmfilt.py这个程序里面mail_sms用udp将类似From:[email protected] To:[email protected]发送到指定的服务器上。服务器接收到这个数据包后,将这个数据包的内容用短信发送出去。 当然可以将邮件主题等信息一起发送到手机上,大家根据自己的情况更改吧。

这个程序是根据http://sourceforge.net/projects/qmfilt/这个项目更改的,但是直接用他的代码会造成不能收信,大家可以在这个项目的cvs关注他的代码修改情况。

结束,谢谢!