Назад | Перейти на главную страницу

exim4 - Почему ограничение скорости исходящей почты для smarthost работает только с 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 сообщения на каждого получателя.

Однако, если я попытаюсь использовать ту же конфигурацию в ACL, связанном с SMTP, например:

Тогда запись ограничения скорости 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.