检查拦截垃圾邮件域传输规则的有效性
没有效果的传输规则毫无意义
几周前,我写过一篇关于使用Microsoft Graph从用户邮箱的垃圾邮件文件夹中提取垃圾邮件域列表的文章。该列表随后被用作传输规则的输入,以便来自这些垃圾邮件域的任何电子邮件最终进入隔离区,而不是用户收件箱。除了用系统通知打扰用户告知其邮件被隔离(图1),该技术效果很好。一个计划好的Azure自动化Runbook会收集新出现的垃圾邮件域,并将它们添加到传输规则中。
图1:传输规则拦截来自垃圾邮件域的邮件后发送给用户的隔离通知
事实上,这个传输规则效果如此之好,以至于我决定不再用隔离通知打扰用户,并更新了传输规则,使其静默删除来自垃圾邮件域的邮件,而不向发送者发送任何通知。现在用户收件箱里出现的唯一隔离通知是针对那些并非来自这些垃圾邮件域的邮件。
检查与验证
之后,我有一种不好的预感:也许这个传输规则效果太好了,以至于可能误删了一些邮件。我的直觉告诉我一切正常,但一些验证会增加我的信心。一种检查方法是搜索用户邮箱,看看自规则开始运行以来是否有来自被禁域名的邮件到达,但这似乎有点侵入性。需要另一种方法。
为了寻求确认,我运行了 Get-MailDetailTransportRuleReport cmdlet 来获取过去10天内邮件传输规则执行结果的数据(类似于邮件跟踪日志,10天是Exchange Online保留这些数据供即时查询的最长期限)。
传输规则报告可以按规则执行的操作进行筛选。支持的操作集可以通过运行 Get-MailFilterListReport cmdlet 来查看:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Get-MailFilterListReport -SelectionTarget Actions
SelectionTarget Display Value
--------------- ------- -----
Actions AddBccRecipient AddBccRecipient
Actions AddCcRecipient AddCcRecipient
Actions AddManagerAsRecipient AddManagerAsRecipient
Actions AddToRecipient AddToRecipient
Actions Allow Allow
Actions AllowRedirect AllowRedirect
Actions ApplyClassification ApplyClassification
Actions ApplyHtmlDisclaimer ApplyHtmlDisclaimer
Actions BlockAccess BlockAccess
etc.
|
总结传输规则拦截的结果
该传输规则静默删除垃圾邮件,因此要使用的正确操作是“DeleteMessage”。以下是我用来查找和总结事件的命令:
1
2
3
4
5
6
7
|
[array]$Data = Get-MailDetailTransportRuleReport -Direction inbound -Action DeleteMessage
$Data | Group-Object 'TransportRule' -NoElement | Format-Table Name, Count
Name Count
---- -----
Block email to administrators from outside the organization 65
Quarantine Traffic from Junk Email Domains 80
|
传输规则报告事件中包含的信息如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
|
Date : 02/11/2025 10:42:06
Message ID : <89a2ec2634a1de9811917cb90a02fe3c@9pz.org>
Message Trace ID : e07c2b05-ea8a-429d-e933-08de19fc77b1
Domain : office365itpros.com
Subject : Re: We make packing bags in China
Message Size : 31720
Direction : Inbound
Sender Address : 1232@9pz.org
Recipient Address : james.a.abrahams@office365itpros.com
Event Type : TransportRuleActionHits
Action : DeleteMessage
Transport Rule : Quarantine Traffic from Junk Email Domains
|
我们可以提取并总结针对垃圾邮件域拦截传输规则的事件集,以发现如果拦截不存在,哪些人会收到垃圾邮件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
$TransportRule = 'Quarantine Traffic from Junk Email Domains'
[array]$MData = $Data | Where-Object {$_.'TransportRule' -eq $TransportRule}
$MData | Group-Object -NoElement RecipientAddress | Sort-Object Count -Descending | Format-Table Name, Count
Name Count
---- -----
tony.redmond@office365itpros.com 27
james.a.abrahams@office365itpros.com 7
andy.ruth@office365itpros.com 5
lotte.vetler@office365itpros.com 5
sean.landy@office365itpros.com 5
brian.weakliam@office365itpros.com 4
jeff.atkinson@office365itpros.com 4
office365.book.comments@office365itpros.com 4
terry.hegarty@office365itpros.com 4
contact@office365itpros.com 3
o365itprosrenewals@office365itpros.com 2
marty.king@office365itpros.com 1
office365book@office365itpros.com 1
|
这些地址大多是用于测试的虚拟账户或共享邮箱。垃圾邮件发送者通过从网络文章中收集信息了解到这些地址,但他们向这些账户发送邮件一无所获。不过,我不喜欢在文章截图前清理垃圾邮件,所以很高兴看到传输规则正在发挥作用。
要查找有多少邮件来自特定的垃圾邮件域需要额外费点功夫。以下是一些代码,用于报告传输规则处理的来自每个域的邮件数量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[array]$SpammyDomains = (Get-TransportRule -Identity $TransportRule).SenderDomainIs
ForEach ($Domain in $SpammyDomains) {
$CheckDomain = "*"+$Domain+"*"
[array]$SpamRecords = $MData | Where-Object {$_.SenderAddress -like $CheckDomain}
If ($SpamRecords.Count -gt 0) {
Write-Host ("Domain {0} sent {1} spammy messages" -f $Domain, $SpamRecords.Count)
}
}
Domain 9pz.org sent 7 spammy messages
Domain conarh02.com sent 6 spammy messages
Domain conarh03.com.mx sent 25 spammy messages
Domain conarh07.com sent 6 spammy messages
Domain spamareus.com sent 11 spammy messages
Domain fgwexvb.asia sent 4 spammy messages
Domain forkcontact.com sent 1 spammy messages
Domain moonpig.com sent 4 spammy messages
Domain annoyingcompany.co.uk sent 3 spammy messages
Domain tradetpt12.com sent 5 spammy messages
Domain tradetpxs10.com sent 4 spammy messages
Domain getportant.com sent 4 spammy messages
|
需要一些处理
这里的经验是,存在一种验证传输规则有效性的方法。从传输规则报告中提取所需信息可能需要使用PowerShell进行一些处理,但这无疑是检查规则运行效果的一种方式。