Чтобы ограничить скорость исходящих писем для каждого получателя (все письма отправляются одним и тем же пользователем), я провел некоторое тестирование в очень простой среде:
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 сообщения на каждого получателя.
Однако, если я попытаюсь использовать ту же конфигурацию в ACL, связанном с SMTP, например:
acl_smtp_connect
acl_smtp_rcpt
acl_smtp_mail
Тогда запись ограничения скорости ACL не перехватывается, и отправляются все 10 сообщений.
Почему не применяется ограничение скорости, когда оно помещается в ACL, связанный с smtp?
В acl_not_smtp
эквивалентно acl_data
для SMTP-трафика. Попробуйте ограничить скорость в этом ACL. Подключения SMTP предоставляют больше вариантов ACL, куда вы можете поместить сообщение. (Заметка: discard
это вариант черной дыры accept
так что вы не увидите сообщения об отклонении.) Отказ от этого довольно радикальный, и я бы использовал defer
или deny
для SMTP-трафика.
Ограничение скорости описано в Глава 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.