Limpando pastas de correio com tarefa Cron

0

SpamAssassin tem um recurso para "aprender" spam. Cada usuário tem uma pasta .spam em sua pasta de e-mail e será instruído a mover qualquer spam para essa pasta. (Os usuários estão usando o IMAP.) Eu configurei uma tarefa do cron para alimentar o conteúdo da pasta .spam de cada conta em sa-learn .

02 02 * * * sa-learn -p ~/.spamassassin/user_prefs --spam ~/mail/*/*/.spam/{cur,new} 

Isso funciona como previsto, de acordo com o e-mail de confirmação do cron.

Agora desejo autodefinir o conteúdo das pastas .spam na conclusão bem-sucedida do comando sa-learn. Estou correto em pensar que posso adicionar o seguinte ao final da tarefa cron acima?

&& rm ~/mail/*/*/.spam/{cur,new}

Isso parece correto?

Notas: isso está sendo testado para uso em várias contas de revenda de cPanel. Eu não tenho acesso ao shell.

Atualização 1 após a resposta de Celada e os comentários abaixo:

The way you need to do this is to atomically move each message to a different directory which you control and which the IMAP server doesn't touch, then process and delete it from within that location. Fortunately you are using Maildir which permits such atomic moves.

Que tal

mkdir -p /tmp/sa_tmp 
  && mv ~/mail/*/*/.spam/{cur,new} /tmp/sa_tmp
  && sa-learn -p ~/.spamassassin/user_prefs --spam /tmp/sa_tmp
  && rm -rf /tmp/sa_tmp

Estou deliberadamente não usando mktemp para que, se um diretório for deixado para trás, ele seja excluído na próxima execução.

Atualização 2 após o comentário de xhienne:

Not sure moving the directories cur and new is a good idea => move their content instead. Moreover, there will be a name collision since you are moving many directories named new and cur to the same destination.

Não sei como evitar colisões de nomes de arquivo.

Finally, moving to /tmp might mean moving to another partition, with the incurred extra-I/Os and the possibility of lacking disk space (/tmp is sometimes a small separate partition) => preferably, move to a special folder like ~/mail/.sa-learn that you can delete in the end

mkdir -p ~/mail/.sa-learn 
  && mv ~/mail/*/*/.spam/{cur,new}/* ~/mail/.sa-learn
  && sa-learn -p ~/.spamassassin/user_prefs --spam ~/mail/.sa-learn
  && rm -rf ~/mail/.sa-learn

Atualização 3 :

Acho que isso não funciona se a pasta new não existir. Estou com erro:

mv: cannot stat '/home/username/mail/*/*/.spam/new/*': No such file or directory

Não parece haver nenhuma opção de "ignorar" para mv . Alguma idéia?

    
por Transistor 08.01.2017 / 21:58

1 resposta

1

Sua solução proposta é atrevida. Como não é possível garantir que nenhum novo e-mail seja adicionado (ou, por esse motivo, excluído ou alterado) enquanto sa-learn estiver em execução ou entre executar sa-learn e rm , muitas coisas empolgantes e infelizes podem acontecer, a maioria É óbvio que você pode excluir e-mails sem alimentá-los com sa-learn .

A maneira que você precisa fazer isso é mover atomicamente cada mensagem para um diretório diferente que você controla e que o servidor IMAP não toca, então processe e apague-a de dentro daquele local. Felizmente você está usando o Maildir, que permite tais movimentos atômicos.

    
por 08.01.2017 / 22:07