Назад | Перейти на главную страницу

Dovecot imap отправляет спам в утиль

Я использую

Цель - запустить почтовый сервер, чего я уже добился. Я могу получить доступ к электронной почте на сервере, используя 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 Я сделал так, что нежелательная почта копируется в папку нежелательной почты. Но, к сожалению, почта остается в папке «Входящие». Вроде просто скопировали?