SpamAssassin фильтрация по Exim 4 с настройками виртуального пользователя

Я хотел бы настроить фильтрацию спама с помощью встроенной в exim поддержки фильтра спама в разделе конфигурации acl_check_data.

Конвейерная модификация заголовка exim (для сохранения результата) работает хорошо. А также транспортировка почты в папку нежелательной почты с помощью dovecot-lda.

Моя единственная проблема в том, что я не могу передать виртуального пользователя получателя в spamassassin, чтобы позволить spamd загрузить настройки пользователя из sql.

Я знаю, что левая часть ключевого слова exim "спам" предназначена для этого, но она не передает никакой переменной для меня. Только статические значения: просто игнорирует все переменные, которые я установил.

Вот мой раздел конфигурации:

acl_check_data:

  # Deny if the message contains a virus. Before enabling this check, you
  # must install a virus scanner and set the av_scanner option above.
  #
  deny    malware    = *
          message    = This message contains a virus ($malware_name).

  # Add headers to a message if it is judged to be spam. Before enabling this,
  # you must install SpamAssassin. You may also need to set the spamd_address
  # option above.
  # {def:h_Envelope-to:}

        # Accept when mail size is over 500k
  accept  condition = ${if >={$message_size}{500k}{yes}{no}}

  # put headers in all messages (no matter if spam or not)
  warn    spam       = ${local_part}@${domain}:true
          add_header = X-Spam-Score: $spam_score\n\
                       X-Spam-Score-Int: $spam_score_int\n\
                       X-Spam-Level: $spam_bar\n\
                       X-Spam-Report: $spam_report

  # add second subject line with *SPAM* marker when message
  # is over threshold
  warn    message    = Classified as spam.
          spam       = ${local_part}@${domain}
          add_header = X-Spam-Flag: YES\n\
                       Subject: [SPAM] $h_Subject:

  # reject spam at high scores (> 12)
  deny    message    = This message scored $spam_score spam points.
          spam       = ${local_part}@${domain}:true
          condition  = ${if >{$spam_score_int}{120}{true}{false}}

  # Accept the message.

  accept

Текущей формой является "${local_part}@${domain}", но я пробовал больше: ${local_part@$domain}, с кавычками, без скобок и т. Д. Передан только знак at (@), а переменные работают при другие ключевые слова (например, условия).

Я знаю, что я могу сделать (ресурсоемкий) транспортный хук или даже фильтровать по dovecot, однако я хотел бы использовать эту функцию, если это возможно. Поэтому, пожалуйста, не советуйте другие решения, я их знаю.

1 ответ

То, что вы хотите сделать, просто невозможно. Проверка на спам во время SMTP запрещает это, так как в конечном итоге вы будете сканировать одно письмо (так, одно сканирование), которое будет содержать несколько получателей... Какие пользовательские настройки вы бы тогда загрузили? Чтобы сделать это, вам нужно использовать конвейерный транспорт (для рассылки спама) во время доставки, а не во время SMTP. В любом случае, использование активного обнаружения спама (например, spamassassin) во время SMTP является плохой идеей, поскольку это делает ваш сервер подверженным DoS-атакам. Используйте более легкое обнаружение спама во время SMTP и тяжелое (с правилами, подходящими для каждого пользователя) во время доставки.

Другие вопросы по тегам