LINUX.ORG.RU
решено ФорумAdmin

dovecot-lda и .Junk: положить подозрительное письмо в спам.

 , , lda,


1

1

Всем доброго дня. Имеется связка exim + dovecot + lda + SA. Нужно, чтобы все, что набирает больше определенного числа балов в SA и меньше критического, при достижении которого письмо просто удаляется ложилось в папку Junk. Делаем по инструкции:

begin routes
...
spam_to_user:
    driver = accept
    condition     = ${if and {{>{$spam_score_int}{20}}{<{$spam_score_int}{80}}}{yes}{no}}
    domains     = !+local_domains
    transport = user_spam_delivery
...
begin transports
...
user_spam_delivery:
    driver = pipe
    command = /usr/lib/dovecot/dovecot-lda -e -m "Junk|${substr_1:$local_part_suffix}" -d $local_part@$domain -f $sender_address -a $original_local_part@$original_domain
    message_prefix =
    message_suffix =
    delivery_date_add
    envelope_to_add
    return_path_add
    return_fail_output
    log_output
    umask = 077
    group = 8
    user = 106
    temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78
...

Письмо все равно кладется во входящие.

Решение: пишем глобальный скрипт для sieve, компилим с помощью sievec, даем права (у меня Debian-exim:mail), прописываем в 90-sieve.conf:

sieve_before путь_к_скрипту.sieve

Сам скрипт:

require ["fileinto"];
# rule:[spam]
if header :contains "Subject" "*****SPAM*****"
{
        fileinto "Junk";
        stop;
}
★★★★★

А что, по каким-то причинам нельзя подключить sieve и написать сколь угодно гибкие глобальные правила?

zgen ★★★★★ ()
Ответ на: комментарий от zgen

Понял что ты имеешь ввиду.

Исправил в exim.conf

begin routes
...
spam_to_user:
    driver = accept
    condition     = ${if and {{>{$spam_score_int}{20}}{<{$spam_score_int}{80}}}{yes}{no}}
    domains     = !+local_domains
    transport = dovecot_delivery

т.е. ходить вместе со всей почтой через один транспорт, нерабочий транспорт закоментил.

Пилим dovecot. /etc/dovecot/conf.d/90-sieve.conf:

sieve_global_dir = /etc/dovecot/conf.d/sieve

Создал директорию, выдал ей права, создал правило:

require ["fileinto"];
# rule:[SPAM]
if header :contains "Subject" "**SPAM**"
{
        fileinto "Junk";
}

Скомпилил с помощью sievec, перезапустил dovecot и exim. Не работает.

leg0las ★★★★★ ()
Последнее исправление: leg0las (всего исправлений: 4)
Ответ на: комментарий от leg0las

запускай dovecot-lda, указывай пользователя и давай ему на вход письмо - смотри в лог, что пишет.

УМВР.

Может у тебя вообще dovecot-lda не запускается - наворотил в конфиге непонятно чего.

zgen ★★★★★ ()
Последнее исправление: zgen (всего исправлений: 1)
Ответ на: комментарий от zgen

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

дабы не быть голословным:

dovecot_delivery:
    driver = pipe
    command = /usr/lib/dovecot/dovecot-lda -e -d $local_part@$domain -f $sender_address -a $original_local_part@$original_domain
    message_prefix =
    message_suffix =
    delivery_date_add
    envelope_to_add
    return_path_add
    return_fail_output
    log_output
    umask = 077
    group = 8
    user = 106
    temp_errors = 64 : 69 : 70: 71 : 72 : 73 : 74 : 75 : 78
leg0las ★★★★★ ()
Последнее исправление: leg0las (всего исправлений: 1)

У меня без

lda_mailbox_autocreate = yes
в свое время не хотело работать (несмотря на то что папка Junk была в наличии у пользователей).

strangeman ★★★★ ()
Последнее исправление: strangeman (всего исправлений: 1)
Ответ на: комментарий от leg0las
sieve-test sieve-file mail-file

Пошлите спам-письмо (XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X например), натравите на него sieve-test после получения, да посмотрите.

strangeman ★★★★ ()
Ответ на: комментарий от strangeman
Performed actions:

 * store message in folder: Junk

Implicit keep:

  (none)

sieve-test(root): Info: final result: success

В Junk ничего не появляется.

Правило, созданое в roundcube и лежащее в ~/sieve - работает, в Junk перемещает.

leg0las ★★★★★ ()
Последнее исправление: leg0las (всего исправлений: 1)
Ответ на: комментарий от leg0las

Оно и не появится, это ж тест просто. Ну значит с sieve-файлом все в порядке. Включайте логи dovecot и смотрите в них, скорее всего где-то в нем проблема.

strangeman ★★★★ ()
Ответ на: комментарий от strangeman

В логах одно:

Отправляю спамовое письмо:

Info: sieve: msgid=<...>: stored mail into mailbox 'INBOX'

Включаю фильтр в roundcube, шлю со «спамовой» темой, которая в правиле:

Info: sieve: msgid=<...>: stored mail into mailbox 'Junk'

Такое ощущение, что правило вообще игнорится. Нашел кстати опцию, позволяющее включить дефолтное правило независимо от юзера в 90-sieve.conf:

sieve_default = /etc/dovecot/conf.d/sieve/spam.sieve

Все равно не жрет. Пермишены выданы нормально, сравнил с пермишенами на юзерское правило в ~/

leg0las ★★★★★ ()
Ответ на: комментарий от zgen

Скормить ему уже доставленное письмо? или как?

leg0las ★★★★★ ()
Ответ на: комментарий от strangeman

А не, увидел что sieve_default прописано. Я правда еще в sieve_before прописывал его на всякий случай.

strangeman ★★★★ ()
Ответ на: комментарий от strangeman
# doveconf | grep -i sieve
managesieve_client_workarounds = 
managesieve_implementation_string = Dovecot Pigeonhole
managesieve_logout_format = bytes=%i/%o
managesieve_max_compile_errors = 5
managesieve_max_line_length = 65536
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date ihave
  sieve = ~/.dovecot.sieve
  sieve_default = /etc/dovecot/conf.d/sieve/spam.sieve
  sieve_dir = ~/sieve
  sieve_max_actions = 32
  sieve_max_redirects = 8
  sieve_max_script_size = 1M
protocols = imap sieve
service managesieve-login {
  executable = managesieve-login
  inet_listener sieve {
  protocol = sieve
service managesieve {
  executable = managesieve
  protocol = sieve
  unix_listener login/sieve {
  mail_plugins = " quota sieve"
protocol sieve {
  managesieve_implementation_string = Cyrus timsieved v2.2.13
  managesieve_logout_format = bytes=%i/%o
  managesieve_max_compile_errors = 5

простыня чуть позже будет.

leg0las ★★★★★ ()
Ответ на: комментарий от leg0las

Воот. Есть у меня подозрение, что sieve_before поможет, т.к. sieve_default выполняется только если нету пользовательских скриптов. А они наверняка есть от roundcube.

Пропишите

sieve_before = /etc/dovecot/conf.d/sieve/spam.sieve

в конфиг 90-sieve.conf (или где оно там у вас).

strangeman ★★★★ ()
Ответ на: комментарий от strangeman

В начале темы описал решение. Может кому-то пригодится. Честно говоря не думал, что из-за директивы before, точнее ее отсутствия работать не будет. Кстати, проверил - директива sieve_default теперь не нужна - работает и без нее.

leg0las ★★★★★ ()
Ответ на: комментарий от leg0las

Честно говоря не думал, что из-за директивы before, точнее ее отсутствия работать не будет.

Это прямо в конфиге написано: :)

# The default Sieve script when the user has none. This is a path to a global
# sieve script file, which gets executed ONLY if user's private Sieve script
# doesn't exist.
Be sure to pre-compile this script manually using the sievec
# command line tool.
# --> See sieve_before for executing scripts before the user's personal
# script.

sieve_default = /etc/dovecot/sieve/default.sieve


# Path to a script file or a directory containing script files that need to be
# executed before the user's script.
If the path points to a directory, all
# the Sieve scripts contained therein (with the proper .sieve extension) are
# executed. The order of execution within a directory is determined by the
# file names, using a normal 8bit per-character comparison. Multiple script
# file or directory paths can be specified by appending an increasing number.
sieve_before = /etc/dovecot/sieve/default.sieve

strangeman ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.