Email
exim4 - 為什麼只使用 acl_not_smtp 限制出站郵件到智能主機的速率?
為了限制每個收件人的外發電子郵件(所有電子郵件都由同一使用者發送),我一直在一個非常簡單的環境中進行一些測試:
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 billyw@mypersonalemail.com <<< '' mail -s testing billyw@myotherpersonalemail.com <<< '' done
此配置似乎按預期工作;它允許向每個收件人發送 7 封電子郵件,並丟棄每個收件人的最後 3 封電子郵件。
但是,如果我嘗試在與 SMTP 相關的 ACL 中使用相同的配置,例如:
acl_smtp_connect
acl_smtp_rcpt
acl_smtp_mail
然後ACL的限速入口沒有被hook,10條消息全部發送。
為什麼在 smtp 相關的 ACL 中沒有應用速率限制?
acl_not_smtp
相當於acl_data
SMTP 流量。嘗試在該 ACL 中進行速率限制。SMTP 連接為您提供了更多的 ACL 選項,您可以在其中放置消息。(注意:discard
是一個黑洞變體,accept
所以你不會看到拒絕消息。)丟棄是相當激烈的,我會使用defer
ordeny
用於 SMTP 流量。Exim Specification第 42 章第 38 節介紹了速率限制。您可以使用修改後的配置進行測試,這樣您在測試時可以比實施後更嚴格地限制速率。在實施之前留出時間清除測試限制。
嘗試將以下內容添加到您的
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 進行速率限制。