Dovecot imap envia spam para lixo

1

Estou usando

  • Ubuntu 18.04 64 bit
  • dovecot 2.2.33.2
  • spamassassin 3.4.1
  • amavisd

O objetivo é executar um servidor de e-mail, o qual já consegui. Eu posso acessar os e-mails no servidor usando o Thunderbird e o protocolo imap.

Para a configuração do postfix, segui este tutorial: link , mas usando o Maildir.

O Dovecot foi configurado seguindo:

link link

Além disso, instalei fail2ban , que foi testado com sucesso.

O próximo passo é a filtragem de email. Após o link funcionou muito bem. Spamassassin está bloqueando todo o spam. Mas agudamente eu não quero bloqueá-lo, eu só quero que o spamassassin marque isso como spam e que o spam seja redirecionado para minha pasta de spam. Isso é apenas no caso de algo ser filtrado que não seja spam.

Para isso, defino /etc/amavis/conf.d/21-ubuntu_defaults :

$final_spam_destiny       = D_PASS;

e o sujeito é adicionado **** SPAM ****

O próximo passo é que o dovecot move automaticamente este e-mail para minha pasta de lixo eletrônico. E aí eu fico preso. Eu segui este tutorial: link

e ai a parte "Enviando spam para a pasta Junk". Mas isso não funciona. Eu vi que a peneira não está funcionando para o imap. Mas não consigo encontrar nenhum tutorial ou manual no imap_sieve, isso resolveria o meu problema. Alguém tem uma ideia? Eu também não encontro nenhuma entrada de log onde eu possa ver que a peneira está funcionando (ou não)?

    
por Marc 17.08.2018 / 12:17

3 respostas

0

Eu fui um pouco mais longe no meu problema:

Definindo conf.d / 10-logging.conf

mail_debug = yes

e conf.d / 90-sieve.conf

sieve_plugins = sieve_imapsieve
sieve_global_dir = /etc/dovecot/sieve/'

assim como em:

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
}

e peneira / default.sieve: '

 require ["fileinto", "mailbox", "imap4flags"];
 if header :contains "subject" ["*SPAM*"] {
    setflag "\Seen";
    #setflag "\Deleted";
    fileinto :create "Junk";
    stop;
}

bem como compilando por sievec sieve/default.sieve Eu consegui que o lixo eletrônico fosse copiado para a pasta de lixo. Mas infelizmente o e-mail também fica na caixa de entrada. Parece que acabou de ser copiado?

    
por 17.08.2018 / 23:20
0

Eu resolvi o problema por outra abordagem. Talvez não seja a melhor solução, mas funciona para mim. Eu implemento um incronetab, que é acionado, assim que houver um novo e-mail no maildir.

'/home/myuser/Maildir/new/ IN_CREATE python3.6 /var/lib/SpamControl.py $@ $#'

O SpamControl.py se parece com o seguinte:

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)

O tempo de espera é necessário, porque o dovecot move o correio no meio do tempo novo para o destino. O código não é rápido o suficiente para fazer ot enquanto está tudo em novo.

o restante meu código verifica se o e-mail tem um sinalizador de spam e, em caso afirmativo, o move para a pasta Lixo do usuário. A maneira de ler no e-mail é um pouco incomum, mas devido ao "/" no nome do e-mail eu lutei muito para lê-lo diretamente. Eu adiciono "S" no final do nome do arquivo, quando eu movo para o lixo para que ele seja marcado como lido. Então o thunderbird não me incomoda com um novo email lá.

Por favor, sinta-se livre para comentar.

    
por 19.08.2018 / 18:17
0

O problema que você enfrentou está na ordem de execução da peneira. Você precisa renomear a regra de plug-in de after para 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
}

Em seguida, suas mensagens serão processadas por default.sieve e serão interrompidas antes da entrega normal se *SPAM* padrão estiver presente no assunto.

Meu strong conselho é usar o nome como before1.sieve em vez de default.sieve para sieve_before porque default.sieve tem um significado especial. Também seria muito melhor adicionar algum cabeçalho especial à mensagem como X-SPAM-DETECTED em vez de manipulações de assunto.

UPDATE

Aqui está minha solução completa. Eu usei exim para o MTA e dovecot para entrega / peneiramento

exim tem uma ACL que invoca o spamassassin para calcular a pontuação da mensagem.
Dois cabeçalhos personalizados são adicionados se a pontuação estiver acima do limite:

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

Em seguida, o roteador passa a mensagem para o transporte:

local:
    driver      = accept
    condition   = <some site specific code>
    transport   = dovelda

O transporte é óbvio:

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 depende da configuração do dovecot:

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 é bem simples:

####
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;
}
####

Isso é tudo. Qualquer mensagem com pontuação acima permitida será marcada pelo cabeçalho X-Spam-Ooops e colocada na subpasta Junk do usuário.

    
por 31.08.2018 / 11:19