Я хотел бы настроить фильтрацию спама с помощью встроенной поддержки фильтра спама exim в разделе конфигурации acl_check_data.
Конвейер, модификация заголовка exim (для сохранения результата) работает хорошо. А также перенос почты в папку нежелательной почты с помощью dovecot-lda.
Моя единственная проблема заключается в том, что я не могу передать виртуального пользователя получателя в spamassassin, чтобы spamd загружал настройки пользователя из sql.
Я знаю, что левая часть ключевого слова exim` spam 'предназначена для этого, но оно не передает для меня никаких переменных. Только статические значения: просто игнорирует все заданные мной переменные.
Вот мой раздел конфигурации:
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, но я хотел бы использовать эту функцию, если это возможно. Так что не советуйте, пожалуйста, другие решения, я их знаю.
То, что вы хотите сделать, просто невозможно. Проверка на спам во время SMTP запретит это, так как вы в конечном итоге в какой-то момент сканируете одно письмо (то есть одно сканирование), которое будет содержать несколько получателей ... Какие пользовательские настройки вы бы тогда загрузили? Для этого вам необходимо использовать конвейерный транспорт (для spamc) во время доставки, а не во время SMTP. В любом случае использование сильного обнаружения спама (например, spamassassin) во время SMTP - плохая идея, поскольку это делает ваш сервер уязвимым для DoS-атак. Используйте более легкое обнаружение спама во время SMTP и тяжелое (с правилами, подходящими для каждого пользователя) во время доставки.