为 Exchange 服务器编写自定义的反垃圾插件

Posted 嗨呃哦哒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为 Exchange 服务器编写自定义的反垃圾插件相关的知识,希望对你有一定的参考价值。

Exchange 2010 的 Edge Transport 包含了一些 Anti-spam 的 Feature,如图:

image

都开启了,但是呢,还是会有漏网之鱼,而且把这些邮件自己列为 Junk 也起不了多大作用,这些 Feature 的设置也很鸡肋,没办法设置复杂一点的规则。于是我怒了,着手自己把这些漏网之鱼挡掉。

首先,是要找到相关的文档以及 SDK。文档入口在这里,然而里面提到的 Transport Agents SDK 的安装程序很坑,要你装个装不了的东西才给开始安装。后来发现其实可以不安装,直接从服务器上拷贝几个 DLL 和 XML 文件到本地,路径是 C:\\Program Files\\Microsoft\\Exchange Server\\V14\\Public。接着用 Visual Studio 新建一个 .Net 3.5 的 Class Library,然后添加对这几个 DLL 的引用即可。

接下来的事情就是跟着文档的例子写(抄)一个 SmtpReceiveAgent 的架子了,然后看怎么处理 EndOfData。

Exchange 自带的 Content Filtering 会根据内容产生几个评分,其中一个叫 SCL(Spam Confidence Level),会存到邮件头里面,并以 X-MS-Exchange-Organization-SCL 命名。当这个评分超过 5 的时候,邮件就会被认为是垃圾邮件。

所以现在要做的就是自己扫描过邮件以后,把我的评分写到这个邮件头上面。邮件头可以通过以下方式拿到:

var message = e.MailItem.Message;
var headers = message.MimeDocument.RootPart.Headers;

然后通过 headers.FindFirst 方法找到 SCL 对应的记录,然后改变它,如果是空的就 new 一个 TextHeaderInsertAfterLastChild 即可。

写好后,要将编译好的 DLL 复制到服务器上安装,可以用 PowerShell 完成。安装的脚本是:

Install-TransportAgent -Name "MySpamFilterAgent" -TransportAgentFactory "CustomSpamFilterAgent.MySpamFilterAgentFactory" -AssemblyPath "C:\\CustomSpamFilterAgents\\CustomSpamFilterAgent.dll"
Set-TransportAgent MySpamFilterAgent -Priority 2
Enable-TransportAgent MySpamFilterAgent
Restart-Service MSExchangeTransport

卸载的脚本很简单,可以推出来。

如果想要 debug,那么要先 Attach 到 EdgeTransport.exe,然后在外面发封测试邮件到这服务器。

各种 Agent 的执行顺序可以在 PowerShell 用 Get-TransportPipeline | Format-List 打印出来。

以上是关于为 Exchange 服务器编写自定义的反垃圾插件的主要内容,如果未能解决你的问题,请参考以下文章

易宝典文章——玩转Office 365中的Exchange Online服务 之二十四 配置垃圾邮件筛选器反垃圾邮件

Exchange 安全和维护

在 openfire 插件中编写自定义 Rest API

为具有嵌套标签的自定义标签编写 jekyll 插件时出现问题

易宝典文章——玩转Office 365中的Exchange Online服务 之二十五 配置出站垃圾邮件策略通知

jQuery 在自定义插件上实现销毁方法