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

Динамически ограничивать размер вложения постфикса

Для проекта, над которым я сейчас работаю, мы получили требование об ограничении размера «динамического» почтового вложения. Для постфикса (который мы сейчас используем) это легко реализовать с помощью message_size_limit вариант конфигурации. Однако это не позволяет пользователю отправлять электронное письмо с вложением. В нашем варианте использования требуется два разных ограничения. В некоторых ситуациях применяется более низкий предел, но он должен быть прозрачным для пользователей. Они по-прежнему должны иметь возможность отправлять электронные письма с вложениями, размер которых меньше максимального.

Поэтому мы хотели бы предотвратить получение письма с отклонением «слишком большое сообщение», а вместо этого поставить сообщение в очередь для повторной попытки доставки в более позднее время. Поэтому, когда ограничение на размер вложений снова увеличивается, почта все равно будет доставлена ​​получателю.

Задний план

Нам нужна эта возможность для судов, которые иногда могут быть подключены к медленному спутниковому каналу связи, а в других случаях могут быть подключены к высокоскоростному каналу связи. Для высокоскоростного восходящего канала большие вложения (<20 МБ) не являются большой проблемой, но для спутникового соединения с очень низкой пропускной способностью это становится проблемой, поэтому мы хотим ограничить размер вложения. Однако это не должно быть видно пользователю, поскольку он ничего не знает о текущем типе восходящего канала.

Здесь я предполагаю, что у вас есть механизм, контролирующий статус восходящего канала вашего сервера. При изменении восходящего канала необходимо запустить сценарий, описанный ниже.

Postfix проверяет размер сообщения только перед тем, как поставить его в очередь. Действие было либо 200 принимаю или 5XX отклонить. Нет никаких настраиваемых действий, таких как «Эй, постфикс, пожалуйста, подержи это большое сообщение, пока мы не подключимся к высокоскоростному восходящему каналу».

Итак, нам здесь нужен компаньон. Ты можешь использовать postfwd чтобы проверить размер сообщения для вас. Когда ваше сообщение превышает ограничение postfwd, вы можете определить настраиваемое действие, например ДЕРЖАТЬ действие. По данным человек 5 доступ, когда действие HOLD применено к сообщению, то

ДЕРЖАТЬ необязательный текст ...

Поместите сообщение в очередь удержания, где оно будет находиться, пока кто-нибудь не удалит его или не отправит для доставки. Зарегистрируйте необязательный текст, если он указан, в противном случае зарегистрируйте общее сообщение.

Итак, вот идея:

  • Когда вы подключены к медленному аплинку, установите нижний предел в postfwd. Когда отправленное пользователем сообщение превышает нижний предел, postfix удерживает его. Он стоит в очереди, и postfix не будет его доставить.
  • Когда вы подключены к высокоскоростному каналу связи, сценарий установит более высокий предел в postfwd. Затем сценарий должен быть выдан постсупер команда как root чтобы освободить письмо из очереди HOLD.

    postsuper -H ALL
    

    Обратите внимание: в этом случае ограничение postfwd должно быть больше, чем message_size_limit в постфиксе. В противном случае постфикс не отклонит большое сообщение, а будет его удерживать.

  • Когда вы снова подключены к медленному аплинку, установите нижний предел в postfwd.

Пример правила postfwd:

# replace 192.168.1.0/24 with your local network and 12345 with limit size
id=RULE001
    client_address=192.168.1.0/24
    size=12345
    action=HOLD exceed slow link limit

Пожалуйста, обратитесь к документации postfwd о монтаж и это правила. Этот ответ не покрывает это.