Cancellare i vecchi messaggi dalla cartella Spam e dal cestino con dovecot

Maggiori informazioni qui: http://wiki2.dovecot.org/Plugins/Expire

Naturalmente vogliamo cancellare i vecchi messaggi di spam e pulire ogni tanto anche il cestino di tutti gli utenti, al fine di gestire al meglio lo spazio disco. Per far questo, con dovecot 2.0, non è necessario abilitare l'expire-plugin, a meno che non si debba gestire un server molto grande, in tal caso sarà bene abilitarlo in accoppiamento con il servizio dictionary, salvando così i timestamp in un database.

Questo comando

doveadm expunge -A mailbox Junk savedbefore 60d

farà una connessione al userdb, sql/MySQL nel nostro caso, e un ciclo su tutte (opzione -A) le mailbox degli utenti più vecchie di 60 giorni. Quando dico "più vecchie di 60 gioirni" intendo i messaggi che sono stati spostati nella cartella Junk almento 60 giorni fa, non i messaggi salvato nella Inbox 60 giorni fa e spostati in Junk oggi.

Sarà sufficiente creare uno script bash del genere

> nano /usr/local/dovecot/etc/dovecot_expunge.sh

#!/bin/bash
#
DOVEADM="/usr/local/dovecot/bin/doveadm";

$DOVEADM expunge -A mailbox Trash savedbefore 90d
$DOVEADM expunge -A mailbox Junk  savedbefore 60d

assegnargli i privilegi di esecuzione

chmod +x /usr/local/dovecot/etc/dovecot_expunge.sh

e lanciarlo via cronjob una volta al mese o quando si vuole

> crontab -e

# dovecot delete spam & trash
#minute hour mday month wday command
40 3 12 * * /usr/local/dovecot/etc/dovecot_expunge.sh

Cosa fare nel caso si utilizzi il vecchio driver vpopmail per l'autenticazione

Sfortunatamente, le API di vpopmail non sembrano supportare delle funzionalità del genere. Fortuna vuole che Costel Balta ha proposto una eccellente soluzione in questo commento. Puoi scaricare il suo script  qui.

#!/bin/bash
#
# Author: Costel Balta
# Slightly modified by Roberto Puzzanghera
#

# MySQL details
HOST="mysql-server-IP";
USER="vpopmail";
PWD="vpopmailpassword";
MYSQL="/usr/local/mysql/bin/mysql";
# dovecot details
DOVEADM="/usr/local/dovecot/bin/doveadm";

# Output sql to a file that we want to run
echo "USE vpopmail; select concat(pw_name,'@',pw_domain) as username from vpopmail;" > /tmp/query.sql;

# Run the query and get the results (adjust the path to mysql)
results=`$MYSQL -h $HOST -u $USER -p$PWD -N < /tmp/query.sql`;

# Loop through each row
for row in $results
        do
        echo "Purging $row Trash and Junk mailbox..."
        # Purge expired Trash
        $DOVEADM -v expunge mailbox Trash -u "$row" savedbefore 90d
        # Purge expired Junk
        $DOVEADM -v expunge mailbox Junk  -u "$row" savedbefore 60d
done

Questo script esegue una query mysql selezionando tutti gli utenti dal database vpopmail, ne salva i risultati in una variabile e itera sulle mailbox di tutti gli utenti cancellando le vecchie email dal cestino e dalla cartella Junk. Poichè questo script contiene i parametri di accesso a mysql deve essere lanciato come root e concedere solo a root i privilegi.

Se si vuole evitare di ricevere le notifiche di quanto fatto da doveadm nella casella postmaster, cancellare la riga che inizia con echo, soprattutto se si hanno milioni di utenti.

cd /usr/local/dovecot/etc
wget http://notes.sagredo.eu/sites/notes.sagredo.eu/files/qmail/dovecot_expire
mv dovecot_expire dovecot_expire.sh
chown root.root dovecot_expire.sh
chmod 0700 /usr/local/dovecot/etc/dovecot_expire.sh

Lanciare lo script una volta al mese o ogni quanto si vuole come un cronjob

> crontab -e

# dovecot delete spam & trash
#minute hour mday month wday command
40 3 12 * * /usr/local/dovecot/etc/dovecot_expire.sh

Commenti

Ciao Roberto, innanzitutto complimenti per l'ottima guida dettagliata e esplicativa ti scrivo per proporti un'alternativa nel reitero selettivo di vpopmail su tutti gli utenti di un particolare dominio:

#!/bin/sh
#
PATH=~vpopmail/bin:/usr/bin:/bin:/usr/local/bin
DOMAIN=${1:?No domain specified}
for USER in `vuserinfo -n -D $DOMAIN`
do
         #doveadm -v quota recalc -u $USER@$DOMAIN
         #doveadm index -u $USER@$DOMAIN INBOX
         doveadm fts optimize -u $USER@$DOMAIN
         #doveadm fts rescan -u $USER@$DOMAIN
         #doveadm -Dv search -u $USER@$DOMAIN mailbox INBOX savedbefore 365d
done

Ho inserito alcune istruzioni specifiche di dovecot.

grazie per il contributo!