У меня проблема с электронными письмами с большим количеством (> 20) получателей Кому или Копия, отправляемых через мой почтовый сервер. Что еще хуже, это списки рассылки, так что охватите сотни людей. Затем люди отвечают, вызывая массовые раздражающие сообщения.
Обучение пользователей не вариант (они делают это специально). Могу ли я отфильтровать эти сообщения на почтовом сервере? Например. с Exim ACL.
recipient_max
не вариант, так как это также ограничит Bcc
'ed писем, которые должны пройти.
Во-первых, важно, чтобы вы понимали, что клиент может отправить электронное письмо с 1 адресом в заголовке «Кому», но на самом деле отправить его 1000 людям, если они поймут, как им злоупотребить. Подсчет количества адресов электронной почты в заголовке To: или Cc: не гарантирует, что вы заблокируете электронные письма, отправляемые клиентом. Вы заблокируете их электронную почту только в том случае, если они наивно злоупотребят вашей системой. Однако вы заявили, что они просто помещают все в поле «Кому» (т.е. наивным способом), поэтому остальная часть этого ответа предполагает, что данные отправляются на ваш сервер Exim таким образом.
Теперь, чтобы ответить на ваш вопрос прямо так, как вы его задали: в DATA ACL (только в DATA ACL!) Вы можете проверить количество адресов электронной почты в заголовке To или Cc в два этапа. Чтобы проверить эти заголовки, вы обращаетесь к ним с помощью $ h_To: и $ h_Cc: Требуется конечное двоеточие. Предположим, что заголовок To::
"Org user" <todd@example.org>,<tlyons@example.com>,"Todd Lyons" <todd@example.net>
В этом примере я покажу вам, что делает каждый шаг двухэтапного процесса:
# Step 1: To header converted to a (colon-separated) list
$ exim -be '${addresses:"Org user" <todd@example.org>,<tlyons@example.com>,"Todd Lyons" <todd@example.net>}'
todd@example.org:tlyons@example.com:todd@example.net
# step 2: Now count the number of list items
$ exim -be '${listcount:${addresses:"Org user" <todd@example.org>,<tlyons@example.com>,"Todd Lyons" <todd@example.net>}}'
3
В текущих версиях exim (4.82) это в конечном итоге будет выглядеть в вашем DATA ACL примерно так:
deny message = Too many recipients
condition = ${if >{ ${listcount:${addresses:$h_To:,$h_Cc:}} }{10} {yes}{no}}
Если вы используете старую версию, например ту, что находится в стабильной версии Debian, вы можете использовать старую версию, которая выполняет итерацию по списку и увеличивает счетчик:
deny message = Too many recipients
condition = ${if >{ ${reduce {${addresses:$h_To:,$h_Cc:}} {0} {${eval:$value+1}}}} {10} {yes}{no}}
Обратите внимание, что в обоих случаях выше, часть {да} {нет} является лишней. Возврат оператора $ {if ...} всегда будет истинным или ложным, поэтому, помня об этом, вы можете не включать его, если хотите. Я предпочитаю вставлять его явно, потому что это делает его более читабельным (для меня и для всех, кто может следовать за мной и должен прочитать этот код).