Cyrus中如何实现邮件分类。

阅读更多
现在很多的免费邮箱都实现了过滤分类功能,也就是说通过设定,可以让收到的邮件自动归类的指定的目录里。
这种技术,可以在客户端实现,也可以在服务器端实现。
客户端的实现比较简单,只要客户端软件,在收信时进行分类就可以了,但是有一个不好的地方,就是当你更换了客户端时,邮件的分类就全没有了。
服务器端的实现稍微繁琐一些,但是不管在什么地方,使用什么客户端,都能得到分类的邮件,缺点也显而易见,这部分工作由服务器端来做,加重了服务器的负担。

客户端的实现,就不用讲了,只是一个规制编程的事情。

现在以服务器端的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服务器上,这样就可以实现用户的个人定制了。

你可能感兴趣的:(SVN,编程,脚本,Web,.net)