为了对每个收件人的发送电子邮件进行速率限制(所有电子邮件均由同一用户发送),我在一个非常简单的环境中进行了一些测试:
The Webs
^
|
+-------------------+ SMTP? +--------+---------+
| +---------------> | mail.example.com |
| billyw.localhost | | (smarthost) |
| (exim4) | | |
+-------------------+ +------------------+
billyw.localhost
是一台 Debian 机器。使用dpkg-reconfigure exim4-config
,我将其设置mail.example.com
为智能主机。
目前,我通过添加 ACL 来限制速率acl_not_smtp
:
acl_not_smtp = acl_check_not_smtp
acl_check_not_smtp:
# Rate limit based on the recipient address
discard
ratelimit = 7 / 1m / per_mail / $recipients
log_message = Rate limit exceeded for $recipients: $sender_rate/$sender_rate_period (max $sender_rate_limit)
accept
我正在使用以下命令对此进行测试billyw.localhost
:
for i in {1..10}; do
mail -s testing [email protected] <<< ''
mail -s testing [email protected] <<< ''
done
此配置似乎按预期工作;它允许向每个收件人发送 7 封电子邮件,并丢弃每个收件人的最后 3 封。
但是,如果我尝试在与 SMTP 相关的 ACL 中使用相同的配置,例如:
acl_smtp_connect
acl_smtp_rcpt
acl_smtp_mail
然后,ACL 的速率限制条目就不会被挂钩,并且所有 10 条消息都会被发送。
为什么当它被放入与 smtp 相关的 ACL 时,速率限制不会被应用?
答案1
对于 SMTP 流量,这acl_not_smtp
相当于acl_data
。尝试在该 ACL 中限制速率。SMTP 连接为您提供了更多 ACL 选项,您可以在其中放置消息。(注意:discard
是的黑洞变体,accept
因此您不会看到拒绝消息。)丢弃是相当激烈的,我会对SMTP 流量 使用defer
或。deny
速率限制涵盖第 42 章第 38 条Exim 规范。您可以使用修改后的配置进行测试,这样在测试时就可以比实施时更严格地限制速率。在实施之前留出时间让测试限制清除。
尝试将以下内容添加到您的acl_smtp_rcpt
:
defer
ratelimit = 7 / 1m / $recipients
message = Rate limit exceeded for $recipients: \
$sender_rate/$sender_rate_period (max $sender_rate_limit)
/usr/bin/mail
运行本地sendmail
程序来传递邮件,而不是通过网络堆栈进行连接。对于您而言,exim4 是作为 sendmail 的替代品使用的。邮件将被视为非 smtp 传递。需要使用非 smtp ACL 进行速率限制。