Я использую
Ubuntu 18.04 64 bit
dovecot 2.2.33.2
spamassassin 3.4.1
amavisd
Цель - запустить почтовый сервер, чего я уже добился. Я могу получить доступ к электронной почте на сервере, используя Thunderbird и протокол imap.
Для настройки постфикса я следовал этому руководству: https://help.ubuntu.com/community/PostfixBasicSetupHowto но вместо этого использует Maildir.
Dovecot настроен следующим образом:
https://www.linuxbabe.com/mail-server/secure-email-server-ubuntu-16-04-postfix-dovecot https://help.ubuntu.com/community/Dovecot
Дополнительно я установил fail2ban
, который успешно прошел испытания.
Следующий шаг - фильтрация электронной почты. Следующий https://help.ubuntu.com/lts/serverguide/mail-filtering.html.en получилось красиво. Spamassassin блокирует весь спам. Но на самом деле я не хочу его блокировать, я просто хочу, чтобы spamassassin пометил его как спам и чтобы спам перенаправлялся в мою папку для спама. Это на тот случай, если будет отфильтровано что-то, что не было спамом.
Для этого я установил /etc/amavis/conf.d/21-ubuntu_defaults
:
$final_spam_destiny = D_PASS;
и добавляется тема **** СПАМ ****
Следующим шагом будет то, что dovecot автоматически переместит это письмо в мою папку нежелательной почты. И тут я застреваю. Я последовал этому руководству: https://workaround.org/ispmail/stretch/filtering-out-spam-with-rspamd
и там часть «Отправка спама в папку нежелательной почты». Но не работает. Я видел, что сито не работает для imap. Но я не могу найти никакого учебника или руководства по imap_sieve, которое решило бы мою проблему. У кого-нибудь из вас есть идея? Я также не нашел ни одной записи в журнале, где я мог бы видеть, что сито работает (или нет)?
Проблема, с которой вы столкнулись, заключается в порядке выполнения сита. Вы должны переименовать правило плагина из after
к before
plugin {
sieve_plugins = sieve_imapsieve sieve_extprograms
imapsieve_mailbox1_name = INBOX
imapsieve_mailbox1_before = file:/etc/dovecot/sieve/default.sieve
sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
}
Тогда ваши сообщения будут обработаны default.sieve
и остановился перед нормальной доставкой, если *SPAM*
узор присутствует в теме.
Я настоятельно рекомендую использовать такие имена, как before1.sieve
вместо того default.sieve
для sieve_before, потому что default.sieve
имеет особое значение. Также было бы гораздо лучше добавить к сообщению специальный заголовок, например X-SPAM-DETECTED
вместо предметных манипуляций.
ОБНОВИТЬ
Вот мое полное решение. Я использовал exim
для MTA и dovecot
для доставки / рассева
exim
есть ACL, вызывающий spamassassin
для расчета оценки за сообщение.
Если оценка превышает пороговое значение, добавляются два настраиваемых заголовка:
acl_data:
warn spam = spamd
condition = ${if >{$spam_score_int}{49}}
add_header = X-Spam-Score: $spam_score_int
add_header = X-Spam-Ooops: Detected
accept
Затем маршрутизатор передает сообщение транспорту:
local:
driver = accept
condition = <some site specific code>
transport = dovelda
Транспорт очевиден:
dovelda:
driver = pipe
user = mailnull
command = /long/path/deliver -d $local_part@$domain -f $sender_address
envelope_to_add
return_path_add
delivery_date_add
log_output
deliver
полагаться на конфигурацию голубятни:
plugin {
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
sieve_pipe_bin_dir = /usr/local/etc/dovecot
## Two sieves only - common and personal
sieve_before = /long/path/common.sieve
sieve_dir = /var/mail/%d/%n
sieve = /var/mail/%d/%n/user.sieve
. . . . . . .
}
common.sieve
довольно просто:
####
require "fileinto";
require "variables";
require "imap4flags";
if exists "X-Spam-Ooops"
{
fileinto "Junk";
stop;
}
elsif anyof (header :contains "From" "postmaster@")
{ ## postmaster's message should be delivered at any cost
setflag "flagvar" "\Flagged";
fileinto :flags "${flagvar}" "INBOX";
stop;
}
else
{
## Trigger to launch the next script in the sequence
keep;
}
####
Вот и все. Любое сообщение с рейтингом выше разрешенного будет отмечено X-Spam-Ooops
заголовок и попал в пользовательский Junk
подпапка.
Решил проблему другим подходом. Может быть, не лучшее решение, но у меня работает. Реализую incronetab, который срабатывает, как только в maildir появляется новое письмо.
`/home/myuser/Maildir/new/ IN_CREATE python3.6 /var/lib/SpamControl.py $@ $#`
SpamControl.py выглядит следующим образом:
import subprocess
import sys
import time
time.sleep(0.5)
path = sys.argv[1]
file = sys.argv[2]
base_path = path[0:len(path)-4]
new_path = base_path + "cur/"
new_file = file + str(r'\:2\,')
full_path = new_path + new_file
command = "head -n 50 " + full_path
e_mail = subprocess.check_output([command], shell=True)
e_mail = e_mail.decode('ascii')
e_mail = e_mail.splitlines()
spam = False
for iterator in range (0, len(e_mail)):
if "X-Spam-Flag: YES" in e_mail[iterator]:
spam = True
if spam is True:
new_path = base_path + "/.Junk/cur/" + new_file + "S"
command = "mv " + full_path + " " + new_path
subprocess.check_output([command], shell=True)
Время ожидания необходимо, потому что dovecot тем временем перемещает почту с новой на текущую. Код недостаточно быстр, чтобы делать что-то еще, пока все в новинку.
в остальном мой код проверяет, есть ли в электронном письме флаг спама, и если да, он перемещает его в папку нежелательной почты пользователя. Способ чтения электронной почты немного необычен, но из-за символа «/» в имени письма мне было очень трудно прочитать его напрямую. Я добавляю букву «S» в конце имени файла, когда перемещаю его в корзину, чтобы он был помечен как прочитанный. Тогда thunderbird меня новой почтой там не беспокоит.
Пожалуйста, не стесняйтесь комментировать.
Я немного продвинулся в своей проблеме:
Установив conf.d / 10-logging.conf
mail_debug = yes
и conf.d / 90-sieve.conf
sieve_plugins = sieve_imapsieve
sieve_global_dir = /etc/dovecot/sieve/`
а также в:
conf.d / 90-plugin.conf `
plugin {
sieve_plugins = sieve_imapsieve sieve_extprograms
imapsieve_mailbox1_name = INBOX
imapsieve_mailbox1_after = file:/etc/dovecot/sieve/default.sieve
sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
}
и sieve / default.sieve: `
require ["fileinto", "mailbox", "imap4flags"];
if header :contains "subject" ["*SPAM*"] {
setflag "\\Seen";
#setflag "\\Deleted";
fileinto :create "Junk";
stop;
}
а также компиляция sievec sieve/default.sieve
Я сделал так, что нежелательная почта копируется в папку нежелательной почты. Но, к сожалению, почта остается в папке «Входящие». Вроде просто скопировали?