我希望有办法创建一个白名单,让Exchange Server 2003 Service Pack 2(SP2)的Exchange智能邮件筛选器(Intelligent Message Filter,IMF)可以使用,同时又保留使用黑名单的功能。但是,如果您把黑名单转换为白名单,您会失去黑名单的功能。为了将黑名单用作白名单,我通过Internet只搜索到一种解决办法(参见http://forums.msexchange.org/m_1800395576/printable.htm),这种办法使消息被移至Pickup文件夹,然后它们被重新路由和发送,而对于传统的黑名单,被列入黑名单的邮件会被移出发送队列。以下是实现这个解决方案的几个步骤:
1. 在Exchange系统管理器(ESM)的“全局设置”*“邮件传递”*“属性”*“发件人筛选”中,添加您希望列入白名单的地址。
2. 只勾选“存档筛选的邮件”和“接受邮件而不将筛选情况通知发件人”选择框。
3. 打开命令提示符并进入邮件根文件夹所在驱动器:Program FilesExchsrvrMailrootvsi n(其中n是SMTP虚拟服务器实例的编号)。
4. 使用linkd.exe(来自Windows Server 2003 Resource Kit的工具)或Junction工具(以前是Sysinternals的实用程序,现在由微软提供,网址是http://www.microsoft.com/technet/sysinternals/fileanddisk/junction.mspx),运行以下其中一个命令来创建NTFS连接点(Junction Point):
使用linkd.exe:
linkd filter /D pickup
其中/D开关会删除源连接点(此处即Filter),而不管对于该源是否存在链接。
使用Junction:
junction filter pickup
前面的步骤可建立对Pickup和Filter目录的符号链接。使用发件人筛选器所筛选的所有消息然后被储存在Pickup目录中,并被传递到正确的收件箱。
但是,这种解决办法会带来一些问题。首先,我们的公司邮件服务器会试图向“收件人:”和“抄送:”字段里不属于我们的Exchange组织的收件人发送重复的消息。当然,这种方法也缩减了我的黑名单,我依靠这个黑名单来删除所有那些不容易去掉而且很讨厌的多余消息(也就是发送给已经离开公司的员工的消息,以及发送给注册了未经许可的电子邮件订阅的员工的消息)。在IMF中将垃圾邮件可信度(SCL)降低为1可将垃圾邮件的数目减少到百分之一以下;但是,将SCL降低为1也会引起误报数目的增加。
更好的方法
考虑到误报的问题,我希望找到办法筛选ExchsrvrMailrootvsi nUCEArchive目录,该目录由IMF生成并用来保存满足SCL阈值的消息。我尝试了一些命令行选项,并最终想出来一个主意,也就是编写一个脚本,这个脚本使用白名单来筛选UceArchive目录中有效的电子邮件。该脚本读取白名单(一个文本文件),并通过将UceArchive目录中的邮件地址与白名单中的地址进行比对来验证消息的合法性。然后脚本将有效的邮件从UceArchive目录移至Pickup目录,并将垃圾邮件从UceArchive目录移至指定的文件夹。
这种解决方案提供了最好的结果:
? 我可以将SCL降低到1。
? 脚本会将误报的邮件重新发送到Pickup目录。
? 可以继续保留我的黑名单来对付那些多余消息。
以下说明如何使用我这种基于脚本的解决办法:
1. 在D:Program FilesExchsrvrMailrootvsi 1BList中创建一个BList目录(也就是在含有vsi 1文件夹的驱动器中)。
2. 把您的白名单制作成简单的文本文件。表1中我的脚本WList.bat不区分大小写,您在白名单文本文件中输入的任何内容都表示子字符串,因此要小心输入正确的邮件域名,并在每个域名前面加上“at”符号(@)。例如,在白名单中指定ford.com将同时允许ashford.com。因此,如果您要将ford.com列入白名单,应在白名单中输入@ford.com。图1显示了一个白名单文件的样本。由于该脚本扫描邮件消息的头字段和正文的所有文本,您还可以在白名单文件中加入其它字段(例如“收件人:”或者“主题”)中的地址。例如,您可以在白名单文件中加入“From:name@domain.com”。(在这种情况下,您需要加入发件人地址的所有变化形式,比如Bob和Bob@bob.com。您还可以添加包括已知的安全IP地址的行,来防止带有伪装的头字段的邮件进入。
3. 将文本文件移至一台PC,这个PC与您的Exchange Server 2003 Service Pack 2(SP2)服务器有相同的“vsi n”目录结构。
4. 创建脚本。您可以使用我的脚本样本WList.bat,您可修改它以便适合您的要求,或者编写您自己的脚本。由于UceArchive目录不能包含任何脚本组件,您将需要将该脚本,以及Resource Kit里的sleep.exe实用程序(脚本需要此程序)复制到此目录以外。(我们在SMTP网关上持续不断地运行WList.bat,但是您也可以创建一个计划任务来运行它。)此脚本的好处是,将delims关键字和带/G:开关的Findstr命令(该命令使用常规表达式在文件中搜索文本,/G:开关告诉脚本从指定的文件取得搜索字符串)与For循环同时使用,让您使白名单文本文件易于维护,因为您不必停止whitelist.bat就可以修改whitelist.txt。(您可以在下面的网址找到Findstr的完整语法:http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/findstr.mspx?mfr=true。)为了便于管理,我的whitelist.txt中的项目是按字母顺序排列的。
:: 由于脚本组件不能存在于UceArchive 目录中,更改您的工作目录
cd UceArchive
:: 开始无限循环
:Start
:: 带有delims的For循环从文件Wlist.txt中读取白名单,
:: 如果发现匹配则将相关的邮件移至Pickup目录。
FOR /F "delims=" %%F IN ('FINDSTR /M /G:"D:Program FilesExchsrvrMailrootvsi 1Wlist.txt"
*.eml') DO MOVE "%%F" "D:Program FilesExchsrvrMailrootvsi 1PickUp"
:: 任何一个没有被移走的邮件都可能是垃圾邮件,因此将它移至另一个文件夹
:: 这样不会再次扫描它。
Move "D:Program FilesExchsrvrMailrootvsi 1UceArchive*.eml" "D:Program
FilesExchsrvrMailrootvsi 1BList"
:: 休息15秒
"D:Program FilesExchsrvrMailrootvsi 1"Sleep.exe 15
:: 回到开始并重新运行
Goto :Start
表1:WList.bat
图1:白名单文件的样本
在WList.bat中,您可以修改程序每次等待循环开始的秒数,以满足您公司的服务级别协议(SLA)在邮件传递方面的要求。此外,您可以通过筛选SCL级别本身,进一步对Blist 目录进行筛选。这显示为“X-SCL: #”,其中“#”符号是表示SCL级别的数字。
WList.bat运行得很快。在开始的测试里,该脚本使用一个由大约200行项目组成的白名单,它在三秒内就扫描并移动了超过1,200条邮件消息。
最后的思考
由于服务器端的SCL级别不能低于邮件客户端的SCL级别,将级别降低至1也在Microsoft Office Outlook 2003客户端中降低了它。这种较低级别的情况可能会引起客户端的一些误报情况发生。但是,这些误报会在用户批准域和发件人时迅速消失。你可以通过在SMTP网关上只启用IMF来避免这一问题。然后把所有端口是25的通讯重定向到网关,让网关完成所有的处理。
在某个星期五充分地测试了我的脚本以后,我在我们的Exchange服务器上正式将其投入使用。在之后的星期一早上,我们的CEO告诉我的主管说,他以为我们的邮件服务中断了,因为他的黑莓手机竟然没有收到任何一封垃圾邮件!在我们开始使用WList.bat之前,大约百分之十至十二发送给用户的垃圾邮件会到达他们的邮箱。现在员工完全不会收到垃圾邮件,这都是因为我。