我收到了一种特别可怕的垃圾邮件,可以通过发件人标头中的纯文本名称轻松识别。
基本上格式如下:
From: "foo" <[email protected]>
我想编写一个 ACL 数据条件来检查是否foo
在发件人标头中。你会怎么做?
我相信它会在数据访问控制部分。
答案1
根据标题字段有条件地丢弃邮件:
进出控制配置文件
system_filter = /etc/exim/system_filter.conf
系统过滤器配置文件
if $header_from matches "foo.*<"
or $header_from contains "@morespam.com"
or $h_subject contains "Viagra"
then
seen finish
endif
第一个条件仅当 foo 出现在 From 标头的友好部分时才会匹配。正则表达式不区分大小写。
最好在进行任何更改后测试过滤器文件。语法错误system_filter.conf
会导致传入消息暂时无法投递。
测试
exim -bF /etc/exim/system_filter.conf <spam.eml
垃圾邮件邮件列表
Subject: This is Spam Viagra
From: Fred Foo Jones <[email protected]>
To: John Smith <[email protected]>
Date: Mon, 22 Aug 2016 07:26:20 -0500
This is the body of the e-mail.
测试将告诉您消息是否会被传递、丢弃(“已完成”),或者过滤文件中是否存在错误(您会收到类似的消息,Filter error: unknown filtering command "asldkf" near line 75 of filter file
)
虽然不是 ACL 解决方案,但对我来说维护起来很容易。我只需要在条件发生变化时更新 system_filter.conf。
我将其放在exim.confsystem_filter
文件(主要配置设置)的顶部。seen finish
黑洞命令;它指示 Exim 已完成消息处理。
参考:Exim 过滤文件
答案2
我认为 Jim U 的答案可能是实现我的目标的更好方法,但根据记录,以下是我在 DATA ACL 中执行此操作的方式:
acl_check_data:
# Blacklist if friendly name matches any patterns.
drop
condition = ${if match{$h_from:}{"foo"}}
message = Blacklisted.
log_message = Blacklisted nasty.
这会导致550 Blacklisted.
SMTP 客户端出现错误并立即关闭连接。