Exchange 2019入站邮件DKIM校验失败排查:如何在传输代理前捕获原始邮件
Exchange 2019入站邮件DKIM校验失败排查:如何在传输代理前捕获原始邮件
你的观察非常准确——Exchange默认的Pipeline Tracing生成的original.eml其实已经经过了接收连接器的初步标准化处理,所以并不是真正刚抵达服务器的原始邮件。要捕获完全未被Exchange或任何传输代理修改的入站邮件,你可以试试下面这两种实用方法:
方法一:通过网络抓包捕获原始SMTP数据流
这是最直接的方式,能拿到邮件刚到达服务器网络层时的完整原始内容,完全没有经过Exchange的任何处理:
- 在你的Exchange 2019服务器上安装Wireshark(或者用Windows内置的
netsh trace工具) - 配置抓包过滤器,只捕获SMTP端口的流量:
tcp port 25 - 触发目标域名的测试邮件,待邮件到达后,在抓包结果中找到对应的SMTP会话
- 定位到SMTP的
DATA阶段数据包,右键选择「Follow TCP Stream」,将弹出的内容保存为.eml文件(注意要去掉开头的DATA命令和结尾的.,只保留邮件头和正文部分)
用这个方法拿到的EML就是真正的原始邮件,你可以用dkimpy校验对比,就能确认是Exchange的哪个环节修改了邮件内容。
方法二:自定义传输代理(适合有开发能力的管理员)
如果需要长期捕获这类原始邮件,你可以基于Exchange Transport Agent SDK编写一个优先级最高的接收端传输代理,把它放在接收管道的最前端(早于所有内置代理),然后在代理中直接保存原始邮件的副本。不过这个方法需要一定的C#开发基础,步骤大致是:
- 创建一个实现
IReceiveAgent接口的代理类,在OnEndOfData事件中捕获并保存邮件 - 用Exchange Management Shell注册这个代理,并设置最高优先级
- 启动代理后,就能在指定路径下拿到未被修改的原始邮件
额外排查提示
除了捕获原始邮件,你还可以检查这些常见的Exchange修改行为,它们都可能导致DKIM签名失效:
- 检查接收连接器的配置:运行
Get-ReceiveConnector | Select-Object Name, Enabled, TransportRole, RemoteIPRanges,确认是否有连接器启用了头修改、换行符转换(Exchange默认会把LF转换为CRLF) - 查看是否有第三方安全工具(如本地反垃圾软件、邮件过滤网关)在Exchange之前处理了邮件,这类工具经常会添加自定义头或修改邮件内容
- 对比抓包拿到的原始EML和Pipeline Tracing的
original.eml,找出具体被修改的部分(比如新增的X-开头的头、换行符变化、正文编码调整),这样就能精准定位问题环节
备注:内容来源于stack exchange,提问作者Danny.Ando
相关产品推荐
相关产品推荐

