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

4 dicembre 2020 by Roberto Puzzanghera 2 commenti

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.

Se si vogliono cancellare i messaggi delle cartelle Junk e Trash che sono più vecchi di 60 giorni si può settare il namespace in questo modo nel file 15-mailbox.conf:

namespace {
  mailbox Junk {
    special_use = \Junk
    auto = subscribe
    autoexpunge = 60d
  }

  mailbox Trash {
    special_use = \Trash
    auto = subscribe
    autoexpunge = 60d
  }
}

Quando dico "più vecchi di 60 gioirni" intendo i messaggi che sono stati spostati nella cartella Junk o Trash almento 60 giorni fa, non i messaggi salvati nella Inbox 60 giorni fa e spostati in Junk o Trash oggi.

Nel caso si abbia la necessità di agire in modo diverso sulle singole caselle di posta, dare un occhiata a questo script di Tony Fung.


Lascio intatto quanto segue per coloro che non sono soddisfatti del metodo illustrato sopra e preferiscono utilizzare uno script bash e un cronjob. Coloro che invece hanno deciso di settare autoexpunge possono passare alla pagina successiva.

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. 

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
#

# Config and executables path  
VPOPMAIL_MYSQL_CONFIG="/home/vpopmail/etc/vpopmail.mysql"  

# mysql bin
MYSQL=$(which mysql)

# Extract mysql params  
HOST=$(sed -n "/#/! s/^\(.*\)|.*|.*|.*|.*/\1/p" $VPOPMAIL_MYSQL_CONFIG)  
PORT=$(sed -n "/#/! s/^.*|\(.*\)|.*|.*|.*/\1/p" $VPOPMAIL_MYSQL_CONFIG)  
USER=$(sed -n "/#/! s/^.*|.*|\(.*\)|.*|.*/\1/p" $VPOPMAIL_MYSQL_CONFIG)  
 PWD=$(sed -n "/#/! s/^.*|.*|.*|\(.*\)|.*/\1/p" $VPOPMAIL_MYSQL_CONFIG)  
  DB=$(sed -n "/#/! s/^.*|.*|.*|.*|\(.*\)/\1/p" $VPOPMAIL_MYSQL_CONFIG) 

# 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 https://notes.sagredo.eu/files/qmail/dovecot_expunge/dovecot_expunge-cb
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

Re-iter di vpopmail

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.

Rispondi |

grazie per il contributo!

grazie per il contributo!

Rispondi |

Ultimi commenti
Vedi anche...
Articoli recenti

RSS feeds