Итак, у меня есть почтовый сервер, который получает нежелательную почту, и мне нужно пересылать эти нежелательные электронные письма в папку нежелательной почты виртуальных пользователей. У меня есть dovecot, postfix и spamassassin, которые работают вместе, но моя проблема в том, что я могу ' Кажется, я не нашел способа пересылать нежелательную почту (письмо с названием ***** SPAM *****) в папку спама / нежелательной почты виртуальных пользователей. Если бы кто-нибудь мог помочь мне в этом вопросе, это было бы замечательно. Если вам нужна какая-либо информация / файлы, не стесняйтесь написать мне.
Система работает под управлением Ubuntu 14.04 LTS (64-разрядная версия) с dovecot, postfix и spamasssassin.
Есть много способов сделать то, что вы хотите, но я предпочитаю следующий подход.
spamassassin
запускается как локальная служба, доступная в файловом сокете вместо IP-порта. Это для производительности.
exim
скомпилирован с опцией сканирования содержимого и настроен на взаимодействие с spamassasin
, который оценивает сообщения и возвращает оценку. Если оценка выше порогового значения (49 баллов в моем случае), к сообщению будут добавлены некоторые специальные заголовки:
spamd_address = /tmp/spamd.sock
. . . . .
acl_data:
accept hosts = : +relay_from_hosts
accept condition = ${if >{$message_size}{1M}}
warn spam = spamd
condition = ${if >{$spam_score_int}{49}}
add_header = X-Spam-Score: $spam_score_int
add_header = X-Spam-Ooops: Detected
log_message = SpamAssassin detected mesage
accept
Я не проверял спам-сообщения размером более 1 МБ, поскольку спам обычно намного меньше. Затем я доставил сообщение в почтовый ящик пользователя. Я делаю это с помощью транспорта через dovecot delivery
:
localdelivery:
driver = pipe
user = mailnull
command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain -f $sender_address
temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78
envelope_to_add
return_path_add
delivery_date_add
log_output
dovecot
имеет плагин pidgeonhole
, реализующий функциональность sieve
. Все сообщения проходят через глобальный фильтр, который выглядит следующим образом:
####
require "fileinto";
if exists "X-Spam-Ooops"
{
fileinto "Junk";
stop;
}
else
{
# Trigger to launch next script in sequence
keep;
}
####
Логика здесь проста: если доставленное сообщение имеет заголовок X-Spam-Ooops
(назначен exim
на оценка sa
), он будет доставлен в подпапку INBOX.Junk
для каждого конкретного пользователя. else
ветвь с глаголом keep
внутри необходима для дальнейшей обработки сообщения через пользовательский фильтр (ы) после обработки глобального фильтра.