使用 exim ACL 拒绝收件人/抄送人数较多的电子邮件

使用 exim ACL 拒绝收件人/抄送人数较多的电子邮件

我遇到了一个问题,我的邮件服务器发送的邮件收件人或抄送收件人很多(>20)。更糟糕的是,这些邮件是邮件列表,因此可以发送给数百人。然后人们会回复所有人,导致大量令人恼火的消息。

用户教育不是一种选择(他们是故意这样做的)。我可以在邮件服务器中过滤这些消息吗?例如使用 Exim ACL。

recipient_max不是一个选项,因为这也会限制Bcc应该通过的邮件。

答案1

首先,您必须了解,如果客户知道如何正确滥用,他们可以在收件人标题中发送一封包含 1 个地址的电子邮件,但实际上会将其发送给 1000 个人。计算收件人:或抄送:标题中的电子邮件地址数量并不能保证您会阻止客户发送的电子邮件。只有当他们以幼稚的方式滥用您的系统时,您才会阻止他们的电子邮件。但是,您说他们只是将所有内容都放在收件人字段中(即幼稚的方式),因此本答案的其余部分假设这是将数据提交到您的 Exim 服务器的方式。

现在,直接回答您的问题:在 DATA ACL 中(仅在 DATA ACL 中!),您可以通过两步过程检查收件人或抄送标头中的电子邮件地址数量。要测试这些标头,您可以使用 $h_To: 和 $h_Cc: 访问它。尾随冒号是必需的。我们假设 To: 标头是:

"Org user" <[email protected]>,<[email protected]>,"Todd Lyons" <[email protected]>

通过这个例子,我将向你展示这两个步骤中每个步骤的作用:

# Step 1: To header converted to a (colon-separated) list
$ exim -be '${addresses:"Org user" <[email protected]>,<[email protected]>,"Todd Lyons" <[email protected]>}'
[email protected]:[email protected]:[email protected]

# step 2: Now count the number of list items
$ exim -be '${listcount:${addresses:"Org user" <[email protected]>,<[email protected]>,"Todd Lyons" <[email protected]>}}'
3

使用当前版本的 exim(4.82)时,这最终在您的 DATA ACL 中看起来将是这样的:

deny     message = Too many recipients
         condition = ${if >{ ${listcount:${addresses:$h_To:,$h_Cc:}} }{10} {yes}{no}}

如果您使用的是旧版本(例如 Debian 稳定版中的版本),则可以使用遍历列表并增加计数器的旧版本:

deny     message = Too many recipients
         condition = ${if >{ ${reduce {${addresses:$h_To:,$h_Cc:}} {0} {${eval:$value+1}}}} {10} {yes}{no}}

请注意,在上述两种情况下,{yes}{no} 部分都是多余的。${if...} 语句的返回值始终为真或假,因此考虑到这一点,您可以根据需要将其省略。我更喜欢明确地将其放入,因为它使其更具可读性(对我以及任何可能关注我并必须阅读此代码的人来说)。

相关内容