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

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

都开启了,但是呢,还是会有漏网之鱼,而且把这些邮件自己列为 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 一个 TextHeader 并 InsertAfter 到 LastChild 即可。

写好后,要将编译好的 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 打印出来。

时间: 2025-01-13 01:18:56

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

关于企业邮箱服务器经常被spamhaus反垃圾邮件组织拦截的排错方法分享

其实在企业邮件平台管理过程中,企业邮箱管理员经常会被各种各样的邮箱问题所困扰,而困扰最大的除了服务器规划不当带来的后期服务器维护的困难外,还有最致命也是最让邮件管理员着急的事情,那就是企业邮箱经常被一些国际反垃圾邮件组织列为黑名单,也许,很多人会在想,如果是列为了黑名单,那么直接进行申诉,释放就可以了,这个回答其实也勉强可以算是对的,但是从申诉到释放,其实也是需要等待一个时间的,那么这时出现大批量的用户反映,我个人认为这其实也是邮件平台不稳定的一个体现,做为管理员,则必须要了解被列为黑名单的根本

启用Exchange 2013邮箱服务器反垃圾邮件功能

Exchange2013的邮箱反垃圾功能相对之前的老版本2010做了很大的调整,不再提供直观可用的图形化的操作管理界面,而是采用了命令行的方式进行安装和管理. --------------------------------------------- 反垃圾邮件和反恶意软件相关变更 EMC 中的反垃圾邮件代理管理 在 Exchange 2010 中,当在集线器传输服务器上启用了反垃圾邮件代理时,可以在 Exchange 管理控制台 (EMC) 中管理反垃圾邮件代理.在 Exchange 2013

exchange 2013启用反垃圾邮件禁止发件人为空

今天遇到一个客户经常收到发件人为空的邮件.要阻止发件人为空的邮件需要使用exchange里面的反垃圾邮件功能. 客户使用的邮件环境是两个exchange 2013的服务器. 默认exchange 2013是没有启用反垃圾邮件的功能的所以要实现这个功能需要以下的步骤 1 启用反垃圾邮件功能 2 重启传输服务 3 指定SMTP服务器即是启用了反垃圾邮件功能的exchange服务器 4 启用发件人筛选 5 禁用发件人为空的邮件. 这里不上图了>>>>>>> 1 首先以管

Exchange 2010 预防被恶意中继及配置反垃圾邮件功能

近期 ,本公司Exchange 2010邮箱服务器发送邮件到QQ邮箱,邮箱服务器经过一天反馈:邮件未送达 .经排查发现Exchange服务器无法访问QQ邮箱服务器25端口且传输队列垃圾现象严重,判断Exchange邮箱服务器被中继. Exchange 环境为一台服务器,安装了邮箱.客户端访问.集线器传输3中角色,未安装边缘传输 ,未安装邮件防火墙. 传输队列现象如图: 邮件日志记录,如图: 解决思路及步骤 测试确认邮箱服务器能够访问到QQ 邮箱服务器的25 端口  若弹出"220 newmx.q

9.2 配置反垃圾邮件功能

在 Microsoft Exchange Server 2013 中,可在邮箱服务器上的传输服务中使用以下反垃圾邮件代理,但是默认情况下不会安装这些代理: 内容筛选器代理 发件人 ID 代理 发件人筛选器代理 收件人筛选器代理 发件人信誉的协议分析代理 但是,可以通过在 Exchange 命令行管理程序中使用脚本,在邮箱服务器上安装这些反垃圾邮件代理. 通常,仅当组织接受所有传入邮件而之前未进行任何反垃圾邮件筛选时,才会在邮箱服务器上安装反垃圾邮件代理. 在MBX上,打开EMS CD "C:\P

使用Exchange反垃圾邮件组件解决内部仿冒邮件

最近一个朋友遇到一个很有意思的问题,在生产环境中我们装好Exchange之后,肯定需要配置外部邮件的收发.按照我们对邮件系统的理解,我们必须在default 接收连接器上的权限设置,允许匿名连接,才能实现外部邮件的接收.如果我们不配置匿名权限,那么外部邮箱在往我们的邮件系统域发送邮件时就会遇到类似以下的错误: 但在没有反垃圾邮件措施的情况下,我们可以使用telnet工具,实现匿名的邮件发送,并可以任意的冒名发送: 在上图中,我们用telnet工具非常轻松的就冒名邮件系统域的Postmaster邮

Exchange反垃圾解决方案Proxmox Mail Gateway!

从安全的角度来看,将公司邮件服务器放在Internet上是非常危险的.最好的选择是使用邮件网关,网关将检查邮件中的垃圾邮件和病毒,并将其转发到内部邮件服务器.如Microsoft Exchange本身自带的边缘服务器,但是通常情况下,它既不能扫描病毒也不能正常过滤垃圾邮件.那么您必须购买第三方解决方案(趋势scanmail等),才能阻止电子邮件流量免受Internet威胁,同时可以采取其他的开源前端反垃圾网关来处理,今天介绍一个免费的解决方案:Proxmox Mail Gateway 配合exc

在java中使用RBL服务器(中国反垃圾邮件联盟的CBL+使用)

这是06年写的,不知道现在RBL改了没,不过恢复过来做记录,以后可能需要. 实时黑名单(RBL)实际上是一个可供查询的IP地址列表,通过DNS的查询方式来查找一个IP地址的A记录是否存在来判断其是否被列入了该实时黑名单中.基于这条原理,那么要写客户端就比较容易了. 使用JNDI查询 DirContext ictx = new InitialDirContext();Attributes a = ictx.getAttributes("dns://cblplus.anti-spam.org.cn/

exchange邮件无法发送问题(被反垃圾屏蔽)

上一周遇到一个问题,现在是解决了,但是觉得这个过程很值得跟做邮件维护的人员分享.突然有用户说收到退信了,这些用户都是Exchange服务器上的用户,他们居然不能给自己公司上的云用户发邮件.给到我的报错就是一个截图,没有有价值的信息. 遇到这种问题,第一时间我就登录了O365的管理端(我们的邮件环境是混合部署),到邮件流,message trace,把发件人和收件人信息填写进去,然后搜索 居然到的结论是Delivered 后来,我从一个本地的IT拿到了一段退信日志,其中有一句非常有用. 当我看到这