这种技术,可以在客户端实现,也可以在服务器端实现。
客户端的实现比较简单,只要客户端软件,在收信时进行分类就可以了,但是有一个不好的地方,就是当你更换了客户端时,邮件的分类就全没有了。
服务器端的实现稍微繁琐一些,但是不管在什么地方,使用什么客户端,都能得到分类的邮件,缺点也显而易见,这部分工作由服务器端来做,加重了服务器的负担。
客户端的实现,就不用讲了,只是一个规制编程的事情。
现在以服务器端的Cyrus为例,讲一下服务器端的设置。
Cyrus是Imap服务器,和Pop最大的一个区别就是用户可以在服务器端创建多个目录,并且邮件的状态都是保存在服务器端。
Cyrus使用一种叫sieve script的脚本(参照 http://sieve.info/)来对邮件过滤,要使用sieve script必须在启动cyrus的同时启动sieve daemon,当邮件到达cyrus的lmtp daemon时,先取检查sieve daemon的script规则,根据规制然后决定怎么处理邮件。
设置如下:
在/etc/services里追加
sieve 2000/tcp sieve 2000/udp
在/etc/cyrus.conf里追加
sieve cmd="/usr/cyrus/bin/timsieved" listen="sieve" prefork=0
重新启动cyrus服务器
kill `cat /var/run/cyrus-master.pid` /usr/cyrus/bin/master -d
首先用telnet登录sieve服务,看是否正常启动
$ telnet 127.0.0.1 2000 Trying 127.0.0.1... Connected to localhost.localdomain (127.0.0.1). Escape character is '^]'. "IMPLEMENTATION" "Cyrus timsieved v2.3.8" "SASL" "NTLM LOGIN PLAIN DIGEST-MD5 CRAM-MD5" "SIEVE" "comparator-i;ascii-numeric fileinto reject vacation imapflags notify envelope relational regex subaddress copy" OK
然后使用一个叫sieveshell的工具,可以对sieve服务上的script进行查询,添加,删除,操作,激活等操作。
$ sieveshell -a username localhost connecting to localhost Please enter your password:
输入密码後,登录,可以输入help命令查看它的所有命令。
> help Usage: sieveshell [-u username] [-a authname] [-r realm]help - this screen list - list scripts on server put [ ] - upload script to server get [ ] - get script. if no filename display to stdout delete - delete script. activate - set a script as the active script deactivate - deactivate all scripts quit - quit
写一个简单的sieve script,然后使用put命令上传导sieve服务器上,
require "fileinto"; if header:contains "from" "wei" { fileinto "INBOX.TRASH"; } else { fileinto "INBOX"; }
这段代码的意思是,如果from头里包含wei这个字符串的话,就放入导INBOX.TRASH目录里,否则就放到INBOX目录里。
当目录不存在时,lmtp会自动把邮件转到默认的“INBOX”目录里
使用sieveshell只能手工这样对sieve script进行操作,如果做了一个邮件的web app,可以让用户自己来定制规则的话,就不能用这种方法了。
其实sieveshell是使用的一种叫“managesieve”的协议(参看: http://tools.ietf.org/html/draft-martin-managesieve-07)和sieve服务器进行通讯的,只要通过这个协议,就可以用程序来对sieve服务器上的sieve script来进行管理了。
提供这种协议通讯的java包,我只找到一个,gatorsieve: http://gatorsieve.svn.sourceforge.net/viewvc/gatorsieve/
由于这种协议非常简单,并且sieve script的语法也不复杂,所以完全可以在程序中,根据用户的设定,组织好sieve script,然后通过managesieve协议上传导sieve服务器上,这样就可以实现用户的个人定制了。